tilestrata-dependency插件其实就是共享其他图层的数据源,如果你想定义两个不同格式的图层,例如分别是 png 和 jpg,这个插件就会非常的便利。你甚至可以传入一个 function 来精确控制不同层级使用不同图层的数据源。
demo 项目可以参考tilestrata-sample-code
1. 安装
$ npm install tilestrata-dependency --save
|
2. 使用
const tilestrata = require('tilestrata') const dependency = require('tilestrata-dependency') const mapnik = require('tilestrata-mapnik')
const server = tilestrata()
server .layer('world_merc_png') .route('tile.png') .use( mapnik({ pathname: 'style/world.xml' }) )
server .layer('world_merc_jpg') .route('tile.jpg') .use(dependency('world_merc_png', 'tile.png'))
server .layer('function_layer') .route('tile.jpg') .use(dependency(function(req) { if (req.z < 5) { return ['world_merc_png', 'tile.png']; } return ['world_merc_jpg', 'tile.jpg']; });
server.listen(9527)
|
3. 效果
demo 项目可以参考tilestrata-sample-code
world_merc_png和world_merc_jpg使用了相同的源,展示的内容一模一样:

4. 代码浅析
要弄清楚dependency插件的实现,首先要弄清楚它的类型,dependency 源代码很简单,它属于Providers类型的插件:
serve: function(server, tile, callback) { callback(err, buffer, headers); },
|
接下来的代码主要逻辑就是如何利用指定的图层源创造一个buffer返回给新图层,以下代码就是 server 函数,有所精简:
var mock = req.clone()
var source = getSource(req)
mock.layer = source[0] mock.filename = source[1]
server.serve(mock, false, function(status, buffer, headers) { if (status === 200) { callback(null, buffer, headers) } else { callback(err) } })
|
当前图层拿到了 buffer 内容,只要再进入自己后续的加工逻辑,处理成指定格式返回就好了。