Geobuf 是一种用于地理数据的紧凑二进制编码方案。它几乎无损地将 GeoJSON 数据压缩为 Protocol Buffers 的表示形式,显著提升传输与解析效率,同时尽量保留 GeoJSON 的语义与灵活性。
- 极高的压缩比:在大多数场景下,GeoJSON 的体积通常缩小 6–8 倍;即便与 gzip 相比,Geobuf 的压缩率也通常优于 2–2.5 倍。
- 极快的编码/解码:编码和解码性能通常优于原生 JSON 的解析与字符串化,尤其是在处理大规模要素集时更为明显。
- 对 GeoJSON 的完全兼容性:Geobuf 能容纳任意 GeoJSON 数据结构及扩展属性,无需舍弃任何原生语义。
- 支持增量解析与部分读取:在读取时就能按要素逐步获取信息,而不需要一次将整个数据集加载到内存中。
- 分区读取与按需加载:允许只读取实际需要的分区或要素,跳过其余部分,以优化内存与带宽成本。
空间数据库里的geobuf:
select ST_AsGeobuf(sample,'geom') FROM (SELECT id,geom from public."California" ) as sample
JavaScript里的Geobuf
GeoBuf最原始的可以用JS调用,将geojson编码为pbf,同样可以将pbf解码为二进制。具体的JavaScript操作代码如下:
首先安装依赖:
npm i pbf geobuf
之后在js代码里导入
// nodejs导入
const geobuf = require('geobuf');
const Pbf = require('pbf').default; // 注意这里的 .default
// ES6导入
import Pbf from 'pbf'; // 或者 import * as Pbf from 'pbf';
使用其对GeoJSON处理
const geojson = {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [116.41, 39.91]
},
"properties": {
"name": "北京市"
}
},
]
}
// 对GeoJSON编码
const geobufData = geobuf.encode(geojson, new Pbf);
// 对GeoJSON解码
const decodedGeojson = geobuf.decode(new Pbf(geobufData));
geobuf编码的效果如下:
可见,内容确实是压缩了不少,在网络传输过程中负载小,而且通过浏览器抓包也看不出具体的地理坐标信息了。