OSM — overpass turboを使ったOSMデータの地域別集計

この記事は、大幅に遅刻してしまったがOpenStreetMap Advent Calender 2013への参加記事である。

0.はじめに

OSMでは様々なデータ抽出方法が開発されているが、XAPIなどに代わるものとしてOverpass APIが注目されている。

Overpass APIの特徴としてはWikiページでも次のように示されているように

OSM地図データに含まれる情報のなかから指定した部分のみを抜き出す機能をもつ、読み出し専用のAPIです。サービスはWebを介したデータベー スとして提供されています。APIに対してクエリを行うことで、クライアントはクエリの内容に従った結果データを受け取ることができます。
データ編集用データの取得に主眼が置かれている標準のAPIとは異なり、OverPass APIは特定範囲内の特定データのみが必要となるデータ利用者 が使うことに主眼が置かれています。検索対象の上限はおおよそ 100,000,000要素までであり、場所・オブジェクトの種別・タグ内容・近接度などの基準による検索が可能です。

OSMを使ったローカルなWebサービスはもちろん、OSMデータを切り出してGISツールやデータベースに読み込んで集計するといった作業が処理速度を含め非常にスピーディに実行可能である。しかも、検索対象の理論上数値が非常に大きいということもあって(実際にはネットの速度とブラウザのメモリの両方でフリーズするけど)チューニングをあまり意識せずに操作可能なAPIでもある。

1.overpass APIとの出会い

一方、私のようなプログラミングに慣れていない者がAPIを気軽に扱うのは難しいもの…しかしOverpass APIをインターフェース上でわかりやすく処理できるサービスが以下のもの。

overpass turbo

インターフェースはこんな画面。左側にクエリ右側にOSM地図とクエリ結果がオーバーレイされる。

クエリ例はWikiのページ以外にも、このページの上部にあるボタン「Wizard」や「Template」などで簡単に実行可能で、試しにWizard欄に「amenity=drinking_water」という水飲み場タグを入力すると、

<osm-script output="json" timeout="25">
<union>
<query type="node">
<has-kv k="amenity" v="drinking_water"/>
<bbox-query {{bbox}}/>
</query>
<query type="way">
<has-kv k="amenity" v="drinking_water"/>
<bbox-query {{bbox}}/>
</query>
<query type="relation">
<has-kv k="amenity" v="drinking_water"/>
<bbox-query {{bbox}}/>
</query>
</union>
<!-- print results -->
<print mode="body"/>
<recurse type="down"/>
<print mode="skeleton" order="quadtile"/>
</osm-script>

というクエリが自動入力される。

なおメニューも充実しており主なものとしては

menubar
  • 共有:リンクをコピー|リンク先でのクエリの実行
  • エクスポート:GeoJSONやKML、JSOMへの転送など一通りのraw出力に加え、Gistやgeojson.ioへの転送もある。さらに、画像形式・インタラクティブマップなど大体の出力機能を網羅
  • 保存・読み込み:クエリを保存できる。テンプレートや保存したクエリを呼び出せる

といった高機能ぶりである。

2.集計

写真

さて、今回はOSMデータを地域別に集計してみよう。まずはベルリン市街で車椅子でアクセス可能(Wheelchair=yes)の入力状況は…

export
<osm-script output="json">
<!-- search the area of the Dolmites -->
<query type="area">
<has-kv k="boundary" v="administrative"/>
<has-kv k="admin_level" v="4"/>
<has-kv k="name" v="Berlin"/>

</query>
<print mode="body" order="quadtile"/>
<union>
<query type="node">
<area-query/>
<has-kv k="wheelchair" v="yes"/>

</query>
<query type="way">
<area-query/>
<has-kv k="wheelchair" v="yes"/>
</query>
<query type="relation">
<area-query/>
<has-kv k="wheelchair" v="yes"/>
</query>
</union>
<print mode="body" order="quadtile"/>
<query type="relation">
<has-kv k="boundary" v="administrative"/>
<has-kv k="admin_level" v="4"/>
<has-kv k="name" v="Berlin"/>
</query>
<print mode="body" order="quadtile"/>
<recurse type="down"/>
<print mode="skeleton" order="quadtile"/>
</osm-script>

7993 node
http://overpass-turbo.eu/s/1R0

であった。最初の太字の部分は空間的な範囲を決めるクエリで、テンプレートと異なる点は抽出範囲を矩形(bbox)とするかOSMデータとして登録済みのareaやboundaryを基とするかによる。

パリは…1317 node http://overpass-turbo.eu/s/1R1

ロンドンでは…1217 node http://overpass-turbo.eu/s/1R2

さて当然のことながら、ドイツ・フランス・イギリスと来たら、7年後にオリンピックを控えた東京都心(23区位?)のデータを集計してみたいところである。しかし東京に関するboundary=administrativeやリレーションは、残念ながらOdbLのライセンス切り替えによる影響で国土数値情報インポートがあったにも関わらず現在壊れてしまっている状態であるようだ。

というわけで上記の基準からは若干外れるものの、日本一括でやってみることに。

wheelchair Japan

10分ほどでデータ抽出でき8348 nodesという結果に。

せっかくなのでGistで出力すると、GeoJSON形式のデータがgithubに即時にアップロードされた。

というわけでテストを兼ねて幾つか集計した結果は以下のとおり

Cityrelation IDadmin_levelLength(KM)wheelchairvending machinemuseumGreater London1753425255.2221,2179461Paris7444654.5381,31711970Berlin624224230.2077,99366995日本38231327842.4908,3487,1003,177

3.まとめに代えて

以上、ごく基本的な使い方ではあるがOverpass API(主にoverpass turbo)の活用方法を基にOSMの地物を集計し共有する仕組みについて解説した。

大きな利点としてはQGISに代表されるDesktop GISを利用せずともOSMデータを空間的に抽出できること、また様々なフォーマットに出力することも可能である。その反面、overpass turboを用いると全てのクエリがOSMデータに対して行われるため、東京23区などの行政区界のように空間的範囲を規定するOSMデータが未整備の場合には注意が必要だろう(なお、既存のOSM上にある行政区界を使ってリレーションを作るというレベルであれば容易であるが、東京・埼玉近辺の場合行政区界の整備からしなければならない)

もちろんOSMデータとして整備されることが望ましいが、geojson.ioのようにSHPやKMLなどがインポート可能であれば、任意の空間範囲によるクエリも可能であり今後の機能追加やHowtoに期待したい。