Jak przedstawiono w wykładzie na FOSS4G Mapbox Studio pozwala tworzyć kafelki wektorowe Mapbox i eksportować je jako .mbtiles
plik.
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 .mbtiles
plikó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.json
stylu 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 ..\tiles
folder zawiera mój osm_roads.mbtiles
plik.
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ą .png
obrazami, a raczej plikami ProtoBuf, adres URL kafelków http://localhost:8888/v2/osm_roads/{z}/{x}/{y}.pbf
miał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) {