[GIS] 카텍좌표로부터 GoogleMap 이미지 다운로드

2009년 2월 11일 변경된 구글지도서버의 내용을 반영해, 정상적으로 작동하도록 하였습니다. 소중한 정보를 제공해준 이사돌이님께 감사를 드립니다. E-Mail이나 블로그 링크를 공개하지 않으셔서 이 자리를 통해 감사의 말씀을 드립니다. 또한 소스까지 공개합니다. 아무쪼록 필요하신 분에게 도움이 되시길 바랍니다.

구글에서 제공하는 구글맵 OpenAPI에 대한 관심이 저를 제외하고 매우 뜨거웠던 모양입니다. 관심을 갖게된 배경은 회사에서 개발하고 있는 엔진에 다른 회사에서 제공하는 OpenAPI를 통해 제공하고 있는 지도를 적용해보면 어떨까 하는 생각에서 접근을 하게 되었습니다. 구글맵을 통해 OpenAPI를 접해보는 순간… 머리속에 하얗게 되는것을 느꼈습니다. 웹이라면 단순이 html 정도와 자바스크립트 그리고 근사한 이미지나 플래시로 치장하는게 전부라고 생각했기 때문입니다. OpenAPI는 많은 사람들에게 공개된 API인지라 사용하기가 매우 쉬웠습니다만, 개발자로써 내부적으로 어떻게 구현했느냐를 모르니 참… 우울해지더군요. 바로 자바스크립트 관련 책을 주문하고 OpenAPI와 AJAX와 같은 흐름을 대표하는 Web2.0에 찬찬히… 개발자로써 접근을 시도해 보고자 다짐하게 되었습니다.

뭐 여튼… 처음으로 돌아가, 원래의 목적을 완수하고 위해.. 구글맵을 엔진단에 통합하는 방법을 연구하던 중에, 그 중간 결과로 만든 것을 소개해 드릴겸해서 글을 작성합니다. 구글맵은 경도와 위도값을 주게 되면 그 지점에 대한 이미지를 던져주는데, 이 이미지의 크기는 256 x 256 입니다. 이 이미지를 타일이라고 합니다. 구글맵에는 해상도 레벨에 대한 개념이 있습니다. 1~18 단계로 되어 있고 1단계는 하나의 타일에 전세계가 보입니다. 18단계는 최대로 확대한 타일이미지로 18단계에 해당되는 타일의 개수는 엄청나겠지요. 이런 구글맵에서 제공하는 지도를 활용하기 위해서는 원하는 지점에 대한 타일을 얻는 것이 시발점이 됩니다. 그런데 문제는 이 원하는 지점을 어떤식으로 접근할 것이냐인데… 우리 나라 GIS계에서 사용하는 좌표계는 카텍입니다. 원래 카텍은 CNS 분야에서 사용하는 좌표계인데 원점이 하나인지라… 직각좌표계에서 경위도로 변경할때 원점을 고민할 필요가 없습니다. 바로 이 카텍 좌표를 이용해서 구글이 사용하는 경위도 좌표로 변환하고, 이 변환된 경위도 좌표를 구글맵 서버에게 넘겨줘서 해당 지점의 타일을 받아오면 됩니다.

먼저 구글맵은 WGS84 경위도 좌표계이고 우리나라에서 많이 사용하는 좌표계는 베셀 TM 직각좌표계의 원점을 하나로 한 카텍좌표계입니다. 먼저 경위도 좌표를 카텍과 같은 직각 좌표로 변환하는 방법과 그 반대로 변환하는 방법이 필요한데, 이 부분에 대한 방법은 gTrans라는 Visual Basic으로된 소스를 참고로 하여 작성을 하였습니다. 하지만 이 코드는 카텍좌표에 대한 언급이 전혀 없습니만… 타원체와 투영 그리고 변환공식 등에 대한 기본적인 내용을 숙지 하고 있다면 카텍 좌표계로의 변환은 그리 어렵지 않습니다. 비주얼 베이직으로 된것을 C++으 변환하는게 시간적으로 어려울 뿐이지요. 대학원때 GPS를 분석해보며 살펴봤던 좌표변환이 이제서야 큰 도움이 되더군요. 참고로 카텍 좌표계는 TM128이라고 하는데, 원래 우리나라에서 사용하는 TM 좌표계와 다른 점은 아래와 같고 다른 점은 모두 동일합니다.

central scale : 0.9998 or 0.9999
central meridian : E 128 00 00
Origin Latitude : N 38 00 00
False Easting (meters) : 400000
Falsle Northing (meters) : 600000

위의 내용은 http://blog.naver.com/azzuo/100037410143에서 참조했습니다. 위의 차이점을 활용해서 구글의 WGS84 경위도 좌표를 카텍좌표계로 변환하고 또 이 반대로 변환하는 코드를 작성하여 구글서버에 요청을 하여 타일을 받아오는 코드를 작성하였는데… 또 여기서 문제는 원하는 지점(카텍좌표)를 구글이 사용하는 경위도 좌표계로 변환을 하여 구글 서버에게 그 지점의 타일을 요청하는 url을 작성하는 것이 문제입니다. 이에 대한 것은 아래의 GoogleMap, How to Work라는 아티클을 참고하였습니다.

역시 인터넷은 바다입니다. 찾으면 있습니다… 이제 원하는 지점에 대한 타일요청 url을 알았으니 구글맵 서버로부터 쉽게 타일 이미지를 받아올 수 있지요. 이제 실제로 제가 만든 프로그램이 실행되는 모습을 말씀드리겠습니다.

먼저 요청할 지점입니다. 카텍 좌표로 만들어진 지도인데… 제주도와 서울의 여의도 그리고 꼬리 부분에 대한 이미지를 요청해 보겠습니다.

이 세 지점에 대한 좌표가 나타나 있습니다. 이 세 지점의 좌표는 ArcMap에 지도를 올려 놓고 얻었습니다. 이 좌표를 구글맵이 사용하는 WGS84 경위도 좌표계로 변환하고 타일을 요청하는 url을 만들어 구글맵 서버에 요청하면 되는데… 먼저 서울의 여의도 지점을 요청해 보겠습니다.

tstGoogle.exe라는 프로그램을 실행할때 인자로 카텍좌표계로써의 X, Y와 줌레벨(여기서는 13)을 주고 구글서버에게 받아 저장할 타일에 대한 파일명을 주고 실행을 하면 받은 타일에 대한 정보을 출력해주고.. “똥 싸는 중…”라는 메세지와 함께 타일이미지를 저장하게 됩니다. ^^; (최신버전에서는 얌전하게 Downloading으로 변경되었습니다) 아래는 요청해서 받은 타일이미지입니다.


여의도가 담긴 타일을 받았다는 것을 알 수가 있습니다. 이제 나머지 다른 지점에 대해서도 요청을 해서 이미지를 얻어올 수가 있습니다. 아래는 나머지 두 타일에 대한 요청 명령이고 받은 타일 이미지입니다.

tstGoogle.exe 265630 88249 11 d:/제주도.jpg
tstGoogle.exe 541018 385821 5 d:/꼬리.jpg

아래는 tstGoogle 프로그램입니다. 필요하신 분은 사용하시길 바랍니다. 아마도 배치파일을 만들어서 해당 지점의 타일이미지를 긁어 오는 곳에 응용하면 어떨지 싶습니다.

2009년 2월 11일 변경된 구글지도서버의 내용을 반영해, 정상적으로 작동하도록 하였습니다. 소중한 정보를 제공해준 이사돌이님께 다시 한번 더 감사를 드립니다.

아~ 끝으로.. 타일을 보면 요청한 좌표의 지점이 타일의 중앙에 있지 않은데, 구글맵의 타일은 사용자가 요청한 지점이 포함된 타일을 보내준다는 점에 유의하셔야 합니다.

아래의 그림은 제가 만든 프로그램을 이용해서 GoogleMap 서버로부터 타일이미지를 얻어온후 ArcGIS에서 수치지도(Shape)파일과 함께 중첩한 모습입니다. Georeferencing을 위한 2개의 컨트롤포인트(빨강색 십자 심벌)는 제가 만든 프로그램이 계산해준 좌표값입니다.

“[GIS] 카텍좌표로부터 GoogleMap 이미지 다운로드”에 대한 46개의 댓글

  1. 위의 예문대로 실행파일을 돌렸는데 빈 이미지 파일만 생성이 됩니다….
    확인하실 수 있나요??? 부탁드립니다……^^;

  2. 이미지파일이 필요해서 찾던중 예시대로 실행했는데요
    빈 이미지 파일만 만들어 지내요~ 제가 뭐 잘못한건가요?
    도와주세요~~

  3. 먼저 김인영님, 댓글 확인을 이제서야 했습니다. 황영준님과 같은 문제인데요..
    방금 확인해 봤습니다. 그런데… 구글맵에서 위성영상 이미지 서버와 버전을 바꿨습니다. 과거의 위성영상 이미지 서버는 총 4대로 kh0~kh3까지였습니다. 그리고 버전은 9였는데.. 버전은 물론이고 서버의 이름까지 바뀌어서 위의 프로그램이 제대로 작동하지 않습니다. 서버 이름과 버전을 알아야 되는데… 검색해봐도 공개된게 없네요. HTTP 요청 주소를 추적해서 알아내는 수밖에 없을듯합니다. 시간이 되면 한번 확인해 보도록 하겠습니다.

  4. 이사돌님~ 드디어 됩니다~ ^^ 다시 확인을 해보니 버전을 30이나 34, 둘다 되는걸로 봐서 버전은 의미가 적은듯합니다. 여튼 34로 해서 작동이 잘되네요~ 이 기회에 소스 코드와 컴파일된 실행 파일을 함께 올립니다~ 좋은 정보 감사드립니다~

  5. 안녕하세요, 홍성락님. 댓글 감사드립니다. ^^
    요즘 한국은 한 이틀정도 제법 살살해졌다가, 오늘 다시 풀린듯합니다.
    건강하시구요~

  6. 안녕하세여^^

    현재 mobile windows를 공부하구 있는 학생입니다. 다른게 아니구여^^;;

    올리신 내용을 보니 제가 해보고자 하는 것과 많이 비슷해서여^^;;

    비주얼스튜디오2008(C#언어 사용)을 이용해서 모바일 웹브라우저 도구에 네이버지도 api나 기타 다른 지도api의 키값들을 받아
    HTML문서를 많들어서 만든 HTML문서와 모바일 웹브라우저에 연결해 부푼 가슴을 안구 모바일상에서 지도보기를 시도해 봤거든여

    차후 GPS까지 연동해서 아직 공부중이지만 자기위치 찾기를 만들어보려구여~

    그런데 청천날벼락 같은 말이 모바일 웹브라우저에서는 Javascript를 지원 못한다는 얘길 인터넷에서 봤습니다 ㅜㅜ;

    웹응용프로그램에서는 웹브라우저에 지도가 잘 나타나는데 모바일 웹브라우저에서는 보이질 않네여^^;;

    좌절을 이겨가며 혹시나 다른 방법이 없을까 5일 동안 웹검색을 해봐도 외국사이트까지 찾아가며 검색해봤지만 제가 방법이 있는데 지나친건지두 모르겠네여;;

    ~@0@~

    모바일 웹브라우저에 Javascript를 가져올 수 있는 방법이라든지 조금의 힌트라두 주실 수 없으신가여?

    구글 맵에서 이미지를 불러올 경우라던지 조언 줌 부탁드립니다~
    ^^;;

    제가 무례한 글을 올렸다면 죄송하구여^^;;
    조금만 힌트를 주시면 감사하겠습니다~(__)~

    좋은 하루 되시구여^^

  7. 음, 모바일쪽에서 지도를 표시하려고 하시는군요~, 구글에서 제공하는 Map API를 모바일환경에서 사용할 수 없다면, 직접 만들어보시는게 어떨지 싶습니다. 무슨 말이냐면, 어차피 구글의 지도 API나 네이버, 다음 등등 지도 API는 모두 작은 지도 이미지를 특정 url로 서버측에 저장하고 있습니다. 이게 핵심이구요. 나머지는 원하는 좌표에 대한 지도 이미지를 가져와 화면, 브라우저가 되겠지요? 여튼 화면에 표시하는것입니다. 공부를 하고 계시다니 한번 쯤 도전해 볼만한 주제가 될지 않을까 싶습니다.

    만약 그게 아니라면.. 모바일 웹브라우저에도 버전이나 기종에 따라 자바스크립트를 지원하는 수준이 다릅니다. 자바스크립트를 좀더 잘~ 지원해주는 브라우져를 찾아서 해보는것도 좋을듯합니다.

  8. 앗! 조금 많이 받아서 타일맵을 붙이는 데스트를하고 있었는데…구글맵 서버에서 그 훌륭하다는 메세지가…다시 가능하게 할려면 어떻게 구글의 블랙리스트에서 벗어날 수 있나요,…흑흑흑

  9. 한시간 뒤에 다시 하면 됩니다~ ^^ 차단 서버가 일정 시간이 지나면 블랙리스트에서 제거해주는 모양입니다.. ^^

  10. 답변 감사합니다. 오전에 하고 지금도 안돼서요..내일 해보겠습니다.
    여기 일본은 헬프파일에도 화면을 올리는것도 신중히합니다…구글도 자기내 로고를 하단에 붙여 넣기를 희망하고 상업적 재이용에 저작권으로 보호를 받을려 하겠지요…
    그런데 저로 인해서 회사 네트워크를 차단하는건….걱정이 됩니다.

  11. 한국과는 좀 다른듯하군요. 여기서는 대략 1시간 정도 지나면 풀리는데… 그렇다고 영원이 차단되지는 않을거같습니다. 다만 좀더 차단 시간이 길지 않나 하네요. ^^ 너무 걱정마시길~

  12. 안녕하세요 형준님!
    정말 흔치 않은 소중한 글 잘 읽고 응용해보는 중입니다.

    저도 모바일 윈도우 프로그래밍을 진행하고 있습니다.
    GPS를 이용해서 버스정류장데이터와 연동하여 현재 위치가 어느 정류장에 가까운지를 보여주고 그걸 실시간으로 버스노선상에 표현하는 프로그램을 개발중인데요. (졸업작품입니다 ^^;)

    형준님이 올려주신 소스중에 카텍좌표를 위경도좌표로 바꾸는 소스를 windows mobile 6.0 프로젝트로 옮겨서 사용하고 있습니다. (gTrans.h 랑 cpp요)

    근데 이상한 것은… 실행도 이상없이 됩니다만, longitude값은 이상없이 변환이 되는데,
    latitude값이 이상하게 나옵니다.

    예제로 올려주신 값을 넣어봤는데, (305404, 547763)
    37.582589, 126.927448 이렇게 나옵니다.
    말씀드렸듯이 위도가 이상이 있네요 ㅜㅜ

    다른 좌표값을 넣어봐도
    경도는 tstGoogle소스와 동일하게 나오는데, 위도값만 다르게 나오네요..

    실행되는 플랫폼에 차이가 있어서, (일반 PC가 아닌, 스마트폰이라서)
    문제가 있는것 같은데.. (아무리 디버깅을 해도 잘 모르겄습니다..)
    혹시 짚이시는점 없으신가요 ^^?

  13. 송정환님, longitude는 잘 나오는데, latitude가 이상하다면….. 아~ 대략난감~ 인 상황인데요… 아마도 소스에 잘못 입력된 코드가 있지 않나…. 싶습니다. 잘 해결되시길 바랍니다~ 감사합니다~

  14. 김우진님, 구글은 wgs84 좌표계입니다. wgs84는 단순히 gps 수신기가 사용하는 경위도 좌표계이구요. tm128은 카텍 좌표계라고 하는 tm 좌표계입니다. 위의 프로그램은 wgs84를 tm128로 변환해주고 있습니다.

  15. 음… 단순히 따라 해봤는데 제주도랑 꼬리는 안되네요;;; 꼬리의 경우 몇번해봐서 한번정도 되고;; 에휴;;; gis에서 고해상도 파일을 볼수는 없을까요? biz-gis에서 어떤분이 질문한거 있던데 답이 없어어요 ㅎ

  16. 우진님, 접속자가 많아서 팅기는 현상인가요…? 고행상도 영상은 손쉽게는 다음에서 캡쳐를 해서 얻는 방식도… 나쁘지 않은것같습니다.. 제법 무식한 답변이죠? ^^;

  17. 형준님 다음에서 고해상도의 위성지도를 써보긴 했는데여… biz-gis에서 골프조성부지??
    전 후 조감도 만드신분 처럼 못 만들겠더라고요;;; 어떻게 하면 arcscene에서 고해상도로 만들수 있는지;;; 저는 해봐도 계속 격자로 사진이 깨지던데;;

  18. 현수님, 격자로 사진이 깨진다는 말씀은….. 다음에서 얻은 타일이미지들이 모여 하나의 큰 이미지를 만들때… 타일 이미지 사이에 표시되는 선을 말씀하시는건가요? 음.. 참고로 제 경험을 말씀드리면, 영상을 정말 깔끔하게 표현되는 방법은 광원을 사용하지 않는 것이였습니다. 물론 광원을 제대로 잘 사용하면 멋지게 되지만… 오히려 광원을 사용하지 않는것이 영상을 높은 선명도로 볼 수 있었습니다.. 음… 참고로 제가 아크신은 사용해보지 않았는데, 그곳에서도 광원을 사용하지 않는 모드로 설정할 수 있을듯합니다.

  19. 여기에도 답을 주셨네요 ^^ ㅎ
    저도 위의 김우진님처럼 해봤는데 서울만 되네요;;ㅎ
    아 격자;; ㅋ 그 다음에서 캡쳐해서 합친 이미지를 등고선위에 오버레이 시키려고 합니다.
    물론 ARCGIS 및 SCENE에서요. SCENE에서 3D오버레이 시키기 위해서는 GIS에서 이미지를 등고선 좌표에 맞추어 저장하게 되어있습니다. 거기서 이미지 파일로 저장하려고 하면 CELL SIZE 를 지정해 주게 되어있거든요 해보니 최소 0.1X0.1 로 하니 이미지 용량이 2G정도 되더라구요. 아무래도 CELL SIZE라는 녀석때문에 확대해보면 사각형태의 이미지로 조각나 있는게 다른분이 하신거랑 다르다는 거거든요 ^^;; BIZ-GIS에서 그걸 물어보신분이 계셨는데 RE가 하나도 안달리길래 저도 궁금해서 김형준님께 여쭤봅니다;;ㅎ

  20. 해상도를 조절해서 이미지의 크기를 최대로 키우면 좋은 결과를 낼 것으로 기대할 수있을텐데.. 문제는 이미지의 크기가 커지면, 역시 용량이 커져.. 시스템이 처리할 수 없을 지경일테고… 대략 이미지의 픽셀 크기를 1000×1000 정도로 되게 셀 사이즈를 조정하시면 어떨지.. 싶네요.

  21. 제가 원하던 코드입니다.
    개인적인 취미 생활로 무인조종 항공기대회를 준비 하고 있습니다.
    지상에서 관제탑용 프로그램을 제작하고 있는데 그중 제일 중요한 부분이 지도상에서 비행기 위치를 나타내는 것이라고 생각 합니다. 현재는 네이버지도를 캡쳐해서 지도를 올리고 있는데 김형준님의 코드를 사용 할려고 합니다. 그런데..정작 동작을 안하네요.
    회사여서 IP가 막힌 건지.. 저녁때 집에가서 한번 더 해봐야 겠네요.
    현재도 정상적으로 이미지가 받아 지는지 알수 있을까요?

  22. 상문님, 방금 실행해보니 제대로 않되네요.. 올린땐 제대로 작동하는것을 확인했는데.. 아마도 구글에서 지도 서버가 변경된건지 모르겠습니다..

  23. 안녕하세요
    저는 Windows Mobile 프로그래밍을 배우는학생입니다.
    위에 글 남기신 송정환님과 비슷한 케이스라고 해도 될 것 같네요…ㅎㅎ;
    네비게이션을 만드려고 하는데 (M490으로 개발하려고 합니다. T옴니아이구요~)
    네이버나 다음, 구글 등의 OpenAPI는 모두 java라서 C#으로 구동할 수가 없더라구요;
    한 2주째 찾아보고있는데 답이 안나옵니다..ㅜ

    옴니아 내부GPS를 이용해 위도,경도를 얻어와서
    자신이 위치한 지역의 맵을 띄우려고하는데 어떻게 해야할까요;?

    한 1,2주 지도띄우는 것에 관련된 것만 알아봤는데 딱히 어떻게 하면 된다 이런글도 없더라구요ㅠ_ㅠ
    XML도 알아보고있고, 플래쉬맵도 알아보고있는데 아직 확실하게 나온게 없어서…ㅜ
    죄송하지만 도움을 요청하려고.. 글을 남깁니다.

    메신저로 대화가 가능하다면 더 좋을 것같습니다ㅜㅜ..(한번에 이해를 못할것같아서…)
    asdsa1011@nate.com
    제 네이트온인데 친구추가해주시구..;
    윈도우모바일에 구글맵(네이버맵 등..)을 띄우는 방법좀 가르쳐주셨으면 좋겠습니다.
    아니면 대충의 틀이라도 (OpenAPI를 이용해 서버를 만든 후 웹브라우저로 접근한다. 뭐 이런식;;근데 저건 안되더라구요 ㅜ)
    어떻게 하면 된다. 이런거라도 정말 감사하겠습니다.ㅜ
    너무 답이 안나와서….에구 ㅜㅜ

    시간이 있으시다면 찾아갈 의향도 있습니다 ㅜ_ㅜ 꼭 알려주셨으면 합니다!
    연말 잘보내시고, 새해 복 많이받으세요!!

    1. 질문 내용이 너무 포괄적이네요. 지도쪽 OpenAPI는 자바스크립트나 플래시 기반이라… C#에서 사용하기는 어려움이 큽니다. GPS의 위치 정보는 경위도 좌표니… 화면상의 지도 좌표로 표현해주면 지도와 함께 위치를 표현해주는건 가능할테구요..풀어야할 것이 많네요. 하나 하나 풀어야할텐데….

  24. 아 그렇군요..답변 감사합니다. 모바일에서 지도를 띄워야하는데 아직 해답이 안나오네요
    XML을 이용하거나 해봐야 할 것 같습니다. 감사합니다 ㅜㅡㅜ
    새해 복 많이받으세요!

  25. 안녕하세요… 소중한 지식 감사드립니다… 그런데 tstGoogle.exe를 실행해보니 jpg는 생성되는데 이미지가 안뜨네요… 구글서버 문제인가…;;

  26. 전 프로그램 실행파일이 깜박하고 바고 종료되어 버리던데 제가 윈도우764bit를 사용해서 그런걸까요? ㅠㅠ

  27. 안녕하세요. 님이 올려주신 소스.. 현재에도 동작을 하는건가요?? 좀전에 받아서 해봤는데.. 흑백 영상만 올라오더라구요…

    1. gpsturbo.. gps 관련 프로젝트같은데.. 여기에 구글맵을 서버에서 바로 당겨오는 소스 코드가 있더는 말씀같군요.. 근데 예전 댓글은 왜 지우셨는지.. 지우신 글에 대한 제 댓글이 허공에 대롱 대롱되고 있습니당.. 허헛..

  28. 좋은 내용 잘 봤습니다!
    모바일 GIS 프로그래밍 책도 구입했는데… 인터넷 검색하다가 이렇게 들어오게 되었네요.

    경위도 좌표에서 카텍 좌표로 변환하는 방법에 대해서는 어떤 알고리즘이나 계산식 등이 필요한지 궁금합니다.
    단순한 변환 소스도 소스지만… 이해를 좀 해보고 싶네요 ^^;

    1. 안녕하세요^^
      경위도 좌표계는 타원(지구가 타원체임)에 대한 3차원 좌표계입니다.
      그리고 카텍은 2차원 좌표계이구요.
      즉 경위도 좌표계에서 카텍으로의 변환은 3차원에서 2차원 변환입니다.
      3차원에서 2차원으로 변환하기 위해서는 투영(Projection)이 필요합니다.
      구체적인 수식이라든지…. 이론을 댓글을 통해 설명드리기보다는.. 관련 검색어(GIS 좌표 변환, 타원체, 지심좌표계, 투영)로 검색해 자세한 내용을 살펴보시는게 좋을듯합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다