Wie in einem Vortrag auf der FOSS4G vorgestellt, können mit Mapbox Studio Mapbox-Vektorkacheln erstellt und als .mbtiles
Datei exportiert werden.
Mit der Bibliothek mapbox-gl.js können Mapbox-Vektorkacheln auf der Client- (Browser-) Seite dynamisch formatiert und gerendert werden.
Der fehlende Teil: Wie kann ich Mapbox-Vektorkacheln ( .mbtiles
) selbst hosten , damit ich sie mit mapbox-gl.js verwenden kann?
Ich weiß, dass Mapbox Studio die Vektorkacheln auf den Mapbox-Server hochladen und die Kacheln hosten kann. Aber das ist für mich keine Option, ich möchte die Vektorkacheln auf meinem eigenen Server hosten.
Der unten stehende TileStream-Ansatz erwies sich als Sackgasse. Siehe meine Antwort für eine funktionierende Lösung mit Tilelive.
Ich habe TileStream ausprobiert , mit dem Bildkacheln aus .mbtiles
Dateien bereitgestellt werden können :
Meine Webseite benutzt 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>
und es erstellt eine mapboxgl.Map in einem JavaScript-Skript:
var map = new mapboxgl.Map({
container: 'map',
center: [46.8104, 8.2452],
zoom: 9,
style: 'c.json'
});
Die c.json
Stildatei konfiguriert die Quelle der Vektorkacheln:
{
"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"
}
}]
}
... mit der folgenden TileJSON-Spezifikation in tile.json
:
{
"tilejson": "2.1.0",
"tiles": [
"http://localhost:8888/v2/osm_roads/{z}/{x}/{y}.png"
],
"minzoom": 0,
"maxzoom": 12
}
... was auf meinen TileStream-Server zeigt, auf dem ausgeführt wird localhost:8888
. TileStream wurde gestartet mit:
node index.js start --tiles="..\tiles"
... wo der ..\tiles
Ordner meine osm_roads.mbtiles
Datei enthält .
Mit diesem Setup kann ich meine Webseite öffnen, aber nur die Hintergrundebene sehen. Im Browser-Netzwerk-Trace kann ich sehen, dass beim Vergrößern zwar Kacheln geladen werden, die JavaScript-Fehlerkonsole des Browsers jedoch mehrere Fehler des Formulars enthält
Error: Invalid UTF-8 codepoint: 160 in mapbox-gl.js:7
Da Vektorkacheln keine .png
Bilder, sondern ProtoBuf-Dateien sind, wäre die Kachel-URL http://localhost:8888/v2/osm_roads/{z}/{x}/{y}.pbf
eigentlich sinnvoller, aber das funktioniert nicht.
Irgendwelche Ideen?
///
, um die mbtiles-Datei zu definieren:tilelive.load('mbtiles://path/to/osm_roads.mbtiles', function(err, source) {