OpenStreetMap のデータから任意のエリアを抜き出した時のメモ

ちょっと川越市内の道路網が欲しかったので OpenStreetMap のデータを使うことにしました。
最初は日本のデータから必要な部分を QGIS で切り出したかったのですが、半日かかっても終わらないので PostGIS で処理してみた時のメモです。
もっと楽な方法ないかしら。

使った環境は debian 7.8 の上に docker で Ubuntu 14.04.2 LTS を展開したものです。

データのダウンロード

ホストの debianOpenStreetMap Data Extracts からシェープファイルを取ってきます。
Asia → Japan → japan-latest.shp.zip をダウンロードして展開します。
ファイルがデカいのでのんびりやりましょう。

$ mkdir /tmp/osm
$ cd /tmp/osm
$ wget -c http://download.geofabrik.de/asia/japan-latest.shp.zip
$ unzip japan-latest.shp.zip

使うのは roads.shp ですね。

他に、取り出したいエリアの緯度経度が必要になります。
今回は国土数値情報から川越市のポリゴンを持ってきて緯度経度を調べました。
こちらは大きいファイルではないので、QGIS で読み込んだ後 ベクタ → 調査ツール → レイヤ領域のポリゴン を実行すると領域の緯度経度がわかります。
できた領域は GeoJSON に吐き出すと MAXX, MAXY, MINX, MINY という値が入っているので楽かもしれません。

環境の準備

dokcer で ubuntu を動かします。
docker file とかでやると簡単なんでしょうけど、今回は中に入って apt-get しました。
データを保存してある /tmp/osm を コンテナの /mnt にバインドしています。

$ docker run -i -v /tmp/osm/:/mnt/ -t ubuntu /bin/bash
docker# apt-get update
docker# apt-get install postgresql-9.3 postgis postgresql-9.3-postgis-2.1 postgresql-9.3-postgis-scripts gdal-bin -y

以下全部 docker コンテナです。
データベースを作成して PostGIS を使えるようにします。
データベース名は roadsdb にしました。

# service postgresql start
# su - postgres
$ createdb roadsdb
$ psql -d roadsdb -c "create extension postgis;"
CREATE EXTENSION

シェープファイルを取り込みます。

$ cd /mnt
$ shp2pgsql -I -s 4326 ./roads.shp roads_table | psql -d roadsdb

-s 4326 は投影系の EPSG コードです。 roads.prj を見たところ、 WGS84 が使われているようなので 4326 にしています。
テーブル名を roads_table にしています。 Athlon 615e で動かして約56分かかりました。

インポートが終わったら、必要な部分だけをシェープファイルとして取り出せば OK です。

$ ogr2ogr -s_srs EPSG:4326 -f "ESRI Shapefile" /tmp/kawagoe.shp PG:dbname='roadsdb' -sql "SELECT gid, st_AsText(geom) FROM roads_table WHERE geom && st_GeomFromText('LINESTRING(139.377436 35.837584, 139.558384 35.962266)',4326)"

LINESTRING の引数が MAXX, MAXY, MINX, MINY で確認した緯度経度です。
こちらは3秒程度で完了します。

最後に /tmp に書き込んだシェープファイルを /mnt にコピーしてやればホストの debian からアクセスできます。

$ exit
# cp /tmp/kawagoe.* /mnt

ダウンロード・zipの展開・シェープファイルのインポートにそれぞれ時間がかかるので、時間的に余裕のあるときじゃないとできないですね…。