FOSS4Gでの講演で示されているように、Mapbox StudioはMapboxベクタータイルを作成し、それらを.mbtiles
ファイルとしてエクスポートすることができます。
mapbox-gl.jsライブラリはには、動的なスタイルを使用して、クライアント(ブラウザ)側にMapboxベクトルタイルをレンダリングすることができます。
欠けている部分:.mbtiles
mapbox-gl.jsでそれらを使用できるように、Mapboxベクタータイル()を自己ホストするにはどうすればよいですか?
Mapbox StudioはベクタータイルをMapboxサーバーにアップロードし、タイルをホストできることを知っています。しかし、それは私には選択肢ではありません。ベクタータイルを自分のサーバーでホストしたいのです。
以下のTileStreamアプローチは、行き止まりであることが判明しました。Tileliveを使用した実用的なソリューションの私の答えをご覧ください。
ファイルからイメージタイルを提供できるTileStreamを試しました.mbtiles
。
私のウェブページはmapbox-gl v0.4.0を使用しています:
<link href='https://api.tiles.mapbox.com/mapbox-gl-js/v0.4.0/mapbox-gl.css' rel='stylesheet' />
<script src='https://api.tiles.mapbox.com/mapbox-gl-js/v0.4.0/mapbox-gl.js'></script>
JavaScriptスクリプトでmapboxgl.Mapを作成します。
var map = new mapboxgl.Map({
container: 'map',
center: [46.8104, 8.2452],
zoom: 9,
style: 'c.json'
});
c.json
スタイルファイルは、ベクトルタイルソースを設定します。
{
"version": 6,
"sprite": "https://www.mapbox.com/mapbox-gl-styles/sprites/bright",
"glyphs": "mapbox://fontstack/{fontstack}/{range}.pbf",
"constants": {
"@land": "#808080",
"@earth": "#805040",
"@water": "#a0c8f0",
"@road": "#000000"
},
"sources": {
"osm_roads": {
"type": "vector",
"url": "tile.json"
}
},
"layers": [{
"id": "background",
"type": "background",
"paint": {
"background-color": "@land"
}
}, {
"id": "roads",
"type": "line",
"source": "osm_roads",
"source-layer": "roads",
"paint": {
"line-color": "@road"
}
}]
}
...次のTileJSON仕様でtile.json
:
{
"tilejson": "2.1.0",
"tiles": [
"http://localhost:8888/v2/osm_roads/{z}/{x}/{y}.png"
],
"minzoom": 0,
"maxzoom": 12
}
...で実行されているTileStreamサーバーを指しますlocalhost:8888
。TileStreamが開始されました:
node index.js start --tiles="..\tiles"
...ここで、..\tiles
フォルダにはosm_roads.mbtiles
ファイルが含まれています。
この設定では、ウェブページを開くことができますが、背景レイヤーのみが表示されます。ブラウザーのネットワークトレースでは、ズームインするとタイルが実際に読み込まれていることがわかりますが、ブラウザーのJavaScriptエラーコンソールには次の形式のエラーがいくつか含まれています。
Error: Invalid UTF-8 codepoint: 160 in mapbox-gl.js:7
ベクタータイルは.png
画像ではなく、ProtoBufファイルであるため、タイルURL http://localhost:8888/v2/osm_roads/{z}/{x}/{y}.pbf
は実際にはより意味がありますが、それは機能しません。
何か案は?
///
してmbtilesファイルを定義するには:tilelive.load('mbtiles://path/to/osm_roads.mbtiles', function(err, source) {