背景
我們經(jīng)常遇到直接傳輸gis數(shù)據(jù)到前端展示的時候岖常,有時候數(shù)據(jù)量一稍微多點,傳輸速度就減慢拂共,因為我們用于傳輸?shù)膉son格式比較大唆途。
Geobuf介紹
Geobuf是一種用于地理數(shù)據(jù)的緊湊二進制編碼。
Geobuf 幾乎無損地將GeoJSON數(shù)據(jù)壓縮到協(xié)議緩沖區(qū)中焕襟。單獨使用GeoJSON的優(yōu)點:
非常緊湊:通常使GeoJSON小6-8倍陨收。
即使比較gzip大小,也要小2-2.5倍。
非澄皲觯快速的編碼和解碼 - 甚至比原生JSON解析/字符串化更快拄衰。
可以容納任何GeoJSON數(shù)據(jù),包括具有任意屬性的擴展饵骨。
輕松增量解析 - 在閱讀時獲取功能翘悉,而無需構建整個數(shù)據(jù)的內(nèi)存表示。
部分讀取 - 只讀取實際需要的部分居触,跳過其余部分镐确。
與Mapbox Vector Tiles不同,它的目標是幾乎無損壓縮數(shù)據(jù)集-無需平鋪饼煞,投影坐標源葫,展平幾何或剝離屬性。
“幾乎”無損意味著坐標以小數(shù)點后的6位數(shù)精度(約10cm)編碼(目前還不是無損壓縮)
請注意砖瞧,編碼架構尚不穩(wěn)定-它可能會隨著得社區(qū)反饋并發(fā)現(xiàn)改進它的新方法而改變
Geobuf壓縮
本文中使用PostGIS進行壓縮(geobuf有多種壓縮方式)
select ST_AsGeobuf(sample,'geom') FROM (SELECT id,geom from public."California" ) as sample
Geobuf解壓
后端讀取二進制傳給前端息堂,前端使用pbf和geobuf這兩個庫進行解壓得Geojson
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))
});
對比
數(shù)據(jù) | 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