OsmAnd 구글 그룹 페이지 [1] 를 보다가 GeoTIFF 파일을 OsmAnd 에서 사용하는 방법을 알아냈습니다. 아래 아미산님이 소개하신 것처럼 Oruxmaps 에서는 GeoTIFF 파일을 Oruxmaps Desktop 을 사용하여 변환할 수 있지만 OsmAnd 에서 읽기 위해서는 png, jpg 형식으로 변환하여 sqlitedb 파일로 만들어야 합니다. 이렇게 하기 위해서는 파일 변환/맵타일 생성을 위한 GDAL/MapTiler(GeoTIFF 파일이 하나인경우) 소프트웨어와 sqlitedb 파일을 만들기 위한 MOBAC 소프트웨어가 필요합니다. GlobalMapper 등을 사용해도 가능할 것 같지만, 직접 사용해보지 않아서 모르겠고 상용 소프트웨어 사용은 배제하였습니다.
GDAL/OGR 은 지리공간 데이터 형식들을 읽거나 쓰는 데 필요한 오픈소스 라이브러리 소프트웨어이며, GIS 소프트웨어 개발자들이 많이 사용하는 것은 물론 구글어스, Mapnik/Openstreetmap, ArcGIS 등에서도 활용합니다 [2].데, GDAL에서 지원하는 지리공간 데이터 형식은 관련 링크( http://www.gdal.org/formats_list.html ) 를 참고하시기 바랍니다. (저도 얼마전에 srtm hgt 고도정보 파일을 osmand 에 구현할 때 참고했었습니다)
GDAL 싸이트의 다운로드 페이지를 살펴보면 아시겠지만 GDAL 을 설치하는 방법은 여러 가지가 있습니다. GDAL 을 직접 설치하거나 OSGeo4W 또는 FWTools 를 대신 설치하는 방법이 있는데, GDAL 을 직접 설치하는 방법은 까다로우므로 개인적으로 OsGeo4W 를 설치하기를 권합니다. 참고로 FWTools 는 현재의 GDAL 버전과 호환되지 않으므로 사용이 불가능합니다. OsGeo4W 를 설치하실 분은 아래 첫번째 단계를 건너뛰세요.
1) 첫번째로 GDAL 을 직접 설치하는 방법은 다음과 같습니다. 먼저 Python 홈페이지 ( http://www.python.org)로부터 Python 인터프리터를 설치합니다 [3]. Python 은 GeoTIFF 파일을 합치거나 여러 타일파일들로 분리하는 데 사용하는 GDAL 내의 python 스크립트들을 실행하기 위해서 필요한데, 현재 GDAL 지원 버전이 2.6 ~ 3.2 이므로 적절한 버전을 설치해야 합니다.
2) OSGeo4W 를 설치하는 방법은 다음과 같습니다. OSGeo4W 는 GDAL 을 개발한 OSGeo (오픈소스 지리공간 재단, Open Source Geospatial Foundation) 에서 개발하고 관리하는 소프트웨어들인 GDAL/OGR, GRASS (지리공간 데이터를 처리하는 GIS 소프트웨어), Mapserver (지리정보 웹서비스를 위한 오픈소스 개발환경), OpenEV (지리정보를 보여주고 분석하는 소프트웨어, 2006년개발중단), uDIG (이클립스를 위한 GIS 플러그인), QGIS (GIS 데이터를 보여주고 처리하는 통합 프로그램) 등을 묶어놓은 패키지입니다 [4].
OSGeo4W 홈페이지(http://trac.osgeo.org/osgeo4w/) 의 “OSGeo4W Installer” 를 클릭하여 “osgeo4w-setup.exe” 파일을 다운로드하여 설치합니다. 설치 시에 처음에는 “Express Desktop Install” 메뉴를 선택하여 GDAL 을 포함하여 다른 소프트웨어들을 체크하여 함께 한꺼번에 설치하게 되면 많은 시간이 걸립니다. 그렇게 하지 않고 GDAL 만을 체크하여 설치해도 되는데, 그런 경우에는 설치한 후에 다시 osgeo4w-setup.exe 을 재실행하여 “Advanced Install” 메뉴로 들어가서 계속 진행한 다음 “Select Packages” 대화창에서 “Libs” 아래 “gdal-python” 패키지의 상태를 Skip 에서 Keep 로 바꾸어 진행하여 python, gdal-python 패키지들을 설치하면 됩니다.
이제 GDAL 이 설치되었으니 본격적으로 GeoTIFF 파일로부터 맵타일을 만들어 보겠습니다. 먼저 테스트를 위해 공염불님이 소개하신 가람지도를 활용하겠습니다 [5]. (아쉽게도 지난번에 다운로드 기간을 놓쳐 공염불님이 올려주신 지도를 다운받지 못했는데 어느 분이 공유해 주시면 정말 고맙겠습니다.^^;)
한국하천정보시스템 가람지도 홈페이지 (http://river.kwater.or.kr/garam/)로부터 지도 창을 열어 상단 툴바 메뉴의 이미지맵다운 버튼을 눌러 특정 지역의 좌표이미지 tiff 파일을 다운로드합니다. 예를 들면 덕유산 지역의 tiff 파일은 249.tiff, 269.tiff 인 두 개의 파일입니다. GDAL 을 직접 설치한 경우에는 GDAL 설치 디렉토리에서 “SDKShell.bat” 파일을 실행하여 전용 쉘 창을 열고, OSGeo4W 를 설치한 경우에는 설치된 OsGeo4W 아이콘을 눌러 OSGeo4W 전용 쉘을 엽니다. 그런 다음 tiff 파일이 위치한 곳으로 이동합니다. 예를 들면 tiff 파일이 <사용자홈디렉토리>또는 C:\Users\<사용자>\Downloads 디렉토리라면 다음 명령어를 입력하면 되겠죠.
> cd C:\Documents and Settings\<사용자>\Downloads # 윈도우 XP 인 경우 또는 > cd C:\users\<사용자>\Downloads # 윈도우7 인 경우
다음으로, 맵타일들을 만들기 전에 tiff 파일들을 합쳐(merge) 하나의 파일로 만듭니다.
> <GDAL 설치 디렉토리>\bin\gdal\python\scripts\gdal_merge.py -o merged.vrt 249.tiff 269.tiff 또는 > gdal_merge -o merged.vrt 249.tiff 269.tiff# OSGeo4W 인 경우
이제 합친 파일을 이용하여 osmand 등에서 읽을 수 있도록 wgs84 좌표계의 png 맵타일들로 변환합니다. 그런데, 올바르게 변환된 맵타일을 생성하려면 원본 지도의 좌표계를 알아야 제대로 변환이 되겠죠? 가람지도의 원본 좌표계는 공염불님 글에서 알 수 있는 것처럼 중부원점 GRS80 좌표계(EPSG:5181) 입니다. 이 좌표계에 해당하는 proj4 파라미터는 “+proj=tmerc +lat_0=38.0 +lon_0=127.0 +k=1.0 +x_0=200000 +y_0=500000 +ellps=GRS80” 입니다. 여기서, proj 는 좌표계 투영법 (여기서 tmerc 는 Transvere Mercator 방식), lat_0 은 기준좌표 위도, lon_0 은 기준좌표 경도, k 는 스케일, x_0 은 기준좌표의 x 축 오프셋, y_0 은 기준좌표의 y 축 오프셋을 가리킵니다. 한국 주요 좌표계 EPSG코드 및 proj4 파라미터에 대해서는 OSGeo 한국지부 홈페이지 링크 (http://www.osgeo.kr/17)를 참고하세요 [6]. 이 파라미터를 직접 입력하거나 이미 등록된 EPSG:5181 코드를 이용하여 쉘에서 아래와 같은 명령어를 실행하면 제대로 된 맵타일들이 만들어지게 됩니다.
> <GDAL 설치 디렉토리>\bin\gdal\python\scripts\gdal2tiles.py -s “EPSG:5181” merged.vrt deokyu 또는 > <GDAL 설치 디렉토리>\bin\gdal\python\scripts\gdal2tiles.py -s “+proj=tmerc +lat_0=38.0 +lon_0=127.0 +k=1.0 +x_0=200000 +y_0=500000 +ellps=GRS80” merged.vrt deokyu 또는 > gdal2tiles -s “EPSG:5181” merged.vrt deokyu# OSGeo4W 인 경우 또는 > gdal2tiles -s “+proj=tmerc +lat_0=38.0 +lon_0=127.0 +k=1.0 +x_0=200000 +y_0=500000 +ellps=GRS80” merged.vrt deokyu# OSGeo4W 인 경우
지정한 디렉토리 deokyu 를 살펴보면 생성된 맵타일들을 줌스케일 10 부터 14까지 생성되어 있는 것을 알 수 있습니다. 아마 소스 GeoTIFF 파일의 해상도가 1:75000 정도라서 14까지 표현되는 것 같습니다. 위 명령어에서 -z “10-15” 와 같이 줌스케일을 지정하면 더 높은 스케일의 맵타일을 생성할 수 있지만 해상도가 높아지지는 않습니다. 어쨌든, 이 단계를 실행하였으면 MapTiler 를 사용하지 않고 4번 단계로 건너뜁니다.
3) 맵타일을 생성하기 위하여 GDAL 대신 gdal2tiles.py 기능을 GUI 로 구현한 프로그램인 MapTiler 를 사용하는 방법도 있습니다 [7]. MapTiler 를 사용하면 GUI 화면을 통해 맵타일을 보다 손쉽게 생성하는 장점도 있지만 GeoTIFF 파일들을 합치는 기능은 없으므로 GeoTIFF 파일이 하나인 경우에만 사용 가능하다는 단점도 있습니다.
Maptiler 를 설치하는 방법은 간단합니다. MapTiler 홈페이지 (http://www.maptiler.org)로부터 설치파일을 다운로드받아 설치하면 끝입니다. 실행 방법은 MapTiler 아이콘을 클릭하여 실행한 후 “Google Maps compatible (Spherical mercator)” 를 선택하고 소스 파일을 선택하여 “Add” 한 후 “Custom definition of the system (WKT, Proj.4...)” 메뉴 아래에 “+proj=tmerc +lat_0=38.0 +lon_0=127.0 +k=1.0 +x_0=200000 +y_0=500000 +ellps=GRS80” 를 붙여 넣고 계속 진행하면 됩니다.
여기서, <invertYCoordinate> 태그의 값을 true 로 한 이유가 있습니다. 앞서 GDAL 로부터 생성된 맵타일의 디렉토리 구조는 <줌스케일=Z>/<x축 번호=X>/<y축 번호=Y>.png 파일로 되어 있는데, 여기서 GDAL 에서 생성한 y 축 번호 Y는 구글맵에서 쓰는 y 축 번호 Y_google 와 다릅니다. 구글맵에서는 맵의 “좌측상단”을 기준으로 x 축 방향은 물론 y 축 방향으로 맵타일의 인덱스가 증가하여 위도가 높을수록 y축 인덱스가 작아지는 반면 GDAL 에서 사용하는 TMS (Tile Map Service, http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification) 방식은 “좌측하단”을 기준으로 맵타일의 인덱스를 증가시키므로 위도가 높을수록 y축 인덱스가 커집니다 [9]. 즉, Y_tms = 2^Z - 1 - Y_google 이 됩니다. 이것은 다음 링크 (http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection/) 로부터 확인할 수 있습니다.
어쨌든, 이렇게 하여 MOBAC 을 실행한 다음, 해당하는 지역으로 이동한 후 맵소스를 방금 지정한 “Deokyusan” 으로 선택하면 지도가 화면에 보이게 됩니다. 왼쪽 아래 “New” 버튼을 클릭한 후 대화창에서 “OSMAND sqlite” 를 선택하고 적절한 이름(예 “Deokyu”)를 입력하여 새로운 atlas 를 만듭니다. 지도 영역에서 마우스로 해당 영역을 선택한 후 저장하려는 줌 스케일을 모두 선택한 다음 “Add selection” 버튼을 클릭하여 레이어들을 atlas 에 추가합니다. 그런 다음 “Create atlas” 버튼을 클릭하면 <MOBAC 설치 디렉토리>/atlases/ 디렉토리에 최종적인 하나의 sqlitedb 파일이 만들어집니다. 이 파일을 스마트폰의 /sdcard/osmand/tiles/ 디렉토리에 두고 Osmand 를 실행시키면 됩니다. 이 파일은 “기본” wgs84 좌표계를 사용하므로 custom_tile_sources.xml 파일을 수정하여 따로 좌표계를 지정할 필요가 없습니다.
마지막으로 메인맵(Naver Mobile Hybrid), 언더레이맵(custom deokyu) 를 선택한 스크린샷 한장 첨부합니다. 끝까지 읽어주셔서 감사합니다.
첫댓글 좋은 정보인데 아직 이해하기가 힘드네요..
좋은 정보 감사합니다 ㅠㅠ 정말 도움이 많이되었습니다. 최고^^b
스크랩해서열공 하겠습니다.
넵 감사합니다..