PostGIS 백엔드 Vectortile 서버 비교: tegola/martin/pg_tileserv

20307 단어

추상적인



일반적인 경우 벡터타일은 GeoJSON 또는 기타 데이터 소스에서 변환된 파일로 정적으로 제공됩니다. 이것은 서버의 성능과 비용 측면에서 타일을 제공하는 가장 좋은 방법이지만 몇 가지 일반적인 문제가 있습니다.
  • 변환을 위한 컴퓨팅 비용이 필요합니다. 타일 수가 많을 때 더 큰 문제가 될 수 있습니다.
  • 데이터베이스와 동일한 데이터를 제공할 수 없습니다.

  • 따라서 DB에서 직접 타일을 동적으로 제공할 수 있는 것이 매우 중요합니다. 물론 이 접근 방식에는 성능과 같은 다른 문제가 있으므로 어떤 접근 방식을 취해야 하는지, 왜, 어떻게 해야 하는지 고려해야 합니다.

    2022년 중반에 PostGIS 백엔드 Vectortile 서버에 몇 가지 구현이 있습니다. 이는 PostGIS 테이블에서 벡터타일을 제공하는 데 사용할 수 있습니다.
  • t-rex(Rust)
  • tegola(Go)
  • martin(Rust)
  • pg_tileserv(Go)

  • 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
    

    tegolaconfig.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를 사용하므로 어느 정도 차이를 설명할 수 있습니다.

    결론


  • martin은 가장 빠른 PostGIS 백엔드 벡터타일 서버입니다.
  • pg_tileserv는 두 번째이지만 구성이 쉽고 기능이 풍부합니다.

  • 전체 코드



    https://github.com/Kanahiro/postgis-tileservers-compare

    좋은 웹페이지 즐겨찾기