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....
这为您提供了一个无损且快速响应的解决方案。
我通过 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....
这为您提供了一个无损且快速响应的解决方案。