PostGIS 백엔드 Vectortile 서버 비교: tegola/martin/pg_tileserv
추상적인
일반적인 경우 벡터타일은 GeoJSON 또는 기타 데이터 소스에서 변환된 파일로 정적으로 제공됩니다. 이것은 서버의 성능과 비용 측면에서 타일을 제공하는 가장 좋은 방법이지만 몇 가지 일반적인 문제가 있습니다.
따라서 DB에서 직접 타일을 동적으로 제공할 수 있는 것이 매우 중요합니다. 물론 이 접근 방식에는 성능과 같은 다른 문제가 있으므로 어떤 접근 방식을 취해야 하는지, 왜, 어떻게 해야 하는지 고려해야 합니다.
2022년 중반에 PostGIS 백엔드 Vectortile 서버에 몇 가지 구현이 있습니다. 이는 PostGIS 테이블에서 벡터타일을 제공하는 데 사용할 수 있습니다.
Martin 및 pg_tileserv는 PostGIS 함수의
ST_AsMVT
를 기반으로 하며 t-rex 및 tegola는 그렇지 않습니다. 이는 martin과 pg_tileserv가 다른 것보다 최신이기 때문입니다. 이 기사에서는 tegola, martin 및 pg_tileserv를 비교했습니다.서버 설정
PostgreSQL
먼저 PostGIS를 시작하고 Docker를 사용하여 샘플 데이터를 삽입합니다…
postgis:
image: kartoza/postgis:12.4
environment:
- POSTGRES_USER=docker
- POSTGRES_PASS=docker
- POSTGRES_DB=postgres
ports:
- "5432:5432"
volumes:
- postgis-data:/var/lib/postgresql
- ./postgres:/usr/src/app
networks:
- default
healthcheck:
test: [ "CMD-SHELL", "pg_isready" ]
interval: 10s
timeout: 5s
retries: 5
PostgreSQL 실행...
docker-compose up -d postgis
다음으로 데이터를 가져오고 삽입합니다. Geofabrik 셰이프 파일을 사용했습니다.
wget https://download.geofabrik.de/asia/japan/kanto-latest-free.shp.zip
unzip kanto-latest-free.shp.zip
ogr2ogr PG:postgresql://docker:docker@localhost:5432/postgres gis_osm_roads_free_1.shp
ogr2ogr PG:postgresql://docker:docker@localhost:5432/postgres gis_osm_buildings_a_free_1.shp -nlt MultiPolygon
그러면 PostgreSQL에서 테이블을 볼 수 있습니다.
SELECT * FROM gis_osm_roads_free_1 LIMIT 10;
SELECT * FROM gis_osm_buildings_a_free_1 LIMIT 10;
테골라
작성중.yml...
tegola:
image: gospatial/tegola
ports:
- "8080:8080"
depends_on:
postgis:
condition: service_healthy
volumes:
- ./tegola:/opt/tegola_config
command: --config /opt/tegola_config/config.toml serve
networks:
- default
tegola
는 config.toml
를 사용하여 다음과 같이 벡터 타일을 생성하고 제공하는 방법 설정을 정의합니다.# /tegola/config.toml
[webserver]
port = ":8080"
CORSAllowedOrigin = "*"
# register data providers
[[providers]]
name = "japan" # provider name is referenced from map layers (required)
type = "postgis" # the type of data provider. currently only supports postgis (required)
host = "postgis" # postgis database host (required)
port = 5432 # postgis database port (required)
database = "postgres" # postgis database name (required)
user = "docker" # postgis database user (required)
password = "docker" # postgis database password (required)
srid = 4326 # The default srid for this provider. If not provided it will be WebMercator (3857)
[[providers.layers]]
name = "roads"
geometry_fieldname = "wkb_geometry"
id_fieldname = "ogc_fid"
tablename = "gis_osm_roads_free_1"
[[providers.layers]]
name = "buildings"
geometry_fieldname = "wkb_geometry"
id_fieldname = "ogc_fid"
tablename = "gis_osm_buildings_a_free_1"
[[maps]]
name = "japan"
center = [139.72120, 35.73273, 11.0] # set the center of the map so the user is auto navigated to Bonn
[[maps.layers]]
provider_layer = "japan.buildings"
min_zoom = 5
max_zoom = 20
[[maps.layers]]
provider_layer = "japan.roads"
min_zoom = 5
max_zoom = 20
이러한 설정을 사용하면 벡터타일은
http://localhost:8080/maps/japan/{z}/{x}/{y}.vector.pbf
로 제공됩니다.남자 이름
구성하다
martin:
image: urbica/martin
restart: unless-stopped
ports:
- 3000:3000
depends_on:
postgis:
condition: service_healthy
networks:
- default
volumes:
- ./martin:/opt/martin_config
command: martin --config /opt/martin_config/config.yaml
martin
는 yml의 설정 파일을 사용하여 tegola
와 유사한 접근 방식을 취합니다.# The socket address to bind [default: 0.0.0.0:3000]
listen_addresses: '0.0.0.0:3000'
# Database connection string
connection_string: 'postgres://docker:docker@postgis/postgres'
# Maximum connections pool size [default: 20]
pool_size: 20
# Connection keep alive timeout [default: 75]
keep_alive: 75
# Number of web server workers
worker_processes: 8
# If a spatial table has SRID 0, then this default SRID will be used as a fallback
default_srid: 4326
# Enable watch mode
watch: false
# Trust invalid certificates. This introduces significant vulnerabilities, and should only be used as a last resort.
danger_accept_invalid_certs: true
# Associative arrays of table sources
table_sources:
public.buildings:
# Table source id (required)
id: public.gis_osm_buildings_a_free_1
# Table schema (required)
schema: public
# Table name (required)
table: gis_osm_buildings_a_free_1
# Geometry SRID (required)
srid: 4326
# Geometry column name (required)
geometry_column: wkb_geometry
# Feature id column name
id_column: ogc_fid
# An integer specifying the minimum zoom level
minzoom: 0
# An integer specifying the maximum zoom level. MUST be >= minzoom
maxzoom: 30
# The maximum extent of available map tiles. Bounds MUST define an area
# covered by all zoom levels. The bounds are represented in WGS:84
# latitude and longitude values, in the order left, bottom, right, top.
# Values may be integers or floating point numbers.
bounds: [-180.0, -90.0, 180.0, 90.0]
# Tile extent in tile coordinate space
extent: 4096
# Buffer distance in tile coordinate space to optionally clip geometries
buffer: 64
# Boolean to control if geometries should be clipped or encoded as is
clip_geom: true
# Geometry type
geometry_type: GEOMETRY
# List of columns, that should be encoded as tile properties (required)
properties:
ogc_fid: integer
name: string
fclass: string
public.roads:
id: public.gis_osm_roads_free_1
schema: public
table: gis_osm_roads_free_1
srid: 4326
geometry_column: wkb_geometry
id_column: ogc_fid
minzoom: 0
maxzoom: 30
bounds: [-180.0, -90.0, 180.0, 90.0]
extent: 4096
buffer: 64
clip_geom: true
geometry_type: GEOMETRY
properties:
ogc_fid: integer
name: string
fclass: string
maxspeed: smallint
벡터타일은
http://localhost:3000/public.roads,public.buildings/{z}/{x}/{y}.pbf
로 제공됩니다.pg_tileserv
구성하다
pg_tileserv:
image: pramsey/pg_tileserv
container_name: pg_tileserv
environment:
- DATABASE_URL=postgres://docker:docker@postgis/postgres
depends_on:
- postgis
ports:
- 7800:7800
pg_tileserv는 구성 파일 없이 실행할 수 있습니다. 테이블이 자동으로 로드됩니다.
벡터타일은
http://localhost:7800/public.gis_osm_buildings_a_free_1,public.gis_osm_roads_free_1/{z}/{x}/{y}.vector.pbf
로 제공됩니다.비교
이제 vectortile 서버를 시작할 수 있습니다!
docker compose up
QGIS에서 다음과 같이 타일을 얻을 수 있습니다...
그러면 동일한 데이터베이스를 사용하기 때문에 세 서버 간에 외관상 차이가 없다고 볼 수 있지만 성능에는 큰 차이가 있을 것입니다. martin과 pg_tileserv는 tegola보다 훨씬 빠릅니다.
왜 다른가요?
나는 tegola 및 martin/pg_tileserv 구현에 대한 세부 사항에 익숙하지 않지만 martin/pg_tileserv는
ST_AsMVT
를 사용하고 tegola는 사용하지 않기 때문인 것 같습니다.파헤쳐보니
ST_AsMVT
가 2018년에 먼저 구현되었고 the performance improved in 2019 .사실 최신 버전의 tegola가
ST_AsMVT
를 지원하는 것 같은데 설정에서 문제가 생겨서 작동이 안되네요.게다가 martin은 pg_tileserv보다 확실히 빠릅니다. 이 차이의 이유는 tegola와 martin/pg_tileserv 사이보다 확실하지 않지만 martin은 가장 빠른 서버(https://www.techempower.com/benchmarks/#section=data-r21)) 중 하나인 Actix-webserver를 사용하므로 어느 정도 차이를 설명할 수 있습니다.
결론
전체 코드
https://github.com/Kanahiro/postgis-tileservers-compare
Reference
이 문제에 관하여(PostGIS 백엔드 Vectortile 서버 비교: tegola/martin/pg_tileserv), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mierune/comparing-postgis-backend-vectortile-servers-tegolamartinpgtileserv-5c6n텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)