まるで物知りな友人に尋ねるかのように ~DuckDBに空間データベースの機能を持たせると~
空間データを扱うのはちょっと面倒で、うまくやろうとすると自分でいろいろ実装する必要が出てきます。
そんな空間データベースの世界で過去およそ20年にわたって使用されてきたのがPostGISですが、今、変革のときを迎えています―DuckDBです。
つい先日めでたく1.0.0リリースを迎えたDuckDBと追加機能であるSpatial Extensionを活用すると、どんな世界が待っているのでしょうか。
DuckDBとは?
無料でオープンソース、列指向型、インプロセス埋め込み型を特徴とするOLAPデータベースです。
クエリ速度がとても速く、私は愛用しているRust製のPolarsよりも高速で思わず「うぉっ」と声がでました。
列指向型は行の書き込みは遅いのですが、分析で行われるような特定の列だけを読み込んで集計するような操作を素早く行うことができます。
そんなDuckDBにPostGISの空間データを扱う機能を組み込むことで、使いやすくパフォーマンスのよい空間データベースとなるのです。
実際に使ってみよう
マレーシアとシンガポールの、建物と行政境界 (aoi: area of interesting) のポリゴンデータを使って、aoi内に含まれる建物を全て検索してGeoJSONに書き出してみます。
検索クエリはたったこれだけ!
SELECT buildings.* FROM buildings, aoi WHERE ST_Within(buildings.geom, aoi.geom)
「使いやすい」と書いたのはこういうことなんですよね。
掛かった時間は5.35秒でした。(データ量とマシンスペックによるのであくまで参考に)
そしてGeoJSONに書き出すクエリは―
COPY Sbuild TO 'build.geojson' WITH (FORMAT GDAL, DRIVER 'GeoJSON')
こちらもシンプルでいいですね。
クエリに要した時間は2.38秒でした。
LLMとの融合
DuckDBで高速に得たデータをLLMに食わせて、ITに強くない人であっても誰でも空間データから知見を得られる世界を想像してください。
「今私たちがいるところから500m圏内のカフェを教えて」って言うと、まるで物知りな友人がすぐに教えてくれるような―
そんな世界がもうやってきているのです。