一種爲地理圖形數據進行二進制編碼的格式,基於 flatbuffers,它能容納 OGC 發佈的 Simple Features(簡單要素)規範下的數據。javascript
本編碼格式受到 geobuf 和 flatbush 的啓發。爲了簡單起見,此編碼特意不支持隨機寫入。此編碼格式使用希爾伯特R樹(Hilbert R-Tree)做爲數據結構,因此其使用範圍框(Bounding Box)來進行空間檢索的速度是很是快的。對於此編碼格式來講,空間索引不是必須的,以便數據能以文件流的形式高效率地寫入,以及適配不須要空間過濾(即空間檢索)的狀況。html
設計目標:大數據量的靜態數據要比傳統格式快,且對於數據量、內容上沒有大小的限制,而且適合流式或隨機訪問。前端
網站 switchfromshapefile.org 介紹了傳統格式(尤爲是 shapefile)的更多比對信息,且提供了一些替代方案,同時也提供了替代方案的存在缺點(例如,不適合流式傳播)。java
FlatGeobuf
是開源的,使用 BSD 2-Clause License
協議。node
譯者注git
所謂流式傳輸,便可以一邊經過 HTTP 傳輸數據,一邊解析並可視化,而沒必要等待一個 fgb 文件所有請求到前端再作繪製,網絡傳過來多少數據,前端就畫多少,極大提高單文件顯示的體驗。github
0x6667620366676200
在 fgb 文件中,任何 64 位 flatbuffer 數據值(例如座標數據)必須進行 8字節對齊,以便直接進行內存訪問。算法
任何字符串值假定其編碼爲 UTF-8。typescript
從 OSM 上下載的一份 shapefile 文件,約 90 萬條線要素,選取五種格式的各方面性能比對以下表:編程
Shapefile | GeoPackage | FlatGeobuf | GeoJSON | GML | |
---|---|---|---|---|---|
讀取完整數據 | 100% | 102% | 46% | 1500% | 890% |
使用空間索引讀取 | 100% | 94% | 71% | 70500% | 39900% |
寫入完整數據 | 100% | 77% | 39% | 390% | 320% |
帶空間索引寫入 | 100% | 158% | 65% | - | - |
文件大小 | 100% | 72% | 77% | 120% | 210% |
此測試使用 GDAL 的 FlatGeobuf 驅動,設置讀取參數爲 ogrinfo -qq -oo VERIFY_BUFFERS=NO
進行循環重複讀取數據。對於文件寫入的測試中,使用 ogr2ogr
以及分別使用參數 -lco SPATIAL_INDEX=NO
和 -lco SPATIAL_INDEX=YES
將原始數據轉換成新文件。
在空間索引的測試項中,只選取了一個比較小的範圍框,它範圍內僅有 1204 個要素,僅僅是爲了測試空間索引的性能。
使用一份由 251萬多個多邊形的數據來進行性能測試,結果以下表:
Shapefile | GeoPackage | FlatGeobuf | |
---|---|---|---|
讀取完整數據 | 100% | 23% | 12% |
使用空間索引讀取 | 100% | 31% | 26% |
寫入完整數據 | 100% | 95% | 63% |
以空間索引寫入 | 100% | 107% | 70% |
文件大小 | 100% | 77% | 95% |
查看 示例。
它不是 8字節對齊的編碼。因此,它沒有複製完整的文件以前,最好不要用它。
性能和隨機讀、流式讀的緣由。
GDAL 的操做,默認假設數據是不可信的,會進行數據驗證以確保操做安全性。若是你相信你的數據,想要一個最大的性能表現,請設置參數 VERIFY_BUFFERS
爲 NO。
FlatGeobuf 與矢量瓦片並沒有競爭關係。矢量瓦片十分適合渲染,可是它是有損格式,並且在建立成本上比較高。FlatGeobuf 是無損格式,若是不須要空間索引數據,數據的寫入(建立)是很是快的。