GeoParquet v1.1 の変更点と対応状況(2024年末時点)
GeoParquet のレポジトリで「パーティショニングのベストプラクティスどんな感じ?」というディスカッションがあったので読んでいると、GeoParquet v1.1 でいろいろ変わったことを知りました。というか、ひとくちに GeoParquet と言っても色々ある、という状況になってるっぽいので、勉強がてらまとめてみようと思います。何かおかしな点があればツッコミをください(GIS 初心者です)。
GeoParquet v1.1 の主な変更点
GeoParquet v1.1 は今年6月にリリースされました。2023年9月に v1.0 がリリースされていて、そこから約1年ぶりのリリースです。
リリース: https://github.com/opengeospatial/geoparquet/releases/tag/v1.1.0
仕様: https://geoparquet.org/releases/v1.1.0/
リリースノートに書かれているように、このバージョンでは重要な仕様追加が2つあります。
1. per-row bounding box の仕様が追加された
bounding box については、v1.0 の仕様にも bbox
というメタデータは定義されていましたが、これはファイル全体の領域を表すものでした。v1.1 で追加されたのは、 covering
というメタデータで、ここにレコードごとの bbox 情報のカラム名が入ります(実質、bbox
というカラム名で固定?)。GeoParquet を読むソフトウェアが賢ければ、まずこの bbox カラムの値で必要な行を絞り込んで、読み込むデータを減らすことができます。
ただし、covering
は必須のメタデータではないので、省略されることもあります。なので、 v1.1 ならば必ず使えるわけではなく、
- データ生成側が
covering
を含めている - データ読み取り側が
covering
に対応している
という場合にのみ絞り込みが可能になります。
2. データの中身に GeoArrow のフォーマットも使えるようになった
v1.0 では、実際のジオメトリは WKB で表されていました。v1.1 では、それに加えて「native encoding」も使えるようになりました。native encoding は、GeoArrow をベースにしたもので、WKB と違う点としては、
- データを再度パースする必要がない(なので「native」)
- Apache Arrow は統計情報を含められるので、それを活用できるかも
というあたりのようです。
ちょっと気がかりな点は、たぶん読み取り側が WKB しか想定してないと native encoding のデータは読めない...?
GeoParquet v1.1 の対応状況
GDAL
GDAL は v3.9.1(今年6月リリース)で読み書きともに対応しているみたいです。
https://github.com/OSGeo/gdal/blob/v3.9.0/NEWS.md:
Parquet driver:
- support reading and writing layer metadata
- Read/write support for covering.bbox struct columns for spatial filtering, add SORT_BY_BBOX=YES/NO layer creation option (GeoParquet 1.1)
- Read/write support for GeoArrow (struct-based) encoding (GeoParquet 1.1)
補足すると、v3.9.0(今年5月リリース)の時点で機能的にはほぼ対応していたものの、GeoParquet v1.1 のリリース前だったのでバージョン番号が v1.0 になっていたみたいです。なので、(あまりないと思いますが)GDAL v3.9.0 を使ったソフトウェアで GeoParquet を生成すると正しくないフォーマットのファイルになってしまうようです。v3.9.1 は以下の修正がバックポートされているので問題ありません。
DuckDB
GeoParquet のサポートは、DuckDB v1.1.0(今年9月にリリース)で追加されています。
このリリースノートには GeoParquet の詳細についての記載はないのですが、
今年6月の pull request では
Right now we only support the GeoParquet 1.0 WKB encoding (thus only wrapping the StringColumnWriter), but in the future we want to support other encodings (like those specified in GeoParquet 1.1.0) that encode into structs and lists.
と書かれていて、コードを読む感じ今も WKB 以外の encoding はサポートされていなさそうです。
ただ、一方で、バージョンに関わらず bbox
というカラムがあればそれを空間インデックス構築に使うような実装になっているようです。GeoParquet 1.1 coming soon! という GeoParquet の開発者の人が書いたブログ記事でも DuckDB を推していたので、ほぼ対応できていると考えて問題なさそうです。
(このあたりから察するに、まだ native encoding で書き出されている v1.1 のデータは少ない...?)
GeoPandas (Python)
GeoPandas は、v1.0.0(今年6月リリース)で GeoParquet v1.1 の読み書き、bbox
カラムのサポートが追加されています。たぶん GDAL 経由なのでフル対応してる気がします。
sf (R)
GDAL のバージョンやビルドオプションによりそうです。
手元の Windows だと、GDAL v3.9.3 だったのでいけそうな気がしたんですが、sf::st_drivers()
で確認しても Parquet のドライバはなかったので、有効になってなさそうでした。
なにかビルドオプションをいじればいけるような気もしつつ、CRAN 上のサイズ制限の問題でそもそも無理なのかもしれません。
geoarrow (R)
ちょっと状況は追いきれなかったのですが、geoarrow パッケージにはかつて read_geoparquet_sf()
・read_geoparquet()
・write_geoparquet()
といった関数があったものの、2023年~2024年頭にパッケージを大規模にリライトしたらしく、その時にいったんすべて消えてしまっているようです(こことかここでリライトが言及されています)。
ここに pull request がありますが、1年くらい更新されてなくて、Dewey は最近は S2 Geometry ベースの DuckDB extension をつくるのをがんばってそうなので、しばらく動かないかもしれません...。
Apache Sedona
これも DuckDB と同じく、bbox カラムはサポートしている、native encoding はサポートしていない、という状況のようです。
雑感
- bbox カラムのサポートは、正式に GeoParquet の規格になる前からベストプラクティスとして使われていたので、すでに対応している実装がわりと多そう
-
native encoding をサポートしている writer は存在しない...?(追記:GDAL が対応してますね!)- ので、読み取り側が対応していなくても誰も困ってない?
- Arrow の統計情報を活用してる参考実装どこかにないのか...?
Discussion