mapnik矢量瓷砖vs原始geojson性能

时间:2016-08-07 15:33:06

标签: mapnik mapbox-gl-js

我遇到了> 2s 120 MB geojson文件转换为protobufMapnik矢量图块节点绑定的处理时间。

另一方面提供原始geosjon文件需要不到200毫秒

这是正常的吗?如果是,那么在geojson上提供矢量切片的重点是什么(我正在使用mapbox-gl-js查看)?

以下是我的代码摘录:

// Load GeoJson into memory

var fs = require("fs");
var content = JSON.parse(fs.readFileSync("us_counties.json"));


// Initialise Mapnik and mercator object

mapnik.register_default_fonts();
mapnik.register_default_input_plugins();

var mercator = new SphericalMercator({
  size: 256
 });

// Vector Tile Router

router.get('/:z/:x/:y.pbf', function(req, res) {

  var bbox = mercator.bbox(
    +req.params.x,
    +req.params.y,
    +req.params.z,
    false,
    '4326'
  );

  // Convert GEOJSON to protobuf VectorTile and Serve

  var vtile = new mapnik.VectorTile(+req.params.z, +req.params.x, +req.params.y)
  vtile.addGeoJSON(JSON.stringify(content), 'fixture_layer')

  res.setHeader('Content-Encoding', 'deflate')
  res.setHeader('Content-Type', 'application/x-protobuf')


  zlib.deflate(vtile.getData(), function(err, pbf) {
    res.send(pbf);
  })
});

2 个答案:

答案 0 :(得分:3)

GeoJSON和矢量切片各有优缺点,作为Mapbox GL的数据格式。

  • 矢量图块需要比GeoJSON
  • 更多的预处理
  • GeoJSON必须完整下载,而矢量图块可以根据需要下载到视图中以填充视口(几乎不可能将所有Open Street Map作为单个X00 GB GeoJSON下载!)
  • GeoJSON可以在客户端修改,而矢量图块不能
  • GeoJSON是人类可读的,而矢量图块不是

如果GeoJSON为您服务,我建议您使用它!请注意您的用户可能无法快速下载120 MB的情况。

答案 1 :(得分:0)

矢量图块不是无损的,矢量图块也可以简化几何图形,也可以在角落到图块网格交点处。所以这里有问题,我的矢量图块中的一些多边形没有正确绘制。 你必须意识到这个问题,因为它使我的包裹不可用,因为总是我很容易发现一些包裹线没有正确绘制。

第二个矢量图块仅支持mapbox GL js,geojson支持google map,openlayer,leaflet,bing map,mapquest等.... mapbox js。

如果您担心geojson的性能,这是解决方案:

在服务器端,使用geobuf,将geojson序列化(编码)为协议缓冲区二进制格式,它压缩到原始geojson大小的20%。 120MB-geojson-20MB geobuf。

通过互联网从服务器向客户端浏览器传输20MB geobuf, 再次使用geobuf(javascript lib)解码到geojson。

在浏览器中,直接使用谷歌地图,bing地图,开放层,传单等渲染geojson ....

这为您提供了无损快速的响应解决方案。