OpenStreetMap!

OpenStreetMap

https://osm.kr/about/ wiki: 오픈스트리트맵은 2005년 설립된 영국의 비영리기구 오픈스트리트맵 재단이 운영하는 오픈 소스 방식의 참여형 무료 지도 서비스이다

네이버나 카카오같은 단순 타일맵을 서비스가 아닌 지리공간 데이터베이스 오픈 데이터베이스로써 수정요청이 즉각적으로 받아들여 진다.

http://download.geofabrik.de/ 링크에서 각국, 세계지도 다운로드가 가능하다.

OpoenMapTiles

https://openmaptiles.org/

OpenStreetMap(이하 OSM) 데이터를 WMS(Web Map Service) 로 제공하려면 데이터를 변환하고 vector tile 형태로 제공하는 서버를 설치해야 한다.

우선 OSM 을 vector tile 형태로 변환시키기 위해 PostGIS 에 변환하여 저장한다.

OSM --(import)--> PostGIS --(encode)--> MVT

https://github.com/openmaptiles/openmaptiles

위의 openmaptiles 리포에들어가면 해당작업을 docker를 통해 자동으로 진행할 수 있도록 지원한다.

Data import - imposm, osm2pgsql

데이터 변환 방법으로 imposm, osm2pgssql 두가지 툴이 있으며

둘다 OSM 데이터를 PostGIS 와 같은 데이터베이스에 맞는 형식으로 변환 및 import 하기 위한 툴이다.

mac 에선 모두 brew 를 통해 설치 가능하며
linux 에선 binary 혹은 apt 명령을 통해 설치 가능하다.

https://formulae.brew.sh/formula/osm2pgsql https://formulae.brew.sh/formula/imposm3

PostGIS 설치
sudo systemctl start postgresql.service

docker run -d --name postgis \
    -e POSTGRES_USER=admin \
    -e POSTGRES_PASSWORD=password \
    -e PGDATA=/var/lib/postgresql/data/pgdata \
    -v ~/custom/mount:/var/lib/postgresql/data \
    -p 5432:5432 \
    postgis/postgis:13-3.2-alpine

기본으로 생성된 postgress 의 default 스키마에서 아래 쿼리 사용가능한지 확인

CREATE EXTENSION IF NOT EXISTS postgis CASCADE;

osm2pgsql

https://geoserver.org/tips%20and%20tricks/tutorials/2009/01/30/geoserver-and-openstreetmap.html

osm2pgsql -c -d osm -U admin -W -H 127.0.0.1 -P 5432 south-korea-latest.osm.pbf
# password 입력 후 진행
2022-06-03 11:39:13  Setting up table 'planet_osm_point'
2022-06-03 11:39:14  Setting up table 'planet_osm_line'
2022-06-03 11:39:14  Setting up table 'planet_osm_polygon'
2022-06-03 11:39:14  Setting up table 'planet_osm_roads'

위처럼 4개 데이터가 생성됨 간단히 아래와 같은 정보를 포함한다.

planet_osm_line - 철도, 지하철 및 기타 선형 정보 planet_osm_roads - 도로 정보 planet_osm_point - 지하철역, 쇼핑 센터, 대학, 등 planet_osm_polygon - 테이블에는 공원, 수역 및 특정 도시 지역의 건물 등

툴 설치시에 사용하는 기본 스타일 osm2pgsql/default.style 을 사용

imposm import -connection postgis://admin:password@localhost:5432/osm \
    -mapping example-mapping.yml -read south-korea-latest.osm.pbf -write

mapping 형식 https://imposm.org/docs/imposm3/latest/mapping.html 에서 제공하는 example-mapping.yml 을 사용하여 import

WMS(Web Map Service)

카카오, 다음 처럼 웹에서 제공하는 타일맵 형태의 서비스를 생성하려면 많은과정이 필요하다.

https://wiki.openstreetmap.org/wiki/Tile_servers 벡터 타일을 제공하는 서버는 여러개 있다.

https://github.com/openmaptiles/openmaptiles https://github.com/Overv/openstreetmap-tile-server

OpenStreetMap's Standard tile layer 라고 소개하는 carto 프로젝트가 가장 유명한 듯 하며
해당 프로젝트로 지도 타일맵을 구성해보자.

carto

출처: https://ircama.github.io/osm-carto-tutorials/tile-server-ubuntu https://www.linuxbabe.com/ubuntu/openstreetmap-tile-server-ubuntu-18-04-osm

예제를 통해 서버를 설치하면서 꼭 모든 서버 구성(DB, WEB, Render)을 한 서버에 구성해야 하는지 의구심이 들 수 있는데
DB ID 설정과 PW 로 인해 수정해야할 Config 파일이 너무 많기에 local 에 DB 를 설치하고 전용 계정을 ubuntu 에 생성하는 것을 추천한다.

총 8개 정도의 컴포넌트로 구성되며 흐름은 아래 사진과 같다.

  • Mapnik
  • Apache: 타일 웹서버
  • Mod_tile
  • renderd: 랜더링 컴포넌드
  • osm2pgsql: 데이터 변환 툴
  • PostgreSQL/PostGIS database
  • carto: 타일 디자인
  • openstreetmap-carto: 관련 오픈소스 프로젝트

ddd1

osm2pgsql import OSM to PostGIS

INSTALL 페이지에 들어가보면 osm2pgsql 를 통해 openstreetmap-carto.style 로 데이터를 import 한다.

-d gis 속성이 있음으로 postgisgis 데이터베이스 생성, 그리고 아래 extention 설치

CREATE EXTENSION IF NOT EXISTS postgis CASCADE;
CREATE EXTENSION IF NOT EXISTS hstore CASCADE; -- key,value 필드 타입 지워

openstreetmap-carto.style, openstreetmap-carto.lua 파일은 위 git 참고

$ osm2pgsql -G --hstore \
 --style openstreetmap-carto.style \
 --tag-transform-script openstreetmap-carto.lua \
 -d gis -U admin -H 127.0.0.1 -P 5432 -W \
 south-korea-latest.osm.pbf

데이터 삽입 완료 후 성능을 위해 indexes.sql 파일에 있는 인덱싱 처리 진행

Mpanik + Mod_tile + renderd + Apache

Mapnik 설치

manik: https://github.com/mapnik/mapnik GIS 시각화를 위한 각종 알고리즘과 패턴이 저장된 C++ 기반 라이브러리 Nodejs, Python 에서도 쓸 수 있도록 converting 가능

$ sudo add-apt-repository ppa:ubuntugis/ppa
$ sudo apt-get update
$ sudo apt-get install -y curl unzip gdal-bin mapnik-utils libmapnik-dev python3-pip
$ sudo apt-get install -y git autoconf libtool libxml2-dev libbz2-dev \
  libgeos-dev libgeos++-dev libproj-dev gdal-bin libgdal-dev g++ \
  libmapnik-dev mapnik-utils python3-mapnik

# 설치 확인
$ mapnik-config -v
3.0.23

$ mapnik-config --input-plugins
/usr/lib/mapnik/3.0/input

$ python3 -c "import mapnik;print(mapnik.__file__)"
/usr/lib/python3/dist-packages/mapnik/__init__.py

Apach 설치

sudo apt-get install -y apache2 apache2-dev
sudo service apache2 start

# 설치확인
$ curl localhost| grep 'It works!'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 10918  100 10918    0     0  3554k      0 --:--:-- --:--:-- --:--:-- 5331k
          It works!

Mod_tile, renderd 설치

Mod_tile: https://github.com/openstreetmap/mod_tile 래스터 타일을 제공하는 Apache 2 모듈.

# for add repository
$ sudo apt-get install -y software-properties-common
$ sudo add-apt-repository -y ppa:osmadmins/ppa
$ sudo apt-get update

# this includes both mod-tile and renderd
$ sudo apt-get install -y libapache2-mod-tile 

Nodejs

sudo apt install -y nodejs npm

renderd, mod_tile, Apache 연결

이제 Apache 에 두 컴포넌트를 연결해서 타일 요청을 수신 및 반환해야한다.

$ sudo vi /etc/renderd.conf
; BASIC AND SIMPLE CONFIGURATION:

[renderd]
stats_file=/run/renderd/renderd.stats
socketname=/run/renderd/renderd.sock
num_threads=4
tile_dir=/var/cache/renderd/tiles

[mapnik]
plugins_dir=/usr/lib/mapnik/3.1/input
font_dir=/usr/share/fonts/truetype
font_dir_recurse=true

; ADD YOUR LAYERS:

위 항목을 아래처럼 수정

/usr/lib/mapnik/3.0/input

[renderd]
stats_file=/run/renderd/renderd.stats
socketname=/run/renderd/renderd.sock
num_threads=4
tile_dir=/var/cache/renderd/tiles

[mapnik]
plugins_dir=/usr/lib/mapnik/3.0/input 
# mapnik-config --input-plugins 명령에서 출력된 위치로 수정

font_dir=/usr/share/fonts/truetype
font_dir_recurse=true

[default]
URI=/osm_tiles
TILEDIR=/var/lib/mod_tile
XML=/home/tileserver/src/openstreetmap-carto/style.xml
HOST=localhost
TILESIZE=256

그 외에 manik 에서 인덱싱할때 사용하는 mapnik-utils 설치

sudo apt-get install -y mapnik-utils

ls /var/run/renderd renderd.pid renderd.sock renderd.stats

carto 설치

폰트 설치

sudo apt-get install -y fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted fonts-hanazono ttf-unifont fonts-dejavu-core

nodejs, npm 설치

sudo apt-get install -y nodejs npm

carto 0버전 설치

sudo npm install -g carto@0
carto -v
carto 0.18.2 (Carto map stylesheet compiler)
$ mkdir carto

$ npm install mapnik-reference
$ node -e "console.log(require('mapnik-reference'))"
{
  versions: [
    '2.0.0',  '2.0.1',
    '2.0.2',  '2.1.0',
    '2.1.1',  '2.2.0',
    '2.3.0',  '3.0.0',
    '3.0.3',  '3.0.6',
    '3.0.20', '3.0.22'
  ],
  latest: '3.0.22',
  load: [Function (anonymous)]
}
$ cd ../
$ git clone https://github.com/gravitystorm/openstreetmap-carto.git
$ cd openstreetmap-carto
$ carto -a "3.0.22" project.mml > style.xml
$ ls -l style.xml

GeoServer

wiki: GeoServer(지오서버)는 지리공간 데이터를 공유하고 편집할 수 있는 Java로 개발된 오픈 소스 GIS 소프트웨어 서버이다

web:https://geoserver.org/ git: https://github.com/geoserver/geoserver/tree/2.21.0

Shapefile

지원 파일

http://data.nsdi.go.kr/dataset http://download.geofabrik.de/asia.html

카테고리:

업데이트: