Conforme apresentado em uma palestra no FOSS4G, o Mapbox Studio permite criar blocos vetoriais do Mapbox e exportá-los como um .mbtiles
arquivo.
A biblioteca mapbox-gl.js pode ser usada para estilizar e renderizar dinamicamente blocos vetoriais do Mapbox no lado do cliente (navegador).
A parte que falta: como posso auto-hospedar blocos vetoriais do Mapbox ( .mbtiles
) para consumi-los com o mapbox-gl.js?
Eu sei que o Mapbox Studio pode carregar os blocos de vetor no servidor Mapbox e deixá-lo hospedar os blocos. Mas isso não é uma opção para mim, quero hospedar os blocos de vetor no meu próprio servidor.
A abordagem TileStream abaixo acabou sendo um beco sem saída. Veja minha resposta para uma solução funcional com o Tilelive.
Eu tentei o TileStream, que pode exibir imagens de .mbtiles
arquivos:
Minha página da web usa o 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 cria um mapboxgl.Map em um script JavaScript:
var map = new mapboxgl.Map({
container: 'map',
center: [46.8104, 8.2452],
zoom: 9,
style: 'c.json'
});
O c.json
arquivo de estilo configura a origem do bloco de vetores:
{
"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"
}
}]
}
... com a seguinte especificação TileJSON em tile.json
:
{
"tilejson": "2.1.0",
"tiles": [
"http://localhost:8888/v2/osm_roads/{z}/{x}/{y}.png"
],
"minzoom": 0,
"maxzoom": 12
}
... que aponta para o meu servidor TileStream em execução em localhost:8888
. O TileStream foi iniciado com:
node index.js start --tiles="..\tiles"
... onde a ..\tiles
pasta contém meu osm_roads.mbtiles
arquivo.
Com essa configuração, posso abrir minha página da Web, mas apenas ver a camada de plano de fundo. No rastreio da rede do navegador, posso ver que os blocos são realmente carregados quando aumento o zoom, mas o console de erros JavaScript do navegador contém vários erros no formulário
Error: Invalid UTF-8 codepoint: 160 in mapbox-gl.js:7
Como os blocos vetoriais não são .png
imagens, mas arquivos ProtoBuf, a URL dos blocos http://localhost:8888/v2/osm_roads/{z}/{x}/{y}.pbf
realmente faria mais sentido, mas isso não funciona.
Alguma ideia?
///
para definir o arquivo mbtiles em:tilelive.load('mbtiles://path/to/osm_roads.mbtiles', function(err, source) {