2025年8月3日日曜日

Open street mapからダウンロードしたデータで道路の地図を描く


背景

OpenStreetMap(以下OSM)とは、オープンなライセンス(Open Data License)で公開されている地図情報です。
QGISという地図情報表示プログラムを触る機会があり、それで使われていて存在を知りました。

公開されているデータをダウンロードすればインターネットに繋がなくても必要な地図を描画できると思い試したところできたので、取り組んだ内容を記事に残します。

主に下記の記事の内容を参考にしました。
OpenStreetMapデータから地図を作成する

なお、地図画像をweb経由で取得するので良いなら、OSMのwikiに従いwgetコマンドでダウンロード可能です。
データのダウンロード

使ったもの

  • docker
  • OSMの関東地方のosm.pbfデータ

今回の記事のコード: githubで公開済み

docker composeコマンドで動かし、osm.pbfを取り込ませたらブラウザで画像を確認できます。

https://github.com/asukiaaa/docker-open-street-map-practice

実行方法はREADMEをご覧ください。
本記事では処理の要所を紹介します。

osm.pbfを直接扱うのは重いのでpostgisに格納

osm.pbfファイルとしてOSMの地域ごとの地図データが配布されています。
日本のosm.pbfは下記のページからダウンロードできます。
(urlがgeofabrik.deなのでOSM公式では無さそうですが、OSMと連動するサイトのようです。)

Download OpenStreetMap data for this region: Japan

このosm.pbfファイルはバイナリファイルなため人が直接は読み取りづらい上に、圧縮されているのかプログラムを利用して読み取る際も時間を要します。
そのため、この記事ではpostgres sqlを利用して作られた地図情報を扱うためのデータベース postgisに格納してから利用します。

公開しているdocker composeのリポジトリのpostgisフォルダにosm.pbfを置いてpostgis用のコンテナに認識させます。
今回は関東地方のデータを利用します。
cd [公開しているdocker composeのリポジトリ]
wget -P ./postgis https://download.geofabrik.de/asia/japan/kanto-latest.osm.pbf

その後postgisのコンテナに入り、osm2postgisコマンドを利用してosm.pbfをpostgisに取り込みます。
docker compose exec postgis bash
osm2pgsql \
-d $POSTGRES_DB \
-P 5432 \
-U $POSTGRES_USER \
--create \
--slim \
--multi-geometry \
--cache 2000 \
./kanto-latest.osm.pbf

自分のPCだと15分弱かかりました。
osm2pgsql took 889s (14m 49s) overall.

これで関東地方の情報をpostgisで扱えるようになりました。

mapnikで描画

mapnikはオープンソースの地図描画プログラムです。
OSMのwikiにも解説があり、OSMの地図表示の描画にもmapnikが使われているようです。

postgisのデータを利用して道情報を抽出する設定を記述したxmlファイルmapinkに読み込ませます。

その後zoom_allを実行すると保持している地図データ全体が描画される拡大率になります。
関東地方の地図をzoom_allで描画した地図がこちらです。
小笠原諸島を含んでいるためか、余白が広いです。


上記のzoom_all実行時の描画時間は10秒ほどでした。
time of loading 1.086 seconds
time of rendering 8.712 seconds

zoom_allの代わりに特定の区画を指定して描画した場合は対象の要素が減るため関東全体の描画時間の1/7ほどで描画できました。
今回の場合は埼玉県深谷市近辺を指定しました。
区画指定時の座標の順序が「緯度、経度」ではなく「経度、緯度」なのに注意です。
    # m.zoom_all()
area = mapnik.Box2d(139.4172157248683, 36.06460782132949, 139.18430749155274, 36.25925904331936)
bbox=(area)
m.zoom_to_box(bbox)

その画像がこちらです。


上記地図描画時間は約1.3秒でした。
time of loading 0.018 seconds
time of rendering 1.295 seconds

区画を指定して道路の地図を描けました。

おわり

osm.pbfを扱い始めたときは処理の遅さに戸惑いましたが、postgisに取り込んで情報を取扱しやすくした上でmapinkで描画すれば、区画を絞れば数秒で道路を描画可能と分かりました。

参考

docker環境の参考にした記事です。
OpenStreetMapデータから地図を作成する

今回の記事を書くために作成して公開したプログラムです。
https://github.com/asukiaaa/docker-open-street-map-practice

OSMの日本地域のダウンロードページです。
Download OpenStreetMap data for this region: Japan

mapnikのMapのapiです。
mapnik.Map

mapnikでの背景色の指定方法を解説しているwikiです。
User:Moresby/Understanding Mapnik/Setting a background colour

0 件のコメント :