tilestrata-vtile-composite插件用来合并多个矢量瓦片图层,这些矢量瓦片图层来自于tilestrata-vtile插件。使用这个插件必须安装依赖node-mapnik。
这个插件的作用和tilestrata-blend类似,只是适用对象是 vtile 生产出来的矢量瓦片。
demo 项目可以参考tilestrata-sample-code
1. 安装
$ npm install tilestrata-vtile-composite --save
|
2. 使用
const tilestrata = require('tilestrata') const vtile = require('tilestrata-vtile') const vtilecomposite = require('tilestrata-vtile-composite') const headers = require('tilestrata-headers')
const server = tilestrata()
const provinceXml = { xml: 'style/province.xml', tileSize: 256, metatile: 1, bufferSize: 128 }
const worldXml = { xml: 'style/world.xml', tileSize: 256, metatile: 1, bufferSize: 128 }
server .layer('province_pbf') .route('t.pbf') .use(vtile(provinceXml))
server .layer('world_pbf') .route('t.pbf') .use(vtile(worldXml))
server .layer('combined_pbf') .route('combined.pbf') .use( headers({ 'Access-Control-Allow-Origin': '*' }) ) .use(vtilecomposite([['world_pbf', 't.pbf'], ['province_pbf', 't.pbf']]))
server.listen(9527)
|
3. 效果
demo 项目可以参考tilestrata-sample-code
这是单独的中国区域 pbf:

这是单独的世界区域 pbf:

合并之后的图层:

4. 代码浅析
其实原理也就解释了为什么官方说明中一定要在依赖中加入node-mapnik。核心代码如下:
function compositeTiles(callback) { if (vtiles.length === 0) return callback()
var merged = new mapnik.VectorTile(req.z, req.x, req.y) merged.composite(vtiles, function(err) { vtiles = null if (err) return callback(err)
result = merged.getData(dataopts) result._vtile = merged result._vx = req.x result._vy = req.y result._vz = req.z callback() }) }
|
在连续请求完两个数据源的数据之后,新建 mapnik 的VectorTile对象,并调用其VectorTile.composite方法,对两个数据源请求来的数据进行合并,最后再getData输出结果就好。