GeoArrow 0.2 のアップデート内容を読んでみる
昨日 GeoArrow 0.2 がリリースされました。v0.1 から約2年ぶりのアップデートです。内容がてんこ盛りなので、自分の勉強もかねて日本語で紹介してみます。
GeoArrow とは?
GeoArrow というのは、GIS データを Apache Arrow 形式で扱う際のフォーマットです。Apache Arrow は、効率的なデータ交換のために設計されたデータフォーマットです。GIS データをプロセス間やサーバー・クライアント間で効率的にやり取りできるようにしよう、というわけです。
「GeoArrow」というのはその仕様のことですが、同時に GeoArrow を扱うためのライブラリやツールを様々な言語で提供しています。例えば、先日紹介した @geoarrow/deck.gl-layers
も GeoArrow が公式に提供しているもののひとつです。
仕様に追加された内容
型の追加
以下の型が追加されました。
-
Box
: bounding box を表す型。具体的にはStruct<xmin: double, ymin: double, ...>
-
Geometry
: 複数のタイプの地物を含む型。他のPoint
やLineString
などの型の union(dense union)で表される。 -
GeometryCollection
:Geometry
の複数バージョン(Point
に対するMultiPoint
みたいな感じ)
Geometry
・GeometryCollection
はむしろ、今までなかったんだ...、という感じしますね。
CRS
CRS の指定方法が増えました。これまでは必ず PROJJSON でないといけなかったのが、より簡単に EPSG を使ったこういう指定ができるようになりました。他に WKT2
も使えます。
{
"crs": "EPSG:32620",
"crs_type": "authority_code",
}
{
"crs": "32620",
"crs_type": "srid",
}
これは、GeoArrow の生成側が PROJJSON をサポートするのが大変なケースもあるから、ということらしいです。
to simplify the dependency requirements of producers that did not have a built-in ability to produce PROJJSON
ただし、これは最終手段で、基本的には PROJJSON か WKT2 を使ってね、とも書かれています。ちょっとややこしい...
Note that this should only be used as a last resort for database drivers or readers that have no other option.
binary view・string view の利用
データを WKB形式、もしくは WKT 形式で持っている場合、Apache Arrow の binary view・string view を使えるようになったらしいです。よりパフォーマンスが出るとのことです。あまり意識することはないかも。
エッジの補間
GeoArrow は、メタデータとして CRS のほかにエッジの補間の指定ができます。この補間方法の種類が増えました。Parquet と Iceberg に実装されてるのでそっちに合わせたらしいです。
座標は separated layout がおすすめになった
GeoArrow では、座標の表現方法には2つの種類があります。separated と interleaved と呼んでいますが、要は、列指向か行指向か、みたいな感じです。
- separated:
x: [x, x, ...], y: [y, y, ...]
- interleaved:
[x, y, x, y, ...]
これまではどっちがおすすめということはなく併記されていただけでしたが、v0.2 では separated がおすすめと明記されました。仕様には特に変更ないですが、仕様書の書きっぷりが変わった、という話ですね。
各実装のアップデート
Rust
crate を小分けにした、みたいな細かい話が書かれています。GeoArrow 0.2 の仕様をサポートした、という以外は特に目新しいニュースはなさそうです。
Native Rust integration with GeoParquet will be released soon. Support for other file formats like FlatGeobuf, GeoJSON, CSV, and Shapefile is under development
とのことで、待ち遠しいですね。
C/C++
GeoArrow 0.2 の仕様はほぼサポートしてるけど、union type(つまり Geometry と GeometryCollection?)が使えないとのこと。けっこう不便なのでは...?
Python
geoarrow-pyarrow
を使っておけばよさそうだけど、geoarrow-rust
もできたらしく、どっちを使えばいいのかよくわからないですね。。
R
R は C へのバインディングなので、同じく Geometry が使えないみたいです。
データ
テストデータがたくさん公開されました。何か実装を試すときに便利そうです。
その他のツール
GeoPandas
GeoPandas は、v1.0 のリリースで to_arrow()
/ from_arrow()
が追加されて、GeoArrow の変換ができます。コード例は元のブログ記事を見てください。
Lonboard
Lonboard は私も数日前に知ったばっかりなんですけど、Python で大量の GIS データを素早く可視化するツールらしいです。これも GeoArrow を使っていて、そのデータを deck.gl で描画しているらしいです。
DuckDB
DuckDB は duckdb-spatial の GEOMETRY 型のデータを GeoArrow でインポートしたりエクスポートしたりできるようになりました。元のブログ記事には、GeoPandas と DuckDB で相互変換する例が出ています。シームレスに扱えていて便利そうです。
df = geopandas.read_file(url)
# Create the Arrow table and use select directly from it with DuckDB
df_arrow = df.to_arrow()
duckdb.sql("SELECT * FROM df_arrow").limit(5)
# Going the other direction, call from_arrow() directly on a DuckDB result
geopandas.GeoDataFrame.from_arrow(duckdb.sql("SELECT * FROM df_arrow")).head(5)
Apache Sedona
Apache Sedona も、v1.6.0 で dataframe_to_arrow()
(Sedona → Python)が、v1.7.0 で create_spatial_dataframe()
(Python → Sedona)が追加されて、GeoPandas との相互変換が簡単になりました。
GDAL
GDAL は、v3.8 から GeoArrow 形式でのエクスポートに対応しているらしいです。あと、インポートは、3.11 で ADBC ドライバが追加されたので、それを介して GeoArrow 形式のデータを取り込めるはずです。
ここはちょっと、文章を読むだけではあまりよくわからなかったので、後で試してみたいところです。
Discussion