Jak przedstawiono w wykładzie na FOSS4G Mapbox Studio pozwala tworzyć kafelki wektorowe Mapbox i eksportować je jako .mbtilesplik.
Biblioteki mapbox-gl.js można dynamicznie stylizować i renderować kafelki wektorowe Mapbox po stronie klienta (przeglądarki).
Brakująca część: w jaki sposób mogę samodzielnie hostować kafelki wektorowe Mapbox ( .mbtiles), aby móc je konsumować za pomocą mapbox-gl.js?
Wiem, że Mapbox Studio może przesyłać kafelki wektorowe na serwer Mapbox i pozwolić mu hostować kafelki. Ale to nie jest dla mnie opcja, chcę hostować kafelki wektorowe na własnym serwerze.
Podejście TileStream poniżej okazało się ślepym zaułkiem. Zobacz moją odpowiedź na działające rozwiązanie z Tilelive.
Wypróbowałem TileStream, który może wyświetlać kafelki z .mbtilesplików:
Moja strona używa 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>
i tworzy mapboxgl.Map w skrypcie JavaScript:
var map = new mapboxgl.Map({
container: 'map',
center: [46.8104, 8.2452],
zoom: 9,
style: 'c.json'
});
Plik c.jsonstylu konfiguruje źródło kafelków wektorowych:
{
"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"
}
}]
}
... z następującą specyfikacją TileJSON w tile.json:
{
"tilejson": "2.1.0",
"tiles": [
"http://localhost:8888/v2/osm_roads/{z}/{x}/{y}.png"
],
"minzoom": 0,
"maxzoom": 12
}
... co wskazuje na mój serwer TileStream działający w localhost:8888. TileStream został uruchomiony z:
node index.js start --tiles="..\tiles"
... gdzie ..\tilesfolder zawiera mój osm_roads.mbtilesplik.
Dzięki tej konfiguracji mogę otworzyć swoją stronę internetową, ale widzę tylko warstwę tła. W śledzeniu sieci przeglądarki widzę, że kafelki są ładowane podczas powiększania, ale konsola błędów JavaScript w przeglądarce zawiera kilka błędów formularza
Error: Invalid UTF-8 codepoint: 160 in mapbox-gl.js:7
Ponieważ kafelki wektorowe nie są .pngobrazami, a raczej plikami ProtoBuf, adres URL kafelków http://localhost:8888/v2/osm_roads/{z}/{x}/{y}.pbfmiałby większy sens, ale to nie działa.
Jakieś pomysły?

///aby zdefiniować plik mbtiles w:tilelive.load('mbtiles://path/to/osm_roads.mbtiles', function(err, source) {