4

概要

.geojson ファイルがあり、( tippecanoe / geobuf / その他を使用して) それらを .mbtiles または .pbf ファイルに変換して、サーバー ( TileServer-GL / OpenMapTiles / その他のベクター タイル サーバー) から Google マップにベクター タイルとして提供したいと考えています。 Deck.GLMVTLayer

予想された結果:

  1. .mbtiles ファイルの代わりに TileServer-GL .pbf ファイルからサービスを提供できるようにします。
  2. 特定の .mbtiles ファイルでフォルダーを明示的に開始することなく、TileServer-GL から複数の .mbtiles (または .pbf) ファイルをフォルダーから提供できるようにします。

実績:

  1. 以下に示すように、Deck.GL MVTLayerとベクター タイルを統合した Google マップを使用して、TileServer-GL から特定の .mbtiles ファイルを形状またはポイントのコレクションとして提供しています。
  2. 何も管理しませんでした。

私の試み

const map = new google.maps.Map(document.getElementById('container'), {
        center: { lat: 51.47, lng: 0.45 },
        zoom: 10
    });
const deckOverlay = new deck.GoogleMapsOverlay({
        layers: [
            new deck.MVTLayer({
                //working               
                data: `http://localhost:8080/data/SA1_2016-AU-tippecanoe/{z}/{x}/{y}.pbf`,
                //expected, but server NOT starting
                //data: `http://localhost:8080/data/SA1_2016-AU-geobuf/{z}/{x}/{y}.pbf`,

                minZoom: 0,
                maxZoom: 23,
                getLineColor: [1, 1, 1],
                getFillColor: [0, 153, 76],
                pickable: true,
                autoHighlight: true,
                onClick: info => info.object && console.log('onClick', info.object)
            })
        ]
    });
deckOverlay.setMap(map);

データ ファイルを含むフォルダーから、Docker から TileServer-GL を実行しています。

docker run --rm -it -v ${pwd}:/data -p 8080:80 maptiler/tileserver-gl --verbose --mbtiles SA1_2016-AU-tippecanoe.mbtiles

Docker から、tippecanoe を使用して .geojson ファイルを .mbtiles ファイルに変換しています。ただし、大きなファイルの場合、変換に時間がかかるようです。約 890 MB の .mbtiles ファイルを取得しています。57,000 個の機能を含む 45 MB の .geojson ファイルから 60 分。

docker run -it --rm -v ${pwd}:/data tippecanoe:latest tippecanoe --output=/data/SA1_2016-AU-tippecanoe.mbtiles /data/SA1_2016-AU.geojson

geobuf (json2geobuf) を使用して、.geojson ファイルを直接 .pbf ファイルに高速に変換することができました。約 32 MB の .pbf ファイルを取得しています。57,000 個の特徴を含む 45 MB の .geojson ファイルから 37 秒。

json2geobuf SA1_2016-AU.geojson > SA1_2016-AU-geobuf.pbf

ただし、TileServer-GL からも OpenMapTiles-Server からも .pbf ファイルを直接提供できないようです。


私は試した

docker run --rm -it -v ${pwd}:/data -p 8080:80 maptiler/tileserver-gl --verbose --mbtiles SA1_2016-AU-geobuf.pbf

しかし、TileServer-GL が起動しません。

ERROR: Metadata missing in the MBTiles.
       Make sure SA1_2016-AU-geobuf.pbf is valid MBTiles

config.json ファイルをローカルに作成した後、再実行も試みました

docker run --rm -it -v ${pwd}:/data -p 8080:80 maptiler/tileserver-gl --verbose --mbtiles SA1_2016-AU-geobuf.pbf
docker run --rm -it -v ${pwd}:/data -p 8080:80 maptiler/tileserver-gl --verbose SA1_2016-AU-geobuf.pbf

config.json

{
  "options": {
    "paths": {
      "root": "/usr/src/app/node_modules/tileserver-gl-styles",
      "fonts": "fonts",
      "styles": "styles",
      "mbtiles": "/data"
    }
  },
  "styles": {},
  "data": {
    "SA1_2016-AU-geobuf": {
      "mbtiles": "SA1_2016-AU-geobuf.pbf"
    }
  }
}

しかし、TileServer-GL が起動しません。

SQLITE_NOTADB: file is not a database

OpenMapTiles サーバーでは、入力ファイルを指定する方法さえ見つかりません (参照):

docker run --rm -it -v ${pwd}:/data -p 8080:80 klokantech/openmaptiles-server

私の質問

  1. TileServer-GL または OpenMapTiles サーバーで .mbtiles ファイルの代わりに .pbf ファイルを直接提供するにはどうすればよいですか?
  2. TileServer-GL を使用して、特定の .mbtiles ファイルで明示的に開始せずに、フォルダーからすべてのファイル (.mbtiles) を提供するにはどうすればよいですdocker ... maptiler/tileserver-gl --mbtiles some-file.mbtilesか?

4

1 に答える 1

2

Geobuf pbf はタイル化されたデータセットではありませんが、geojson ( https://github.com/mapbox/geobuf/blob/master/README.md#geobuf ) よりも小さくコンパクトなバイナリ形式です。z/x/y タイル スキーマ ( https://github.com/mapbox/tippecanoe#input-files-and-layer-names )で pbf の mbtiles またはディレクトリを作成するには、tippecanoe を介してその geobuf を実行する必要があります。

を使用して geojson を ndjson に変換すると、tippecanoe を使用すると、ランタイムがはるかに高速になりtippecanoe-json-tool input.geojson > output_nd.geojsonます-P。また、tippecanoe の入力が geobuf ファイル ( https://github.com/mapbox/tippecanoe#parallel-processing-of-input ) の場合、tippecanoe 並列処理もデフォルトで有効になっています。ndjson ファイルを使用する単純な tippecanoe コマンドは、tippecanoe -t /dev/shm -o output.mbtiles -P -Z 1 -z 12 --drop-smallest-as-needed output_nd.geojson.

tileserver-gl に関しては、必要な数の mbtiles ファイルをサーバー化できますが、独自の config.json を提供し、それを container にマウントし、 cmdでフラグを-v ${pwd}/config:/config使用して明示的に呼び出す必要があります。--configdocker run

以下のような単純なシェル スクリプトを使用すると、カスタム スタイルを使用する場合はスタイルを、カスタム フォントを使用する場合はフォントを、カスタム スプライトを使用する場合はスプライトを、データおよび構成ファイルと共に、より細かく制御できます。

#!/usr/bin/env bash

TILESERVER_HOME=/tileserver-gl

DATA_DIR=${TILESERVER_HOME}/mbtiles/
CONFIG_DIR=${TILESERVER_HOME}/config/
STYLE_DIR=${TILESERVER_HOME}/styles/
SPRITES_DIR=${TILESERVER_HOME}/sprites/
FONT_DIR=${TILESERVER_HOME}/fonts/

docker stop tileserver-gl && docker rm tileserver-gl

docker run --log-driver json-file --log-opt compress=true --log-opt max-size=100m --log-opt max-file=3 -d --name tileserver-gl --restart=always -v ${SPRITES_DIR}:/sprites -v ${DATA_DIR}:/data -v ${STYLE_DIR}:/styles -v ${FONT_DIR}:/fonts -v ${CONFIG_DIR}:/config -p 0.0.0.0:8080:80 maptiler/tileserver-gl:latest --verbose --config /config/config.json

複数の mbtiles ファイルをリストする上記の docker cmd に対応する config.json の例。

{
    "options": {
        "paths": {
            "root": "",
            "fonts": "../fonts",
            "mbtiles": "../data",
            "styles": "../styles",
            "sprites": "../sprites"
        }
    },
    "data": {
        "STREETS": {
            "mbtiles": "STREETS.mbtiles"
        },
        "LANDMASS": {
            "mbtiles": "LANDMASS.mbtiles"
        },
        "CONTOUR": {
            "mbtiles": "CONTOUR.mbtiles"
        },
        "HILLSHADE": {
            "mbtiles": "HILLSHADE.mbtiles"
        },
        "OSM": {
            "mbtiles": "OSM.mbtiles"
        }
    },
    "styles": {
        "STREETS": {
            "style": "STREETS/style.json",
            "serve_data": true,
            "serve_rendered": true,
            "tilejson": {
                "format": "png",
                "bounds": [
                    -120,
                    -50,
                    160,
                    80
                ]
            }
        },
        "OSM-POSITRON": {
            "style": "OSM-POSITRON/style.json",
            "serve_data": true,
            "serve_rendered": true,
            "tilejson": {
                "format": "png",
                "bounds": [
                    4.3026,
                    48.6085,
                    4.42742,
                    48.707
                ]
            }
        }
    }
}
于 2021-02-18T19:43:28.300 に答える