咱们常常遇到直接传输gis数据到前端展现的时候,有时候数据量一稍微多点,传输速度就减慢,由于咱们用于传输的json格式比较大。前端
Geobuf是一种用于地理数据的紧凑二进制编码。
Geobuf 几乎无损地将GeoJSON数据压缩到协议缓冲区中。单独使用GeoJSON的优势:
很是紧凑:一般使GeoJSON小6-8倍。
即便比较gzip大小,也要小2-2.5倍。
很是快速的编码和解码 - 甚至比原生JSON解析/字符串化更快。
能够容纳任何GeoJSON数据,包括具备任意属性的扩展。
轻松增量解析 - 在阅读时获取功能,而无需构建整个数据的内存表示。
部分读取 - 只读取实际须要的部分,跳过其他部分。
与Mapbox Vector Tiles不一样,它的目标是几乎无损压缩数据集-无需平铺,投影坐标,展平几何或剥离属性。
“几乎”无损意味着坐标以小数点后的6位数精度(约10cm)编码(目前还不是无损压缩)
请注意,编码架构尚不稳定-它可能会随着得社区反馈并发现改进它的新方法而改变git
本文中使用PostGIS进行压缩(geobuf有多种压缩方式)github
select ST_AsGeobuf(sample,'geom') FROM (SELECT id,geom from public."California" ) as sample
后端读取二进制传给前端,前端使用pbf和geobuf这两个库进行解压得Geojsonjson
fetch("http://localhost:8081/geobuf/") .then(response => response.arrayBuffer()) .then(buffer => { var vt = new Pbf(buffer); var geojson = geobuf.decode(vt); console.log(JSON.stringify(geojson)) });
数据 | geojson | geosjon(gz) | geobuf(gz) |
---|---|---|---|
20w面 | 57.3MB | 7.6MB | 4.4MB |
1w | 2.83MB | 380kb | 218kb |
参考资料:
https://deck.gl/#/documentation/deckgl-api-reference/layers/tile-layer
https://github.com/mapbox/geobuf后端