OpenStreetMap 기반의 오프라인 지도 타일생성

1. 개요

인터넷에 연결 할 수 없는 환경에서 오프라인으로 사용 할 수 있는 지도가 필요하여 우리나라 영역에 대하여 타일을 만들어보았다.

해당문서는 아래 사이트를 참조하였으며, 현시점에 맞추어 보안해야 할 사항을 정리한 글이다.

http://openstreetmapserverwindows.blogspot.com/2015/11/osmopenstreetmap-tile-server.html

 

2. 관련 어플리케이션 설치

2.1 PostgreSQL/PostGIS 설치

  • 다운로드

 https://www.enterprisedb.com/downloads/postgres-postgresql-downloads 에서 Window x86-64 버전을 받는다.

 

 

 

 

 

 

 

  • 설치

Next 버튼을 클릭하여 넘어가다 보면 다음과 같이 패스워드를 넣는 화면이 나온다.

여기서 비밀번호를 postgres라고 입력하고 넘어간다.

그 이후는 디폴트 상태로 Next버튼을 클릭하여 이동

Stack Builder 선택창에서 아래와 같이 “PostgresSQL 14(x64) on port 5432”를  선택 한후 Next 버튼 클릭

트리에서 Spatial Extensions을 확장한후 “PostGIS 3.2 Bundle for PostgreSQL 14(64 bit) v3.2.0”을 체크한후 Next버튼을 계속 PostGIS를 설치한다.

PostGIS 설치시 물어보는 다이얼로그가 뜨는데 “예”를 선택하여 진행하면 된다.

  • 설치확인

시작메뉴의 검색에서 pgAdmin 4를 입력하여 실행한후 비밀번호를 postgres를 입력

좌측 Browser에서 트리를 확장하여 PostgreSQL 14를 선택하면 다시 비밀번호를 넣으라고 나오는데 여기서 postgres를 입력

아래와 같이 나오면 설치가 성공한 것 이다.

 

  • 시스템 환경변수에 Path추가

시스템변수의 Path에 C:\Program Files\PostgreSQL\14\bin를 추가하여 psql명령이 cmd에서 사용할 수 있도록 한다.

2.2 osm2pgsql 설치

  • 다운로드

https://osm2pgsql.org/download/windows/osm2pgsql-1.6.0-x64.zip 에서 다운로드후

적당한 장소에 압축 해제

Ex) D:\Service\osm2pgsql-1.6.0-x64

  • 설정

시스템변수의 패스에 D:\Service\osm2pgsql-1.6.0-x64\osm2pgsql-bin을 추가

2.3 ms4w 설치

https://ms4w.com/release/ms4w_4.0.5.zip

 PROJ_LIB= D:\Service\ms4w_4.0.5\ms4w\proj\nad

 

 

 

3. OSM 데이터베이스 생성

3.1 DataBase 생성

가. 데이터베이스 생성

  • pgAdmin 4의 좌측 트리에서 Databases를 우클릭 하여 osm이라는 이름으로 데이터베이스를 생성한다.

  • Tools > Query Tool을 클릭하여 CREATE EXTENSION postgis; 를 입력하여 실행

 

나. 데이터베이스 확인

psql -U postgres -d osm 입력후 postgres를 입력하여 데이터베이스에 접속한후 \d를 입력하여 확인

\q를 입력하면 데이터베이스의 접속을 종료할 수 있다.

 

다. 스크립트 실행

psql -U postgres -d osm -f “C:\Program Files\PostgreSQL\9.2\share\contrib\postgis-2.2\postgis.sql”

psql -U postgres -d osm -f “C:\Program Files\PostgreSQL\9.3\share\contrib\postgis-2.2\spatial_ref_sys.sql”

psql -U postgres -d osm -f ” C:\Program Files\PostgreSQL\14\share\contrib\postgis-3.2\legacy.sql”

 

라. 패치다운로드 및 실행

https://github.com/downloads/mapserver/docs/legacy-postgis-gist.sql 을 다운로드받아 해당 다운로드폴더에서 아래 명령 실행

psql -U postgres -d osm -f “legacy-postgis-gist.sql”

3.2 OSM 데이터 IMPORT

가. OSM 데이터 다운로드

http://download.geofabrik.de/asia.html 에서 South Korea에 해당하는 pbf 파일 다운로드

나. IMPORT

osm2pgsql -U postgres -W -m -d osm -p osm -E 3857 -S “D:\Service\osm2pgsql-1.6.0-x64\osm2pgsql-bin\default.style”  “D:\Service\OSM\south-korea-latest.osm.pbf”

4. mapnik

4.1 다운로드

Windows 버전은 오래된 버전으로 아래 사이트에서 다운로드 받는다.

https://github.com/downloads/mapnik/mapnik/mapnik-2.0.1rc0.zip

4.2 타일 생성

가. 환경설정

1. 라이브러리 패스추가 :  시스템변수의 패스에 C:\mapnik-2.0.1rc0\lib 추가

      

2. 실행 테스트

C:\>cd C:\ mapnik-2.0.1rc0\demo\c++

C:\mapnik-2.0.1rc0\demo\c++>rundemo.exe  ..\..\lib\mapnik

 

3. 파이썬X 버전 설치 : 설치되었다고 가정하고 생략, 32비트 버전으로 설치 해야함.

4. 환경변수 추가  :  변수이름에 “PYTHONPATH”을 변수 값에 “C:\mapnik-2.0.1rc0\python\2.7\site-packages”을 입력

5. 파이썬 임포트 확인

파이썬이 설치되어 있는 디렉토리로 이동하여 python.exe를 입력한후

Import mapnik를 쳤을 때 에러가 안나오면 된다.

c:\Programs>cd Python27

c:\Programs\Python27>python.exe

Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win32

Type “help”, “copyright”, “credits” or “license” for more information.

>>> import mapnik

>>>

^C

c:\Programs\Python27>

4.3 타일 랜더링

가. 타일 생성 랜더링 도구 다운로드

C:\ 폴더에서 SVN으로 타일생성 스크립트를 Export 받는다.

svn export http://svn.openstreetmap.org/applications/rendering/mapnik

 

나. 기타 정보 다운로드

DB를 통해 렌더링하려면 해안선 등에 대한 정보 파일도 필요하기 때문에 아래 사이트에서 미리 다운로드한다.

각 파일을 압축을 풀어 해당 파일들을 C:\mapnik\world_boundaries 폴더로 복사한다.

https://planet.openstreetmap.org/historical-shapefiles/world_boundaries-spherical.tgz

https://planet.openstreetmap.org/historical-shapefiles/processed_p.tar.bz2

https://planet.openstreetmap.org/historical-shapefiles/shoreline_300.tar.bz2

http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places.zip

http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_boundary_lines_land.zip

다. osm.xml 생성

  • 기존에 있던 osm.xml 파일 삭제
  • generate_xml.py 파일 수정

generate_xml.py 파일을 열어 17번째 라인의 ‘prefix’:’planet_osm’, # default osm2pgsql table prefix 을

‘prefix’ : ‘osm’ , # default osm2pgsql table prefix 으로 수정

 

 

  • osm.xml 생성 스크립트 실행
generate_xml.py osm.xml –host localhost –user postgres –dbname osm –symbols symbols/ –world_boundaries world_boundaries/ –port 5432 –password postgres
  • 환경변수 설정

    bbox = (120.0, 32.0, 134.0, 40.0)

    render_tiles(bbox, mapfile, tile_dir, 0, 16 , “Korea”)

 

  • generate_image.py
  • generate_tiles.py 수정

해당 프로젝트는 우리나라에 해당하는 영역만 타일생성을 원하기 때문에 아래처럼 기존에 있던 bbox는 주석 처리하고 하단에 한국 관련 bbox를 추가한다.

# Start with an overview World

    bbox = (-180.0,-90.0, 180.0,90.0)

    render_tiles(bbox, mapfile, tile_dir, 0, 5, “World”)

 

minZoom = 10

maxZoom = 16

#bbox = (-2, 50.0,1.0,52.0)

#render_tiles(bbox, mapfile, tile_dir, minZoom, maxZoom)

 

# Muenchen

#bbox = (11.4,48.07, 11.7,48.22)

#render_tiles(bbox, mapfile, tile_dir, 1, 12 , “Muenchen”)

 

# Muenchen+

#bbox = (11.3,48.01, 12.15,48.44)

#render_tiles(bbox, mapfile, tile_dir, 7, 12 , “Muenchen+”)

 

# Muenchen++

#bbox = (10.92,47.7, 12.24,48.61)

#render_tiles(bbox, mapfile, tile_dir, 7, 12 , “Muenchen++”)

 

# Nuernberg

#bbox=(10.903198,49.560441,49.633534,11.038085)

#render_tiles(bbox, mapfile, tile_dir, 10, 16, “Nuernberg”)

 

# Karlsruhe

#bbox=(8.179113,48.933617,8.489252,49.081707)

#render_tiles(bbox, mapfile, tile_dir, 10, 16, “Karlsruhe”)

 

# Karlsruhe+

#bbox = (8.3,48.95,8.5,49.05)

#render_tiles(bbox, mapfile, tile_dir, 1, 16, “Karlsruhe+”)

 

# Augsburg

#bbox = (8.3,48.95,8.5,49.05)

#render_tiles(bbox, mapfile, tile_dir, 1, 16, “Augsburg”)

 

# Augsburg+

#bbox=(10.773251,48.369594,10.883834,48.438577)

#render_tiles(bbox, mapfile, tile_dir, 10, 14, “Augsburg+”)

 

# Europe+

#bbox = (1.0,10.0, 20.6,50.0)

#render_tiles(bbox, mapfile, tile_dir, 1, 11 , “Europe+”)

 

             # 한국

    bbox = (120.0, 32.0, 134.0, 40.0)

    render_tiles(bbox, mapfile, tile_dir, 0, 16 , “Korea”)

  • 타일생성 : generate_tiles.py 실행

 

태그 ,