mapnik 矢量瓦片与原始 geojson 性能

mapnik vector tile vs raw geojson performance

我通过 Mapnik Vector Tile 节点绑定将 120 MB geojson 文件转换为 protobuf 需要 > 2 秒 处理时间。

在另一端提供原始 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);
  })
});

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

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

如果 GeoJSON 适合您,我鼓励您使用它!请注意您的用户可能无法快速下载 120 MB 的情况。

矢量瓦片不是无损的,矢量瓦片简化了几何图形也绕过了瓦片网格交点。所以问题来了,我在矢量图块中的一些多边形没有正确绘制。 你必须意识到这个问题,因为它使我的地块无法使用,因为我总是很容易发现一些地块线没有正确绘制。

第二个矢量瓦片仅受 mapbox GL js 支持,google 地图支持 geojson,openlayer,传单,bing 地图,mapquest 等....mapbox js。

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

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

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

在浏览器中,直接使用 google 地图、bing 地图、openlayer、传单等渲染 geojson....

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