DuckDBを使ってOverture MapsをQGISで開くまで
Overture MapsはOpenStreetMapと同じく世界規模の地図のオープンデータです。大きく異なるのがOpenStreetMapはコミュニティがベースとなって地図の作成を行っているのに対して、Overture Mapsは企業がベースとなって地図の作成やプロダクションレベルでの利用を想定したデータの正規化などを行っている所です。なお、企業がベースとありますが、中にはOpenStreetMapのデータが使われていたりもします。
Overture MapsはGeoParquet形式で配布されており、2025年4月現在の最新release(2025-03-19.0)で全てダウンロードすると471GBものデータになります。
Overture Mapsでは全てをダウンロードするのではなく、GeoParquetを部分的に取得するという方法を提示しています。これはGeoParquetがクラウドネイティブ形式に対応しているためです。
具体的にはBounding Boxという四角形のポリゴンを使って抽出します。
今回は公式ドキュメントに書いてあるDuckDBを使った方法を試してみます。DuckDBで取り込んだOverture MapsをGeoParquet形式に出力してQGISで表示するという方法を取ります。
前提条件
- GeoParquetを表示するためにはGDAL 3.8以上かつ、GDALがApache Arrow及びGeoParquetにに対応しているQGISが必要になります。
- WindowsはQGIS公式サイトのインストーラを使います
- macOSではQGIS公式サイトのインストーラでは動かない(GDALが古い)ため、別の方法を取る必要があります。
-
QGIS Conda BuilderのreleaseからQGIS 3.40.2をインストールする。この方法はOverture Mapsが推奨している方法です。ただし、ユーザにインストールをした場合は、起動するためには
open ~/Applications/QGIS-3.40.app/Contents/QGIS.app
などとする必要があります。
-
QGIS Conda BuilderのreleaseからQGIS 3.40.2をインストールする。この方法はOverture Mapsが推奨している方法です。ただし、ユーザにインストールをした場合は、起動するためには
- LinuxではConda経由でインストールしたものが動作するのを確認しています。
Bounding Boxを取得
QGISでBounding Boxを取得するにはPythonコンソールを開いて、以下のコードを一行ずつ実行します。
print(f"bbox.xmin >= {iface.mapCanvas().extent().xMinimum()}")
print(f"bbox.ymin >= {iface.mapCanvas().extent().yMinimum()}")
print(f"bbox.xmax <= {iface.mapCanvas().extent().xMaximum()}")
print(f"bbox.ymax <= {iface.mapCanvas().extent().yMaximum()}")
東京都庁周辺では以下のような実行結果が得られます。
print(f"bbox.xmin >= {iface.mapCanvas().extent().xMinimum()}")
bbox.xmin >= 139.684854245372
print(f"bbox.ymin >= {iface.mapCanvas().extent().yMinimum()}")
bbox.ymin >= 35.68369254662421
print(f"bbox.xmax <= {iface.mapCanvas().extent().xMaximum()}")
bbox.xmax <= 139.70180607336633
print(f"bbox.ymax <= {iface.mapCanvas().extent().yMaximum()}")
bbox.ymax <= 35.696009109151326
今回は上記の範囲のデータを取得します。
DuckDBでプロセッシング
まずはDuckDBのインストールをしてください。インストール手順は公式ドキュメントを参考にしてください。
ではDuckDBを起動します。
duckdb
起動したら以下のSPATIALプラグインとAmazon S3(httpfs)プラグインを有効にします。
INSTALL spatial;
INSTALL httpfs;
プラグインは一度インストールをしたら次からはINSTALLは必要ありません。
次にSQLを実行します。
LOAD spatial;
SET s3_region='us-west-2';
SET http_keep_alive=false;
COPY (
SELECT *
FROM read_parquet("s3://overturemaps-us-west-2/release/2025-03-19.0/theme=*/type=*/*", union_by_name = True)
WHERE
bbox.xmin >= 139.684854245372
AND bbox.ymin >= 35.68369254662421
AND bbox.xmax <= 139.70180607336633
AND bbox.ymax <= 35.696009109151326
) TO 'shinjuku.parquet';
しばらくするとshinjuku.parquet
というファイルができるので、QGISにぶっ込みます。
スクリーンショットはWindows版ですが、macOS及びLinuxでも動作チェックはしています。
Discussion