osmdataで読み込んだOpenStreetMapデータの構造
【概要】osmdataは、R言語でOpenStreetMap(OSM)データを読み込むためのパッケージである。本記事では、福岡市内全域を含むOSMデータファイルをosmdataで読み込み、そのデータ構造を確認する。osmdataは、読み込んだOSMデータをsf(Simple Features)形式に変換し、points・lines・polygons・multilines・multipolygonsの幾何タイプごとの表として扱えるようにする。
【目次】
はじめに:データの入手と基本概念
本記事を読み進める前に、必要なファイルの入手方法と、OSMデータの基本的な考え方を確認しておく。
OSMデータファイルの入手方法
本記事で読み込むOSMデータファイル(拡張子 .osm または .xml のXML形式ファイル)は、次の方法で入手できる。狭い範囲であれば、OpenStreetMap公式サイト(openstreetmap.org)の画面上部にある「エクスポート」機能から、表示中の範囲を .osm ファイルとしてダウンロードできる。市全域のように範囲が広い場合は、Geofabrik(download.geofabrik.de)などの配布サイトから、地域単位のデータファイルを入手する。配布サイトでは、後述の圧縮形式 .osm.pbf も提供されている。いずれの方法も、Windowsのブラウザからダウンロードでき、特別な環境は不要である。
OSMの基本概念と幾何タイプの対応
OSMのデータは、次の3つの基本要素で構成される。これらがosmdataでどの幾何タイプに変換されるかを、あらかじめ対応づけて示す。
- node(ノード):緯度・経度を持つ単一の点。osmdataでは points になる。
- way(ウェイ):複数のnodeを順につないだもの。開いた線は lines、始点と終点が一致して閉じた面は polygons になる。
- relation(リレーション):複数のnode・way・relationをまとめた関係。線的なものは multilines、面的なものは multipolygons になる。
osmdataで読み込んだ結果は sf(Simple Features)形式になる。sfは、表形式の属性データに、各地物の幾何情報を格納した geometry 列と、座標参照系(CRS:座標が地球上のどの基準で表されているかの定義。OSMでは経度・緯度を表すWGS84が標準)を加えた形式である。地理空間データをRで扱う際の標準的な形式であり、地図描画や面積・距離計算にそのまま利用できる。
osmdataパッケージとデータの読み込み
OSMデータの読み込みには、osmdataパッケージ(rOpenSci提供)を用いる。osmdataは、Rがインストールされていればそのまま動作し、GPUの有無に依存しない。Linuxなどの追加知識は必要ない。
初回のみ、Rのコンソールで次を実行してパッケージを導入する。
# パッケージのインストール(初回のみ)
install.packages("osmdata")
install.packages("sf")
「はじめに」で入手したOSMファイルを読み込むには、osmdata_sf() の doc 引数にファイル名を渡す。福岡市内全域のファイルを読み込む例を以下に示す。Windowsでは、ファイルパスをダブルクォートで囲んで指定する。このとき、区切り文字には円記号「\」ではなくスラッシュ「/」を使う。
# ライブラリの読み込み
library(osmdata)
library(sf)
# ローカルのOSMファイル(XML形式)を直接読み込む
# 例:ドキュメントフォルダに置いた fukuoka.osm を読み込む
map <- osmdata_sf(doc = "C:/Users/yourname/Documents/fukuoka.osm")
# データ構造の表示
print(map)
このように、osmdataではダウンロード用のクエリを書かなくても、ローカルに保存済みのファイルを読み込める。読み込んだ結果は osmdata_sf クラスのオブジェクトになる。
うまく読み込めない場合は、次の点を確認する。ファイルパスは、区切り文字にスラッシュ「/」を使って指定する。ファイルが見つからない旨のエラーが出たときは、パスとファイル名のつづりを再確認する。市全域のような巨大なファイルで読み込みに時間がかかったりメモリが不足したりする場合は、第5節の osmextract を利用する。
osmdataオブジェクトの全体構造
読み込み結果(map)は、複数の要素を持つリスト状のオブジェクトである。print(map) を実行すると、次のような要素が表示される。
> print(map)
Object of class 'osmdata' with:
$bbox : 33.4,130.1,33.8,130.5
$overpass_call : NULL
$meta : ...
$osm_points : 'sf' Simple Features Collection with N1 points
$osm_lines : 'sf' Simple Features Collection with N2 linestrings
$osm_polygons : 'sf' Simple Features Collection with N3 polygons
$osm_multilines : 'sf' Simple Features Collection with N4 multilinestrings
$osm_multipolygons : 'sf' Simple Features Collection with N5 multipolygons
上記の N1〜N5 は、地物の件数を表す。これらの件数は、読み込んだファイルに含まれる地物によって変わるため、ここでは記号で示している。該当する地物が一つもない要素は NULL と表示される。
osmdataオブジェクトの主な要素は次のとおりである。bbox は読み込んだ範囲の境界座標(緯度・経度の最小最大)、meta は取得元やタイムスタンプなどのメタ情報、osm_points 以降が地物データである。OSMの3つの基本要素(node・way・relation)は、「はじめに」で示した対応に従って、幾何タイプ別のsfオブジェクトに整理される。
幾何タイプごとのデータ(points / lines / polygons など)
osm_pointsなどの各要素は、sf形式のデータフレームである。各要素の意味は次のとおりである。
- osm_points:地図上の点(POINT)。OSMの node に相当する。バス停や標識など単独の地点や、線・面を構成する頂点が含まれる。
- osm_lines:線(LINESTRING)。道路や河川など、複数の点を順につないだ線状の地物で、OSMの開いた way に相当する。
- osm_polygons:多角形(POLYGON)。建物の輪郭や敷地など、始点と終点が一致して閉じた領域で、閉じた way に相当する。
- osm_multilines:複数の線をまとめた地物(MULTILINESTRING)。バス路線など、複数の way からなる線的な relation に相当する。
- osm_multipolygons:複数の多角形をまとめた地物(MULTIPOLYGON)。穴の空いた領域や行政境界など、複数の way からなる面的な relation に相当する。
点データだけを取り出して中身を確認するには、次のようにする。
# 点データ(osm_points)を取り出す
pts <- map$osm_points
# 先頭部分の表示
head(pts)
# 列名(属性)の一覧
names(pts)
取り出した pts は、通常のデータフレームと同様に扱える。geometry 列を持つため、sfパッケージの関数で地図描画や空間処理に利用できる。
各地物に共通する属性列
points・lines・polygonsなどの各sfオブジェクトは、列として「OSMのメタ情報」「タグ情報」「幾何情報」を持つ。タグの種類は読み込んだ地物によって変わるため、列数は一定でない。すべての幾何タイプに共通して現れる主な列は次のとおりである。
OSMのメタ情報に関する列
- osm_id:各地物(node・way・relation)を一意に識別するID。行名(rownames:データフレームの各行に付く見出し)として保持される場合もある。
- name:地物の名称(OSMの
nameタグ)。施設名や道路名などが入る。日本語名はname:jaなど別の列になることもある。
編集者(user)、編集日時(timestamp)、バージョン(version)、変更セット(changeset)などの編集履歴のメタデータは、元のOSMファイルにそれらの情報が含まれている場合に取得できる。通常のエクスポートファイルでは省略されていることが多い。
タグ情報に関する列
OSMのタグは「キー=値」のペアで、地物の属性(種別・名称など)を表す。osmdataでは、各タグのキーが列名になり、その値がセルの内容として展開される。たとえば highway、building、amenity などのキーが列として現れ、該当しない地物のセルは NA(値が存在しないことを示す欠損値)になる。
幾何情報に関する列
- geometry:幾何情報を格納する列。点ならPOINT、線ならLINESTRING、面ならPOLYGONというように、要素ごとの幾何タイプが格納される。この列があることで、地図描画や面積・距離計算などの空間処理が行える。
osm_points固有の列
上記の共通列に加えて、osm_pointsには地点の座標を表す次の列が現れることがある。lines・polygonsなどの座標は geometry 列にまとめて格納されるため、これらの列はosm_pointsに固有のものである。
- lat:点の緯度(-90以上90以下)。
- lon:点の経度(-180以上180以下)。
大容量ファイルを扱う場合(osmextract)
福岡市内全域のように地物数が数十万件規模になると、XML形式(.osm / .xml)のファイルは容量が大きく、osmdata_sf() での読み込みに時間がかかることがある。より高速に扱いたい場合は、圧縮形式である .osm.pbf ファイルと osmextract パッケージの利用を検討する。.osm.pbf は、.osm / .xml と同じOSMデータを高効率に圧縮したバイナリ形式で、「はじめに」で触れたGeofabrikなどの配布サイトから直接ダウンロードできる。osmextractも、Rがインストールされていればそのまま動作し、GPUの有無に依存しない。
# パッケージのインストール(初回のみ)
install.packages("osmextract")
library(osmextract)
# ローカルに保存した .osm.pbf ファイルを読み込む(道路などの線データを取得する例)
# Windowsでは、ファイルパスをダブルクォートで囲み、区切り文字にスラッシュ「/」を使う
lines <- oe_read("C:/Users/yourname/Documents/fukuoka.osm.pbf", layer = "lines")
head(lines)
osmextractは、GDAL(地理空間データを扱うC++ライブラリ)経由でpbfを読み込み、結果をsf形式で返す。layer 引数で "points"、"lines"、"multipolygons" などの幾何タイプを指定し、必要なデータだけを取り出せる。