💭

GeoArrow 0.2 のアップデート内容を読んでみる

に公開

昨日 GeoArrow 0.2 がリリースされました。v0.1 から約2年ぶりのアップデートです。内容がてんこ盛りなので、自分の勉強もかねて日本語で紹介してみます。

https://geoarrow.org/news/release-0-2.html

GeoArrow とは?

GeoArrow というのは、GIS データを Apache Arrow 形式で扱う際のフォーマットです。Apache Arrow は、効率的なデータ交換のために設計されたデータフォーマットです。GIS データをプロセス間やサーバー・クライアント間で効率的にやり取りできるようにしよう、というわけです。

「GeoArrow」というのはその仕様のことですが、同時に GeoArrow を扱うためのライブラリやツールを様々な言語で提供しています。例えば、先日紹介した @geoarrow/deck.gl-layers も GeoArrow が公式に提供しているもののひとつです。

https://zenn.dev/mierune/articles/da621ff153594b

仕様に追加された内容

型の追加

以下の型が追加されました。

  • Box: bounding box を表す型。具体的には Struct<xmin: double, ymin: double, ...>
  • Geometry: 複数のタイプの地物を含む型。他の PointLineString などの型の union(dense union)で表される。
  • GeometryCollection: Geometry の複数バージョン(Point に対する MultiPoint みたいな感じ)

GeometryGeometryCollection はむしろ、今までなかったんだ...、という感じしますね。

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 が使えないみたいです。

データ

テストデータがたくさん公開されました。何か実装を試すときに便利そうです。

https://geoarrow.org/data

その他のツール

GeoPandas

GeoPandas は、v1.0 のリリースで to_arrow() / from_arrow() が追加されて、GeoArrow の変換ができます。コード例は元のブログ記事を見てください。

Lonboard

Lonboard は私も数日前に知ったばっかりなんですけど、Python で大量の GIS データを素早く可視化するツールらしいです。これも GeoArrow を使っていて、そのデータを deck.gl で描画しているらしいです。

https://developmentseed.org/lonboard/latest/

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 形式のデータを取り込めるはずです。

ここはちょっと、文章を読むだけではあまりよくわからなかったので、後で試してみたいところです。

MIERUNEのZennブログ

Discussion