SedonaDB v0.2
先週、SedonaDB v0.2 がリリースされました! 私もいくつかコントリビュートしています。まだまだ関数は少ないですが、着実に開発が進んでいます。更新内容についてのブログ記事が公開されたので、中身を見ていこうと思います。
SedonaDB とは?
ひとことで言えば、DuckDB のように SQL で GIS データを扱えるツールです。SedonaDB の概要についてはいくつか記事を書いたので、こちらをご参照ください。
インストール
Python は、PyPI からインストールできます。
pip install "apache-sedona[db]"
R は、R-multiverse (もしくは R-universe)からインストールできます。
install.packages("sedonadb", repos = "https://community.r-multiverse.org")
SedonaDB v0.2 のアップデート内容
40個の新しい関数
v0.1 と比べて、以下の関数が増えました。ちなみに、rs_ とついているのはラスター用の関数です。
rs_height, rs_scalex, rs_scaley, rs_skewx, rs_skewy, rs_upperleftx, rs_upperlefty, rs_width, st_azimuth, st_boundary, st_crosses, st_dump, st_endpoint, st_geometryfromtext, st_geometryn, st_isclosed, st_iscollection, st_isring, st_issimple, st_isvalid, st_isvalidreason, st_makevalid, st_minimumclearance, st_minimumclearanceline, st_npoints, st_numgeometries, st_overlaps, st_pointn, st_points, st_polygonize, st_polygonize_agg, st_reverse, st_simplify, st_simplifypreservetopology, st_snap, st_startpoint, st_translate, st_unaryunion, and st_zmflag
pyogrio のサポート
これまでも GeoPandas を介して様々なフォーマットのデータを読み込めたんですが、v0.2 ではpyogrio を通じてより効率的にデータを読めるようになりました。GeoPandas だと一度 GeoPandas のデータとして読み込んで、それを SedonaDB に持ってくる、という形なんですが、pyogrio だとそういう中間形式を挟まず直接読めるので速いです。
ブログに載っていた例はこんな感じ。12 GBあるファイルも、pygrio 経由だとぜんぶ読まずに必要なところだけ読んでくれます。これは、WHERE 句の条件が GDAL に渡され、GDAL が空間インデックスを使っていい感じに必要なところだけ読んでくれる、ということらしいです。
# 12 GB file
url = "https://flatgeobuf.septima.dk/population_areas.fgb"
sd.read_pyogrio(url).to_view("population_areas")
wkt = "POLYGON ((-73.978329 40.767412, -73.950005 40.767412, -73.950005 40.795098, -73.978329 40.795098, -73.978329 40.767412))"
sd.sql(
f"""
SELECT sum(population::INTEGER) FROM population_areas
WHERE ST_Intersects(wkb_geometry, ST_SetSRID(ST_GeomFromWKT('{wkt}'), 4326))
"""
).show()
GeoParquet 1.1 の出力
(これはちょっとマニアックな項目なので、詳しくない方はスキップしてもらって大丈夫だと思います。フォーマットについて詳しく知りたいという方はこちらをご参照ください)
これまで、GeoParquet 1.1 のメタデータを使うのは実装されていましたが、書き出すのは GeoParquet 1.0 でした。このバージョンから、GeoParquet 1.1、つまり bbox カラムを書き出せるようになりました。geoparquet_version で指定できます。
df.to_parquet("water_point.parquet", geoparquet_version="1.1")
row group 単位の bbox 統計情報はまだなのかな...? そのへんはちょっと確認できていません。
Python UDF
@udf.arrow_udf というデコレータで Python の関数を SQL の中で呼び出せるようになりました。ブログに載ってる例はこんな感じ。
@udf.arrow_udf(ga.wkb(), [udf.GEOMETRY, udf.NUMERIC])
def shapely_udf(geom, distance):
geom_wkb = pa.array(geom.storage.to_array())
distance = pa.array(distance.to_array())
geom = shapely.from_wkb(geom_wkb)
result_shapely = shapely.buffer(geom, distance)
return pa.array(shapely.to_wkb(result_shapely))
sd.register_udf(shapely_udf)
ラスターデータが扱えるようになった
これは、めでたいことなのですが、扱えるようになったとは言っても、ラスターを操作する関数まだほとんどないので、SedonaDB を実際にラスターデータの処理に使えるようになるのはまだ先でしょう。次のバージョンに期待しましょう!
crates.io へのリリース
SedonaDB は Rust で書かれています。その Rust 部分が crates.io にリリースされました。これによって、Rust のコードの中で GIS データ処理に SedonaDB を使うこともできるようになりました。コードの例は以下にあります。
(ただし、pure-Rust じゃないのでビルドはそれなりにむずいです)
感想
いかがだったでしょうか。革命的な新機能とかはないですが(pygrio 対応はけっこううれしいかも)、着実に進歩してるなというのが個人的な感想です。次のバージョンまでにまたいろいろコントリビュートしていきたいです。
ちょっと悲しかったのは、Python は機能追加(pygrio、UDF)があるのに対して R はない点ですが、この辺はまあ優先順位の問題なので、落ち着いたら R も強化されていくんじゃないかなと思っています。
Discussion