osmar を使ってみる

【概要】osmarは、OpenStreetMap(OSM)のデータをRで取得・操作するためのパッケージである。Webブラウザを使わずにプログラムからOSMデータを取得し、地図の描画や空間解析に活用できる。本記事では、環境構築、データ取得、描画、空間データ変換を解説する。

【目次】

  1. 前準備
    1. Ubuntu の場合
    2. osmar パッケージのインストール
  2. ダウンロード
  3. 描画
    1. sp オブジェクトへの変換と描画

前準備

Ubuntu の場合

osmarパッケージはlibxml2とlibcurlに依存している。Ubuntuでは、以下のコマンドで必要なライブラリをインストールする。

sudo apt -y update
sudo apt -y install libxml2-dev
sudo apt -y install libcurl3-dev

osmar パッケージのインストール

Rを起動し、以下のコマンドでosmarパッケージをインストールする。

install.packages("osmar")

ダウンロード

osmarでは、OSMプロジェクトのAPIを通じて地図データを取得できる。APIのエンドポイントは以下のとおりである。

https://api.openstreetmap.org/api/0.6/

取得範囲の指定には以下の2つの関数を使用する。

  • corner_bbox(): left、bottom、right、topの緯度経度で矩形範囲を指定する
  • center_bbox(): 中心点の緯度経度と、幅および高さ(メートル単位)を指定する

以下の例では、指定地点を中心とする500m四方の範囲からデータを取得する。

library("osmar")
src <- osmsource_api()
bb <- center_bbox(130.21688103675842, 33.59656025053064, 500, 500)
ua <- get_osm(bb, source = src)
osmarでダウンロードしたOSMデータの出力結果

取得したデータの概要として、ノード、ウェイ、リレーションの各要素数が表示される。

【OSMデータの構成要素】

  • ノード(node): 緯度経度を持つ点。店舗、交差点、地点などを表す
  • ウェイ(way): ノードを結んだ線または多角形。道路、河川、建物の輪郭などを表す
  • リレーション(relation): 複数のノードやウェイをまとめた関係。バス路線、行政境界などを表す
【注意】OSM APIには利用制限がある。取得範囲を広げすぎるとエラーになる場合や、取得に時間がかかる場合がある。大量のデータが必要な場合は、APIではなくOSMのデータダンプファイルを使用することを検討する。

描画

取得したデータを描画して、内容を確認できる。plot()関数はすべての要素を描画する。

library("osmar")
src <- osmsource_api()
bb <- center_bbox(130.21688103675842, 33.59656025053064, 500, 500)
ua <- get_osm(bb, source = src)
plot(ua)
plot関数によるOSMデータの描画結果

ノード、ウェイ、リレーションを含むすべての要素が描画される。

plot_nodes()関数はノード(点)のみを描画する。以下の例では緑色で描画する。

library("osmar")
src <- osmsource_api()
bb <- center_bbox(130.21688103675842, 33.59656025053064, 500, 500)
ua <- get_osm(bb, source = src)
plot_nodes(ua, col="green")
plot_nodes関数によるノードの緑色描画結果

店舗や交差点などの地点がノードとして表示される。

plot_ways()関数はウェイ(線)のみを描画する。以下の例では青色で描画する。

library("osmar")
src <- osmsource_api()
bb <- center_bbox(130.21688103675842, 33.59656025053064, 500, 500)
ua <- get_osm(bb, source = src)
plot_ways(ua, col="blue")
plot_ways関数によるウェイの青色描画結果

道路や河川、建物の輪郭などがウェイとして表示される。

sp オブジェクトへの変換と描画

osmarで取得したデータをas_sp()関数でspパッケージの空間オブジェクトに変換すると、空間解析やGIS処理が可能になる。spパッケージはRで空間データを扱うための標準的なパッケージである。

以下の例では、"points"を指定してノードをSpatialPointsDataFrameに変換し、spplot()関数で描画する。

library("osmar")
src <- osmsource_api()
bb <- center_bbox(130.21688103675842, 33.59656025053064, 500, 500)
ua <- get_osm(bb, source = src)
point <- as_sp(ua, "points")
spplot(point, c("id"))
pointsをspオブジェクトに変換した描画結果

各ノードがid属性の値に応じた色で表示される。

以下の例では、"lines"を指定してウェイをSpatialLinesDataFrameに変換する。

library("osmar")
src <- osmsource_api()
bb <- center_bbox(130.21688103675842, 33.59656025053064, 500, 500)
ua <- get_osm(bb, source = src)
line <- as_sp(ua, "lines")
spplot(line, c("id"))
linesをspオブジェクトに変換した描画結果

各ウェイがid属性の値に応じた色で表示される。

以下の例では、"polygons"を指定して閉じたウェイをSpatialPolygonsDataFrameに変換する。

library("osmar")
src <- osmsource_api()
bb <- center_bbox(130.21688103675842, 33.59656025053064, 500, 500)
ua <- get_osm(bb, source = src)
poly <- as_sp(ua, "polygons")
spplot(poly, c("id"))
polygonsをspオブジェクトに変換した描画結果

建物や公園など、閉じた領域を持つ要素がポリゴンとして表示される。