|
공염불님이 GPS 관련 공개 소프트웨어 게시판에 올리신 글에서 QGIS 프로그램을 이용하여 화면에 보이는 다음/네이버 지도를 읽어와서 GeoTIFF 파일로 바꿀수 있다는 내용을 보고 나서, OsmAndMapCreater, GDAL 스크립트, MOBAC 을 이용하면 줌레벨별로 한꺼번에 변환하여 Locus, Oruxmaps 에서 사용 가능하도록 할 수 있겠다는 생각이 들더군요.
즉, 구체적인 맵 변환 방법은 다음과 같은 단계를 거칩니다.
(1) OsmAndMapCreater ([1]) 를 사용하여 다음/네이버/숲에온 지도에서 특정 영역 맵타일 이미지를 받아오기
(2) GDAL 스크립트 (첨부파일 ) 를 사용하여 줌레벨별로 GeoTIFF 파일을 만들고 WGS84 좌표계로 맵타일 변환
(3) MOBAC ([2]) 를 사용하여 Locus, Oruxmaps 용 db 파일로 만들어 사용
여기서, 첫번째와 세번째 단계는 이전에 쓴 글들에서 설명이 되어 있습니다. 중요한 것은 두번째 단계인데, 기존의 GDAL 소프트웨어 패키지 [3] 에는 디렉토리 내의 맵타일들을 한꺼번에 GeoTIFF 파일로 변환하는 프로그램이 없으므로 이런 기능을 실행하는 Python 스크립트 gdal_mergedirs.py 를 따로 만들었습니다. 구현 원리는 기존의 스크립트들(gdal_merge.py, gdal2tiles.py) 소스코드를 참고하였는데, 먼저 지정한 입력 디렉토리 하부의 모든 이미지파일들을 줌레벨별로 합쳐(merge) GeoTIFF 파일을 만들고, 지정된 출력 디렉토리로 줌레벨별 WGS84 맵타일로 변환(transform)하여 생성합니다. 이 때 좌표계가 다른 맵타일을 변환하면서 이미지 변형(기술적인 용어로 이미지 와핑 image warping 이라고 합니다)이 일어나므로 영상의 질이 떨어질 수 있습니다. 그래서 Oruxmaps 와 같이 GeoTIFF 파일을 그대로 읽을 수 있으면 그게 더 좋을 수도 있겠죠.
어쨌든 첨부파일 gdal_mergedirs.py 를 GDAL/OSGeo4W [4] 설치 디렉토리/bin 에다 복사해 두시면 됩니다. 스크립트의 주요 사용 옵션은 다음과 같습니다. 스크립트를 실행하다가 문제가 있으면 알려주세요.
gdal_mergedirs.py [-od output_dir] [-s srs_format] [-offset offset_x offset_y] [-v] [-z zoom] input_dir
-od output_dir: 출력 디렉토리 지정. 이 옵션이 지정되지 않으면 줌레벨별로 GeoTIFF 파일만 생성하고 프로그램 종료.
-s srs_format: 변환하기 위한 소스 GeoTIFF 의 좌표계.
-offset offset_x offset_y: 소스 맵타일을 GeoTIFF 이미지를 만들 때 추가로 이동시킬 오프셋
-v: verbose 모드. 추가적인 정보를 출력함.
-z zoom: 합치고 변환할 때 사용하는 맵타일의 줌레벨 범위. 이 범위를 지정하면 해당하는 줌레벨 맵타일들만 합쳐지고 변환됨.
input_dir: 입력 디렉토리 지정. 이 옵션이 지정되지 않으면 스크립트를 실행하지 않고 종료.
여기서, 실행하는 도중 중간 단계에서 생성되는 GeoTIFF 이미지들의 이름은 “<입력 디렉토리 이름>.<줌레벨>.tif” 입니다. -offset 옵션에서 오프셋을 지정하는 이유는 특정한 좌표계를 사용하더라도 좌표계 내부의 false easting, false northing 과 같은 오프셋과는 별도로 맵 자체의 위치 오차가 존재하기 때문입니다. 예를 들면, 테스트를 거쳐 추정한 국내 맵들의 좌표계 [5] 와 오프셋 값은 다음과 같습니다. 혹시 다른 점이 있다면 알려주세요.
다음지도: 좌표계 (EPSG:5181), 오프셋(-30000, -60000)
네이버지도: 좌표계 (EPSG:5179), 오프셋(+90112, +1192896)
숲에온지도: 좌표계 (EPSG:5181), 오프셋(+0, +0)
VWorld지도: 좌표계 (EPSG:900913), 오프셋(+0, +0) -> 구글맵과 같은 WGS84 좌표계입니다. 그런데, MOBAC 에서 기본 WGS84 좌표계를 지원하므로 GeoTIFF 파일을 만드는 데만 사용하세요.
예를 들면, OsmAndMapCreater 를 사용하여 덕유산 지역의 맵타일을 불러온 다음에 다음과 같은 GDAL 쉘 명령어를 실행합니다.
<다음 맵 (소스디렉토리는 daum_daeokyu) 인 경우>
> gdal_mergedirs.py -od daum_deokyusan -s “EPSG:5181” -offset -30000 -60000 daum_deokyu
또는 <네이버 맵 (소스디렉토리는 naver_daeokyu) 인 경우>
> gdal_mergedirs.py -od naver_deokyusan -s “EPSG:5179” -offset +90112 +1192896 naver_deokyu
또는 <숲에온 맵 (소스디렉토리는 foreston_daeokyu) 인 경우>
> gdal_mergedirs.py -od foreston_deokyusan -s “EPSG:5181” foreston_deokyu
또는 <VWorld 맵 (소스디렉토리는 vworld_daeokyu) 인 경우>
> gdal_mergedirs.py -od vworld_deokyusan -s “EPSG:900913” vworld_deokyu
팁1: 여러가지 형식의 입력이미지파일을 하나의 GeoTIFF 파일로 만드는 도중에 오류가 있었는데 수정하였습니다. 색깔표를 사용하는 1밴드 파일이나 RGB 3밴드 파일을 RGBA 4밴드 파일로 변환하도록 하였습니다. 수정된 파일은 gdal_mergedir2.py 입니다. 예전파일도 그대로 두었으니 참고하시기 바랍니다.
그래도 간혹 GDAL 스크립트 실행 시에 filename: GDALDataset::GetRasterBand(2) - Illegal band # 과 같은 오류메시지가 나타나면 특정한 이미지 파일이 rgba 방식으로 되어 있지 않은 이유이므로, 해당하는 파일에 대해 다음과 같은 명령어를 실행하여 rgba 파일을 생성하고 원래 파일을 대체한 다음에 다시 실행하면 됩니다.
팁2: 2013년 6월 21일 현재 몽탄님의 지적대로 18 레벨 줌 이상 맵에서 변환이 되지 않는 버그를 수정하였습니다.
팁3: 2014년 12월 3일 날틀님의 지적대로 구글맵과 VWorld 맵도 가능하도록 수정하였습니다. 수정된 파일은 gdal_mergedirs.py 입니다. 그런데, 간혹 tif 파일을 만들고 나서 맵타일로 변환하는 도중에 ERROR 5: Illegal values for buffer size 와 같은 오류 메시지가 나타나면 <OSGeo4W 설치디렉토리>/bin/gdal2tiles.py 파일의 1256 라인 쯤에 윗줄 맞춰서 다음 2줄을 추가하시기 바랍니다.
if rxsize == 0 or rysize == 0:
continue
팁4: 야후재팬맵은 WGS84 좌표계를 사용하지만 기준점(경도,위도)이 구글맵(-180,90) 또는 TMS(-180,-90) 가 아니라 (-180,0) 이므로 오프셋이 존재하므로 MOBAC 에서 곧바로 사용하지 못합니다. 첨부파일 중 yj2tms.py 를 실행시켜 파일이름만 오프셋만큼 변경하면 됩니다. 첨부파일을 <OSGeo4W 설치디렉토리>/bin/ 에 두고 다음과 같이 실행시키면 됩니다. 실행 후에 <output_directory>에 생성된 yahoojapan.xml 파일을 <MOBAC 설치디렉토리>/mapsources 디렉토리에 두고 사용하면 됩니다.
> yj2tms.py -od <output_directory> <input_directory>
팁5: 생성한 맵타일들을 PC 에서 구글맵이나 openlayer 에서 확인하는 방법입니다.
먼저 구글맵 버전 2와 오버레이하기 위해서는 구글맵 API 키가 필요합니다. 반면에 구글맵 버전 3은 구글맵 API 키가 필요없습니다. 구글맵 API 키를 받는 방법은 링크 [6] 에 잘 나와있습니다. 구글맵 API 콘솔 홈페이지(https://code.google.com/apis/console) 로 접속하고 구글 계정으로 로그인하고 필요하다면 “Create Project” 버튼을 누릅니다. 왼쪽 탭에서 “Services” 을 선택한 다음 “Google Maps API v2” 와 “Google Maps API v3” 서비스를 활성화합니다. 다시 왼쪽 탭에서 “API Access”를 선택하면 API 키가 보일 겁니다. 이 API 키 값을 복사해 둡니다.
다음으로 위에서 gdal_mergedirs.py 스크립트를 통해 생성된 맵타일 디렉토리로 이동합니다. 이 디렉토리에는 “googlemaps.html”, “openlayers.html”, “tilemapsource.xml” 파일이 있을 겁니다. 여기서, “tilemapsource.xml” 파일은 맵타일에 대한 정보를 알려주고, “googlemaps.html” 과 “openlayers.html” 파일은 생성한 맵타일을 웹 브라우저를 통해 각각 구글맵, openlayers 에서 중첩시켜주는 역할을 합니다. 두 파일 중 아무 파일이나 열고 다음 부분을 수정해 줍니다.
...
<script src='http://maps.google.com/maps?file=api&v=2&key=INSERT_KEY_HERE' type='text/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxjavascript'></script>
….
var mapMinZoom = 10;
var mapMaxZoom = 12;
var opacity = 0.75;
…
여기서, INSERT_KEY_HERE 부분을 구글맵 API 키 값으로 대체하고, 줌레벨 범위를 수정합니다. 그런 다음 이 파일을 웹브라우저로 열면 구글맵 또는 Openlayers 에서 생성된 맵타일이 잘 중첩되는지 확인할 수 있습니다.
게다가, FOSS4G Korea 2012 발표자료 링크 [7] 의 "Sample.zip" 첨부파일과 이전에 제가 올린 글의 OsmAnd 용 "custom_tile_sources.xml" 파일을 참고하여 "openlayers.html" 을 수정한다면 다양한 다음, 네이버 맵들을 Openlayers 로 중첩시킬 수 있습니다. (http://cafe.daum.net/gpsyn/Kqy0/221 참고)
추가로 최근에 GDAL 홈페이지에서 업데이트되고 있는 gdal2tiles.py 스크립트를 첨부합니다. 이 스크립트는 이전 버전과는 다르게 구글맵 API 키가 필요없는 구글맵 버전 3과 호환되는 “openlayers.html” 을 생성합니다. (“googlemaps.html” 은 여전히 구글맵 버전 2 와 호환되는 코드로 생성되더군요)
[7] FOSS4G Korea 2012 발표자료, http://www.osgeo.kr/84
첫댓글 좋은 글입니다. 감사합니다.........
열공해야되겠네요 감사합니다.
저도 감사합니다^^
일단 원노트로 갈무리해서, 틈틈히 봐야겠네요.
감사합니다 ^^
열심히 공부를 해야할것 같네요~~!!
OsmAndMapCreater 한글버전... 압축을 풀어도 실행파일이 없네요?
pc버젼이 잘 이해가 안되네요... 한글버젼이 아닌 OsmAndMapCreater는 다음,네이버가 안 뜨네요
죄송합니다 제가 더 열공해야하는데 힘드네요ㅠ
압축으로 푸는게 아니고, 마우스오른쪽버튼->연결프로그램->Java(TM) Platform SE Binary 로 실행하거나 Cmd 쉘을 실행시키고 해당 파일이 있는 디렉토리에서 "java -jar OsmAndMapCreator-0.7.2.jar" 를 실행시키면 됩니다. 사용법은 아래 OsmAnd 한글버전 업데이트 댓글에 설명되어 있습니다.
네 감사합니다...시작-실행-찾아보기에서 자바를 푼후 실행하니 됩니다
감사합니다 열심히공부해야 되겠습니다...
생성된 맵타일을 PC 웹브라우저를 통해 구글맵, OpenLayers 에서 확인하는 방법에 대한 내용을 추가하였습니다.
고맙습니다. 날잡아서 해봐야겠네요.
나들이라는 어플을 봤습니다. 네이버지도도 다운이 가능하더군요 전국으로? 나들이를 통해 받은 파일을 Locus로 보는 방법은 없을 까요? 프로그램사용에 많이 미숙해서 겨우 mobile atres creator이용 하는데요... 1.8이상 버전에서는 500000타일 이상 받을 수 었어서 전국지도는 상상도 못해서요....어떻게 전국지도 쉽게 받아서 locus에서 볼 방법이 없을까요?
아~ 어렵네요 ㅠㅠ
뭐가뭔지????열심히 공부해야겠내요.
헐.. 어디부터 공부를 해야하는지.,..ㅠㅠ
에고....뭐가 뭔지...
갈수록 어렵네요 에궁 나이가 죈지...
감사합니다.열심히 배우겠습니다.
열심히 해봐야겠네요.ㅠ
게시글이 업데이트 되었네요..감사합니다.
이런게 있는 줄 모르고, QGIS에서 매일 노가다를 했었는데, 이제서야 봤습니다.
매발톱님께, 질문이 있습니다. 자세하게 써 주셔서 몇 차례 실패끝에 다운까지느 받았는데,
gdal명령을 사용하여 GeoTiff파일을 생성하는데, '"No input directory selected"라고 메시지가 나옵니다.
다운받은 다음 타일들을 모두 "C:\Users\GIK\Desktop\test\daum"에 옮겨놨고,
명령어에서 gdal_mergedirs.py -od C:\Users\GIK\Desktop\test\daum -s “EPSG:5181” -offset -30000 -60000 C:\Users\GIK\Desktop\test\daum
이렇게 입력하였는데, 위 메시지 이후 진행을 못 나가고 있습니다. 혹시라도 글을 보시면 조언을 부탁드립니다.
PC에서 작업중입니다.
저도 이 디렉토리가 도대체 어떤 주소를 넣는 건지 모르겠어요...ㅠㅠ