[GeoServer] WMS 에 GetFeatureInfo 요청이 되는 이유는 뭘까? (feat. GeoReference)

식빵·2023년 3월 11일
0

Geoserver

목록 보기
5/5
post-thumbnail

주의!

2023-03-12 추가글
음... 이 글은 ChatGPT 를 한창 신봉하던 때의 제가 쓴 겁니다.
하지만 실제로 계속 사용하다보니, ChatGPT 가 말을 지어내거나,
그럴듯하게 말을 만들어 내는 경우가 상당히 많더군요.
이 글에 나오는 것들을 너무 신용하지마시기 바랍니다.



이 글은 저의 삽질(⛏️)을 여실히 보여주는 글입니다.
변명하자면 GIS 를 혼자서 독학으로 하다 보니 많이 헤메서 이런 거 같네요 😅
그냥 깔끔한 답변만을 원하면 이 링크 를 참조해주세요. 충분히 이해가 될 겁니다.
굳이 시간내서 이 긴 글을 읽을 필요는 없습니다.


🙄 이미지에서 좌표를 알아낸다고요?

GeoServer 를 공부하면서 헷갈리는 게 하나 생겼습니다.
GeoServer 공식 사이트에서 제공하는 WMS reference 를 읽다가 생긴 의문점입니다.

일단 래퍼런스 맨 첫 부분에서 WMS 에 대한 소개와 간략한 정의를 제시합니다.

위의 내용은 Geoserver 공식 문서에 있는 내용입니다.
보시면 알겠지만, WMSgeoreferenced map imagesHTTP 요청을 통해서 받는 OGC 가 정한 표준 Http Interface 명세입니다.

저는 여기서 WMS = "Map Image" 구나! 하고 단순하게 생각하고 넘어갔습니다.
그런데 쭉 읽다가 이런 게 보였습니다.

"WMS 는 단순히 "이미지"를 제공하는데, 해당 이미지 상에 그려진 Feature 에
대한 정보를 읽을 수가 있다고? 그냥 이미지인데 이게 어떻게 가능하지?" 라는
의문점이 생겼습니다.

혹시 아직 제 의문점이 공감이 안되시나요?
그러면 아래와 같은 예를 생각해봅시다.

우리가 밖에서 나무 하나를 사진으로 찍고, 그걸 SNS 에 올렸다고 가정해보겠습니다.
그런데 이후 누군가가 SNS 상에 있는 나무 이미지를 보면서...

"이 나무는 서울에 있는 탐산 타워 밑의 남쪽 100m, 동쪽 125.1m 에 있는 거야!"
"이 나무에는 내가 오래전에 칼로 자국을 남긴 적이 있어!"

... 라고 말할 수 있을까요?

이미지만 보고 위치(좌표) 정보와 그 나무의 특성(혹은 속성)에 대해 알아낸다고요?
단순히 이미지만 보고 그게 가능하진 않을 거예요. 그쵸?





👍 답은 GeoReference

그래서 뭔가 빼먹었나 싶어서 다시 문서를 읽어 봤습니다.
그리고 곧 제가 중요한 표현을 하나 빼먹었다는 걸 알아차립니다.

바로 georeferenced 입니다!
자 이 표현에 대해서 ChatGPT 에게 한번 물어보면 아래와 같은 대답을 해줍니다.

그렇습니다! GeoServer 가 뱉어내는 이미지는 단순한 이미지가 아닙니다.
이 이미지는 GeoReferencing 처리가 된 지도 이미지입니다!
이런 이미지들은 이미 좌표 정보가 내장되어 있다는 뜻입니다.

georeferenced Map Image 를 기반으로 WMS GetFeature 같은 공간좌표 정보가 필요로
하는 조회 기능도 가능하다는 걸 알 수 있습니다.

좌표정보만 정확히 알고 있으면 지도 이미지를 생성해준 Data Source 에게 해당 좌표에
매칭되는 Feature 정보를 읽어오는 건 쉬울테니까 말이죠.





🙄 GeoReference 의 결과물인 World File 어디에?

테스트

OpenLayers 같은 지도관련 라이브러리를 사용하다보면 WMS 의 GetMap 서비스를
호출하여 지도 이미지를 받는 경우가 많습니다.

그리고 이 서비스의 결과 포맷으로는 주로 JPEG 또는 PNG 를 받습니다.
이에 더해서 이미지 위에서 클릭을 하면 실제 Feature 정보를 받을 수도 있습니다.

그렇다면 JPEG, PNG 도 GeoReference 가 된걸까요?
일단 JPEG, PNG 파일도 GeoReference 처리가 되는지 부터 알아보기 위해서
ChatGPT 선생님에게 아래와 질문을 해봤고 답변도 받았습니다.

World File! 이런 게 있었군요! 이 말에 의하면 PNG, JPEG 파일에 직접적인 영향은
주는 게 아니라, World File 이라는 것을 완전히 따로 제공하는 걸로 이해가 됩니다.

정말인지 테스트해보죠?
GeoServer 의 Layer Preview 메뉴의 OpenLayers 조회 기능을 켜봤습니다.

테스트 방법:
➔ Chrome 개발자 도구 ➔ Network 탭 ➔ 페이지 캐시 비우면서 새로고침
➔ Type 확인 ➔ 어디에도 World 파일이 보이지 않습니다!



ChapGPT 에게 물어보기

이상해서 ChatGPT 선생님에게 재차 질문을 해봤습니다.
지금부터... ChatGPT 의 미쳐버린 능력을 같이 감상하시죠.

여기서부터는 정말 ChatGPT 가 정확한 정보를 주는지는 저도 확신이 없습니다.
하지만 지금 제 상태에서는 믿는 수 밖에 없네요 🙄



ChatGPT Q&A 요약

요약하자면 이렇습니다.

  • Client(ex: OpenLayers)는 GetMap 을 통해서 다양한 파라미터 정보를 보내게 된다.
    • 이때 반드시 layer 명과 bbox 정보를 함께 보내야 한다. 반드시.
  • GeoServer 는 Client 에게 받은 파라미터를 기반으로 내부적으로 2개의 파일을 생성한다.
    • JPEG, PNG : Client 에게 돌려줄 일반적인 이미지 파일
    • World File :
      • 공간정보를 담는 파일,
      • 파라미터로 들어온 layer 명과 bbox 를 통해서 Geoserver 의 연산을 거쳐서 생성
  • 생성된 2개의 파일 중 Client 에게는 이미지 파일만 돌려준다
  • 나머지 World File 은 GeoServer 내부적으로 보관한다.
  • 이후에도 GetMap 요청이 오면 만든 World File 을 사용하게 된다.



World File 과 무관한 GetFeature ?!

그런데... 이렇게 기껏 만든 World File 은 결국 GetFeature 에서는 사용되지 않습니다.

허어...


결론은... GeoReference 의 결과물인 World File 은 GetMap 요청, 즉 이미지 생성과
관련해서만 사용되며, GetFeature 요청에는 사용되지 않음을 알 수 있습니다.

그렇다면 단순 이미지에서 어떻게 좌표정보를 알아낸 걸까요?

  • 생각해보니 GetMap 요청을 보낼 때 수 많은 파라미터 정보를 보내니 이게 가능하겠군요.
  • 참고로 2번째 문단에서 "이 때 클라이언트는..." 이라는 말이 나옵니다.
    이 클라이언트는 우리가 흔히 아는 openLayers 같은 라이브러리라고 생각하면 됩니다.





👍 결론

완벽하게 정리된 건 아니지만 일단 제 나름대로 결론을 내리자면 아래와 같습니다.


GetMap 요청을 하면 GeoReference 처리가 일어난다.
다만 GeoTiff 같은 파일 처럼 GetMap 의 결과물인 JPEG, PNG 에
직접적으로 적용되는 게 아니며, World File 이라는 별개의 파일을
생성하여 GeoServer 내부적으로 저장합니다.

이후 똑같은 GetMap 요청이 다시 오면 이 파일의 정보를 이용해서 이미지가 정확한
위치에 랜더링 되는 것을 돕습니다.

GetMap 을 통해서 받은 이미지 자체가 이미 레이어 좌표계와
Width, Height, bbox 등의 정보를 기반으로 생성된 것이기 때문에,
이미지의 pixel 하나, 하나가 좌표로서 쓰일 수 있습니다.

즉 이미지 위의 특정 픽셀을 클릭하여 정확한 좌표를 읽어 낼 수 있다는 의미죠.
다만 이게 실제로는 계산이 필요한 작업인데, openlayers 같은 라이브러리를 쓰면
내부적으로 이런 복잡한 연산처리를 모두 해줍니다.

그 덕분에 openlayers 라이브러리를 쓰면서 지도 위의 특정 픽셀을 누르면
곧바로 해당 픽셀의 좌표를 정확히 계산하여 GetFeature 요청에 사용할 수 있게 된 겁니다.




🙄 추가로 생긴 궁금증

사실 GeoReferencing 이라는 개념이 많이 모자라서 현재 헤매는 느낌입니다.
게다가 GeoReferencing 에 의해서 생기는 World File 이 상당히 생소하고요.
아무래도 한번 GeoReferencing 에 대한 개념을 정리하는 글을 써봐야겠네요...
일단 이번글은 여기까지만 작성하겠습니다.



참고 링크

profile
백엔드를 계속 배우고 있는 개발자입니다 😊

0개의 댓글