Open Street Map のデータ
このWebページでは、Open Street Mapのデータを用いてSQLite 3のテーブルを生成します。
★作成するSQLite 3データベース: osmdb
準備
次のコマンドを使用する
- osmosis のインストール
Ubuntuでのインストール手順:
# パッケージリストの情報を更新 sudo apt update sudo apt -y install osmosis - xalan のインストール
Ubuntuでのインストール手順:
# パッケージリストの情報を更新 sudo apt update sudo apt -y install xalan - R言語 のインストール
Ubuntuでのインストール手順:
# パッケージリストの情報を更新 sudo apt update sudo apt -y install r-base sudo apt -y install r-base-core sudo apt -y install r-base-dev sudo apt -y install r-recommended sudo apt -y install r-mathlib - R のパッケージのインストール
Ubuntuでのインストール手順:
echo 'install.packages("RSQLite")' | sudo R --vanilla - SQLite 3 のインストール
Ubuntuでのインストール手順:
# パッケージリストの情報を更新 sudo apt update sudo apt -y install libsqlite3-0 sudo apt -y install libsqlite0-dev sudo apt -y install libsqlite3-dev sudo apt -y install sqlite3 - littler のインストール
Ubuntuでのインストール手順:
# パッケージリストの情報を更新 sudo apt update sudo apt -y install littler
Open Street Map データの必要部分の切り出し
- japan.osm.bz2 のダウンロード
- 必要部分の切り出し
緯度、経度を指定して必要部分の切り出しを行う
★bash プログラム
* japan.osm.bz2 は /tmp にあるものとする。
#!/bin/bash bzip2 -d /tmp/japan.osm.bz2 cat /tmp/japan.osm | osmosis --rx - --bb left=130.2037 bottom=33.4308 right=130.5053 top=33.7147 --wx fukuoka-city.osm cat /tmp/japan.osm | osmosis --rx - --bb left=130.0355 bottom=33.4643 right=130.2938 top=33.6690 --wx itoshima-city.osm数分かかる
- XML 形式から CSV 形式への変換 (node, way, relation に関する CSV ファイル)
#!/bin/sh cat > /tmp/1.xslt <<-XSLT <?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8" /> <xsl:template match="/osm/node"> /node, <xsl:value-of select="./@id"/>, <xsl:value-of select="./@lat"/>, <xsl:value-of select="./@lon"/>, <xsl:value-of select="./@version"/>, <xsl:value-of select="./@changeset"/>, <xsl:value-of select="./@timestamp"/> </xsl:template> <xsl:template match="/osm/way"> /way, <xsl:value-of select="./@id"/>, <xsl:value-of select="./@version"/>, <xsl:value-of select="./@changeset"/>, <xsl:value-of select="./@user"/>, <xsl:value-of select="./@uid"/>, <xsl:value-of select="./@timestamp"/> </xsl:template> <xsl:template match="/osm/relation"> /relation, <xsl:value-of select="./@id"/>, <xsl:value-of select="./@version"/>, <xsl:value-of select="./@changeset"/>, <xsl:value-of select="./@user"/>, <xsl:value-of select="./@uid"/>, <xsl:value-of select="./@timestamp"/> </xsl:template> </xsl:stylesheet> XSLT xalan -in itoshima-city.osm -xsl /tmp/1.xslt > /tmp/itoshima-city.csv grep '^/node' /tmp/itoshima-city.csv | sed 's/^\/node, //g' > /tmp/itoshima-city_node.csv grep '^/way' /tmp/itoshima-city.csv | sed 's/^\/way, //g' > /tmp/itoshima-city_way.csv grep '^/relation' /tmp/itoshima-city.csv | sed 's/^\/relation, //g' > /tmp/itoshima-city_relation.csv xalan -in fukuoka-city.osm -xsl /tmp/1.xslt > /tmp/fukuoka-city.csv grep '^/node' /tmp/fukuoka-city.csv | sed 's/^\/node, //g' > /tmp/fukuoka-city_node.csv grep '^/way' /tmp/fukuoka-city.csv | sed 's/^\/way, //g' > /tmp/fukuoka-city_way.csv grep '^/relation' /tmp/fukuoka-city.csv | sed 's/^\/relation, //g' > /tmp/fukuoka-city_relation.csv # オプション # xalan -in japan.osm -xsl /tmp/1.xslt > /tmp/japan.csv # grep '^/node' /tmp/japan.csv | sed 's/^\/node, //g' > /tmp/japan_node.csv # grep '^/way' /tmp/japan.csv | sed 's/^\/way, //g' > /tmp/japan_way.csv # grep '^/relation' /tmp/japan.csv | sed 's/^\/relation, //g' > /tmp/japan_relation.csv#!/bin/sh cat > /tmp/1.xslt <<-XSLT <?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8" /> <xsl:template match="/osm/node/tag"> /node/tag, <xsl:value-of select="../@id"/>, <xsl:value-of select="../@lat"/>, <xsl:value-of select="../@lon"/>, <xsl:value-of select="../@version"/>, <xsl:value-of select="../@changeset"/>, <xsl:value-of select="../@timestamp"/>, <xsl:value-of select="./@k"/>, "<xsl:value-of select="./@v"/>" </xsl:template> <xsl:template match="/osm/way/nd"> /way/nd, <xsl:value-of select="../@id"/>, <xsl:value-of select="../@version"/>, <xsl:value-of select="../@changeset"/>, "<xsl:value-of select="../@user"/>", <xsl:value-of select="../@uid"/>, <xsl:value-of select="../@timestamp"/>, <xsl:value-of select="./@ref"/> </xsl:template> <xsl:template match="/osm/way/tag"> /way/tag, <xsl:value-of select="../@id"/>, <xsl:value-of select="../@version"/>, <xsl:value-of select="../@changeset"/>, "<xsl:value-of select="../@user"/>", <xsl:value-of select="../@uid"/>, <xsl:value-of select="../@timestamp"/>, <xsl:value-of select="./@k"/>, "<xsl:value-of select="./@v"/>" </xsl:template> <xsl:template match="/osm/relation/member"> /relation/member, <xsl:value-of select="../@id"/>, <xsl:value-of select="../@version"/>, <xsl:value-of select="../@changeset"/>, "<xsl:value-of select="../@user"/>", <xsl:value-of select="../@uid"/>, <xsl:value-of select="../@timestamp"/>, "<xsl:value-of select="./@type"/>", <xsl:value-of select="./@ref"/>, "<xsl:value-of select="./@role"/>" </xsl:template> <xsl:template match="/osm/relation/tag"> /relation/tag, <xsl:value-of select="../@id"/>, <xsl:value-of select="../@version"/>, <xsl:value-of select="../@changeset"/>, "<xsl:value-of select="../@user"/>", <xsl:value-of select="../@uid"/>, <xsl:value-of select="../@timestamp"/>, <xsl:value-of select="./@k"/>, "<xsl:value-of select="./@v"/>" </xsl:template> </xsl:stylesheet> XSLT xalan -in itoshima-city.osm -xsl /tmp/1.xslt > /tmp/itoshima-city-tag.csv grep '^/node/tag' /tmp/itoshima-city-tag.csv | sed 's/^\/node\/tag, //g' > /tmp/itoshima-city_node_tag.csv grep '^/way/nd' /tmp/itoshima-city-tag.csv | sed 's/^\/way\/nd, //g' > /tmp/itoshima-city_way_nd.csv grep '^/way/tag' /tmp/itoshima-city-tag.csv | sed 's/^\/way\/tag, //g' > /tmp/itoshima-city_way_tag.csv grep '^/relation/member' /tmp/itoshima-city-tag.csv | sed 's/^\/relation\/member, //g' > /tmp/itoshima-city_relation_member.csv grep '^/relation/tag' /tmp/itoshima-city-tag.csv | sed 's/^\/relation\/tag, //g' > /tmp/itoshima-city_relation_tag.csv xalan -in fukuoka-city.osm -xsl /tmp/1.xslt > /tmp/fukuoka-city-tag.csv grep '^/node/tag' /tmp/fukuoka-city-tag.csv | sed 's/^\/node\/tag, //g' > /tmp/fukuoka-city_node_tag.csv grep '^/way/nd' /tmp/fukuoka-city-tag.csv | sed 's/^\/way\/nd, //g' > /tmp/fukuoka-city_way_nd.csv grep '^/way/tag' /tmp/fukuoka-city-tag.csv | sed 's/^\/way\/tag, //g' > /tmp/fukuoka-city_way_tag.csv grep '^/relation/member' /tmp/fukuoka-city-tag.csv | sed 's/^\/relation\/member, //g' > /tmp/fukuoka-city_relation_member.csv grep '^/relation/tag' /tmp/fukuoka-city-tag.csv | sed 's/^\/relation\/tag, //g' > /tmp/fukuoka-city_relation_tag.csv # オプション # xalan -in japan.osm -xsl /tmp/1.xslt > /tmp/japan-tag.csv # grep '^/node/tag' /tmp/japan-tag.csv | sed 's/^\/node\/tag, //g' > /tmp/japan_node_tag.csv # grep '^/way/nd' /tmp/japan-tag.csv | sed 's/^\/way\/nd, //g' > /tmp/japan_way_nd.csv # grep '^/way/tag' /tmp/japan-tag.csv | sed 's/^\/way\/tag, //g' > /tmp/japan_way_tag.csv # grep '^/relation/member' /tmp/japan-tag.csv | sed 's/^\/relation\/member, //g' > /tmp/japan_relation_member.csv # grep '^/relation/tag' /tmp/japan-tag.csv | sed 's/^\/relation\/tag, //g' > /tmp/japan_relation_tag.csv
SQLite 3 データベースの生成
使用するソフトウェア
- SQLite コマンドライン・インタフェースのインストールが済んでいること。
あらかじめ決めておく事項
この Web ページでは、データベースの作成を行いますので、作成するデータベースのデータベース論理名を決めておくこと。この Web ページでは、次のように書きます:
- データベース論理名: osmdb
使用するデータベースの名前のことを『データベース論理名』と呼ぶことにする。データベース論理名は、自由に決めていいですが、半角文字(つまり英数字)を使い、スペースを含まないこと。
テーブルの作成
- テーブル定義 (node, way, relation)
★bash プログラム
#!/bin/bash rm -f /tmp/osmdb # cat >/tmp/a.$$.sql <<-SQL drop table osmnode; SQL cat /tmp/a.$$.sql | sqlite3 /tmp/osmdb # cat >/tmp/a.$$.sql <<-SQL drop table osmway; SQL cat /tmp/a.$$.sql | sqlite3 /tmp/osmdb # cat >/tmp/a.$$.sql <<-SQL drop table osmrelation; SQL cat /tmp/a.$$.sql | sqlite3 /tmp/osmdb # cat >/tmp/a.$$.sql <<-SQL create table osmnode ( id integer not null, lat real not null, lon real not null, version integer not null, changeset integer, timestamp datetime ); create table osmway ( id integer not null, version integer not null, changeset integer, user text, uid integer, timestamp datetime ); create table osmrelation ( id integer not null, version integer not null, changeset integer, user text, uid integer, timestamp datetime ); SQL cat /tmp/a.$$.sql | sqlite3 /tmp/osmdb - データの作成
★bash プログラム
#!/bin/bash cat >/tmp/a.$$.sql <<-SQL .mode csv .import /tmp/itoshima-city_node.csv osmnode .import /tmp/itoshima-city_way.csv osmway .import /tmp/itoshima-city_relation.csv osmrelation .import /tmp/fukuoka-city_node.csv osmnode .import /tmp/fukuoka-city_way.csv osmway .import /tmp/fukuoka-city_relation.csv osmrelation SQL cat /tmp/a.$$.sql | sqlite3 /tmp/osmdb # echo 'select * from osmnode limit 10;' | sqlite3 /tmp/osmdb echo 'select * from osmway limit 10;' | sqlite3 /tmp/osmdb echo 'select * from osmrelation limit 10;' | sqlite3 /tmp/osmdb - (オプション) データベースの再構築
★bash プログラム
#!/bin/bash cd /tmp ls -la osmdb # dump cat >/tmp/a.$$.sql <<-SQL .output /tmp/osmdb.sql .dump .exit SQL # cat /tmp/a.$$.sql | sqlite3 /tmp/osmdb # rm /tmp/osmdb # restore cat >/tmp/a.$$.sql <<-SQL .read /tmp/osmdb.sql .exit SQL # cat /tmp/a.$$.sql | sqlite3 /tmp/osmdb # cd /tmp ls -la osmdb - プロット
★bash プログラム
#!/bin/bash cat > /tmp/a.r <<-COMMAND library("RSQLite") drv <- dbDriver("SQLite", max.con = 1) conn <- dbConnect(drv, dbname="/tmp/osmdb") rs <- dbSendQuery( conn, "SELECT distinct lat, lon from osmnode;" ) R <- fetch(rs, n = -1) png("/tmp/a.png") plot(R\$lat, R\$lon) dev.off() COMMAND cat /tmp/a.r | r display /tmp/a.png - 追加テーブル定義 (nodetag, waynd, waytag, relationmember, relationtag)
★bash プログラム
#!/bin/bash cat > /tmp/a.sql <<-SQL create table nodetag ( nodeid integer not null, lat real not null, lon real not null, version integer not null, changeset integer, timestamp datetime, k text not null, v text not null ); create table waynd ( wayid integer not null, version integer not null, changeset integer, user text, uid integer, timestamp datetime, ref integer ); create table waytag ( wayid integer not null, version integer not null, changeset integer, user text, uid integer, timestamp datetime, k text not null, v text not null ); create table relationmember ( relationid integer not null, version integer not null, changeset integer, user text, uid integer, timestamp datetime, type text, ref integer, role text ); create table relationtag ( relationid integer not null, version integer not null, changeset integer, user text, uid integer, timestamp datetime, k text not null, v text not null ); SQL cat /tmp/a.sql | sqlite3 /tmp/osmdb - データの挿入
★bash プログラム
#!/bin/bash cat > /tmp/a.sql <<-SQL .mode csv .import /tmp/itoshima-city_node_tag.csv nodetag .import /tmp/itoshima-city_way_nd.csv waynd .import /tmp/itoshima-city_way_tag.csv waytag .import /tmp/itoshima-city_relation_member.csv relationmember .import /tmp/itoshima-city_relation_tag.csv relationtag .import /tmp/fukuoka-city_node_tag.csv nodetag .import /tmp/fukuoka-city_way_nd.csv waynd .import /tmp/fukuoka-city_way_tag.csv waytag .import /tmp/fukuoka-city_relation_member.csv relationmember .import /tmp/fukuoka-city_relation_tag.csv relationtag SQL cat /tmp/a.sql | sqlite3 /tmp/osmdb - プロット
★bash プログラム
#!/bin/bash cat > /tmp/a.r <<-COMMAND library("RSQLite") drv <- dbDriver("SQLite", max.con = 1) conn <- dbConnect(drv, dbname="/tmp/osmdb") rs <- dbSendQuery( conn, "SELECT distinct lat, lon from nodetag;" ) R <- fetch(rs, n = -1) png("/tmp/a.png") plot(R\$lat, R\$lon) dev.off() COMMAND cat /tmp/a.r | r display /tmp/a.png