Come presentato in un discorso a FOSS4G Mapbox Studio consente di creare riquadri vettoriali Mapbox ed esportarli come .mbtiles
file.
La libreria mapbox-gl.js può essere utilizzata per lo stile dinamico e il rendering dei riquadri vettoriali di Mapbox sul lato client (browser).
La parte mancante: Come posso ospitare autonomamente i riquadri vettoriali di Mapbox ( .mbtiles
) in modo da poterli utilizzare con mapbox-gl.js?
So che Mapbox Studio può caricare i riquadri vettoriali sul server Mapbox e lasciarlo ospitare. Ma questa non è un'opzione per me, voglio ospitare i riquadri vettoriali sul mio server.
L'approccio TileStream di seguito si è rivelato essere un vicolo cieco. Vedi la mia risposta per una soluzione funzionante con Tilelive.
Ho provato TileStream che può servire da riquadri di immagini a .mbtiles
file:
La mia pagina web utilizza 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>
e crea un mapboxgl.Map in uno script JavaScript:
var map = new mapboxgl.Map({
container: 'map',
center: [46.8104, 8.2452],
zoom: 9,
style: 'c.json'
});
Il c.json
file di stile configura l'origine del riquadro vettoriale:
{
"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"
}
}]
}
... con la seguente specifica TileJSON in tile.json
:
{
"tilejson": "2.1.0",
"tiles": [
"http://localhost:8888/v2/osm_roads/{z}/{x}/{y}.png"
],
"minzoom": 0,
"maxzoom": 12
}
... che punta al mio server TileStream in esecuzione su localhost:8888
. TileStream è stato avviato con:
node index.js start --tiles="..\tiles"
... dove la ..\tiles
cartella contiene il mio osm_roads.mbtiles
file.
Con questa configurazione, posso aprire la mia pagina web ma vedere solo il livello di sfondo. Nella traccia della rete del browser posso vedere che i riquadri vengono effettivamente caricati quando ingrandisco, ma la console degli errori JavaScript del browser contiene diversi errori del modulo
Error: Invalid UTF-8 codepoint: 160 in mapbox-gl.js:7
Poiché le tessere vettoriali non sono .png
immagini ma piuttosto file ProtoBuf, l'URL delle tessere http://localhost:8888/v2/osm_roads/{z}/{x}/{y}.pbf
avrebbe effettivamente più senso, ma non funziona.
Qualche idea?
///
per definire il file mbtiles in:tilelive.load('mbtiles://path/to/osm_roads.mbtiles', function(err, source) {