FlatGeobuf 編碼格式(fgb) —— 或許是 shp 格式的替代品

FlatGeobuf

一種爲地理圖形數據進行二進制編碼的格式,基於 flatbuffers,它能容納 OGC 發佈的 Simple Features(簡單要素)規範下的數據。javascript

本編碼格式受到 geobufflatbush 的啓發。爲了簡單起見,此編碼特意不支持隨機寫入。此編碼格式使用希爾伯特R樹(Hilbert R-Tree)做爲數據結構,因此其使用範圍框(Bounding Box)來進行空間檢索的速度是很是快的。對於此編碼格式來講,空間索引不是必須的,以便數據能以文件流的形式高效率地寫入,以及適配不須要空間過濾(即空間檢索)的狀況。html

設計目標:大數據量的靜態數據要比傳統格式快,且對於數據量、內容上沒有大小的限制,而且適合流式或隨機訪問。前端

網站 switchfromshapefile.org 介紹了傳統格式(尤爲是 shapefile)的更多比對信息,且提供了一些替代方案,同時也提供了替代方案的存在缺點(例如,不適合流式傳播)。java

FlatGeobuf 是開源的,使用 BSD 2-Clause License 協議。node

譯者注git

所謂流式傳輸,便可以一邊經過 HTTP 傳輸數據,一邊解析並可視化,而沒必要等待一個 fgb 文件所有請求到前端再作繪製,網絡傳過來多少數據,前端就畫多少,極大提高單文件顯示的體驗。github

例子(可能要魔法上網)

規格

  • MB:魔法字符,指示此文件用,即 0x6667620366676200
  • H:頭部信息
  • I:(可選)被打包的靜態希爾伯特R樹 索引數據。
  • DATA:要素數據

在 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%

特性

程序/庫支持

  • Fiona(1.8.18 以上)
  • GDAL(3.1 及以上)
  • Geo Data Viewer(VSCode 插件)(2.3 及以上)
  • GeoServer(2.17及以上)
  • GeoTools(23.0及以上)
  • QGIS(3.16及以上)

文檔

TypeScript / JavaScript

API 文檔

預打包(適用於瀏覽器)

NodeJs 用法

查看 示例

TODO

  • Java 索引支持
  • C 語言支持
  • Go 語言支持

問答

爲何不用 WKB 幾何編碼?

它不是 8字節對齊的編碼。因此,它沒有複製完整的文件以前,最好不要用它。

爲何不用 Protobuf?

性能和隨機讀、流式讀的緣由。

爲何我用 GDAL 沒有達到指望的性能表現?

GDAL 的操做,默認假設數據是不可信的,會進行數據驗證以確保操做安全性。若是你相信你的數據,想要一個最大的性能表現,請設置參數 VERIFY_BUFFERS 爲 NO。

與矢量瓦片比較呢?

FlatGeobuf 與矢量瓦片並沒有競爭關係。矢量瓦片十分適合渲染,可是它是有損格式,並且在建立成本上比較高。FlatGeobuf 是無損格式,若是不須要空間索引數據,數據的寫入(建立)是很是快的。

譯者注

優勢

  • 單文件
  • 支持R樹的空間索引,帶索引的數據讀取性能高
  • 支持流式傳輸
  • 無損格式
  • 文件體積相對不大
  • 多編程語言、多軟件已支持

缺點

  • 不支持像 GeoPackage 格式同樣有擴展能力
  • 幾何與屬性數據並未分離,若能分離,幾何數據可進一步優先傳輸並極大提升渲染速度
  • 建立文件時若使用空間索引,效率上可能會有所打折(可是也比傳統格式快)
  • 文件體積較之於 GeoPackage 格式無明顯優點,沒有使用信息壓縮算法
  • 編碼規範文檔缺少
相關文章
相關標籤/搜索