正如在FOSS4G上的演讲中所介绍的那样,Mapbox Studio允许创建Mapbox矢量图块并将其导出为.mbtiles
文件。
所述mapbox-gl.js库可以被用于动态风格和渲染在客户端(浏览器)侧Mapbox矢量瓷砖。
缺少的部分:如何自托管Mapbox矢量图块(.mbtiles
),以便可以通过mapbox-gl.js使用它们?
我知道Mapbox Studio可以将矢量图块上传到Mapbox服务器,并让其托管图块。但这对我来说是没有选择的,我想将矢量切片托管在自己的服务器上。
事实证明,下面的TileStream方法是死胡同。请参阅我的答案以获取Tilelive的有效解决方案。
我尝试了TileStream,它可以从.mbtiles
文件中提供图像切片:
我的网页使用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>
并在JavaScript脚本中创建mapboxgl.Map:
var map = new mapboxgl.Map({
container: 'map',
center: [46.8104, 8.2452],
zoom: 9,
style: 'c.json'
});
该c.json
样式文件配置矢量瓦来源:
{
"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"
}
}]
}
...在中具有以下TileJSON规范tile.json
:
{
"tilejson": "2.1.0",
"tiles": [
"http://localhost:8888/v2/osm_roads/{z}/{x}/{y}.png"
],
"minzoom": 0,
"maxzoom": 12
}
...指向运行在的我的TileStream服务器localhost:8888
。TileStream已开始于:
node index.js start --tiles="..\tiles"
... ..\tiles
文件夹中包含我的osm_roads.mbtiles
文件的位置。
使用此设置,我可以打开我的网页,但只能看到背景层。在浏览器网络跟踪中,我可以看到在放大时确实加载了图块,但是浏览器JavaScript错误控制台包含几种形式的错误
Error: Invalid UTF-8 codepoint: 160 in mapbox-gl.js:7
由于矢量切片不是.png
图像而是ProtoBuf文件,因此切片URL http://localhost:8888/v2/osm_roads/{z}/{x}/{y}.pbf
实际上更有意义,但这是行不通的。
有任何想法吗?
///
文件来定义mbtiles文件:tilelive.load('mbtiles://path/to/osm_roads.mbtiles', function(err, source) {