Como se presentó en una charla en FOSS4G, Mapbox Studio permite crear mosaicos vectoriales de Mapbox y exportarlos como un .mbtiles
archivo.
La biblioteca mapbox-gl.js se puede usar para diseñar y representar dinámicamente mosaicos vectoriales de Mapbox en el lado del cliente (navegador).
La parte que falta: ¿cómo puedo alojar los mosaicos vectoriales de Mapbox ( .mbtiles
) para poder consumirlos con mapbox-gl.js?
Sé que Mapbox Studio puede cargar los mosaicos vectoriales en el servidor de Mapbox y dejar que aloje los mosaicos. Pero esa no es una opción para mí, quiero alojar los mosaicos de vectores en mi propio servidor.
El enfoque de TileStream a continuación resultó ser un callejón sin salida. Vea mi respuesta para una solución de trabajo con Tilelive.
Intenté TileStream, que puede servir mosaicos de imágenes de .mbtiles
archivos:
Mi página web usa 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>
y crea un mapboxgl.Map en un script JavaScript:
var map = new mapboxgl.Map({
container: 'map',
center: [46.8104, 8.2452],
zoom: 9,
style: 'c.json'
});
El c.json
archivo de estilo configura la fuente de mosaico vectorial:
{
"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 siguiente especificación TileJSON en tile.json
:
{
"tilejson": "2.1.0",
"tiles": [
"http://localhost:8888/v2/osm_roads/{z}/{x}/{y}.png"
],
"minzoom": 0,
"maxzoom": 12
}
... que apunta a mi servidor TileStream ejecutándose en localhost:8888
. TileStream se ha iniciado con:
node index.js start --tiles="..\tiles"
... donde la ..\tiles
carpeta contiene mi osm_roads.mbtiles
archivo.
Con esta configuración, puedo abrir mi página web pero solo ver la capa de fondo. En el rastreo de la red del navegador, puedo ver que los mosaicos se cargan cuando hago un acercamiento, pero la consola de errores de JavaScript del navegador contiene varios errores del formulario
Error: Invalid UTF-8 codepoint: 160 in mapbox-gl.js:7
Dado que los mosaicos vectoriales no son .png
imágenes, sino más bien archivos ProtoBuf, la URL de los mosaicos en http://localhost:8888/v2/osm_roads/{z}/{x}/{y}.pbf
realidad tendría más sentido, pero eso no funciona.
¿Algunas ideas?
///
para definir el archivo mbtiles en:tilelive.load('mbtiles://path/to/osm_roads.mbtiles', function(err, source) {