GeoBuf:GeoJson 数据的高效压缩与传输方案(JavaScript里使用)

399 阅读2分钟

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编码的效果如下:

image.png 可见,内容确实是压缩了不少,在网络传输过程中负载小,而且通过浏览器抓包也看不出具体的地理坐标信息了。