Using OverPass API
いいだ さとし
nyampire@gmail.com
Who am I?
飯田 哲 (いいだ さとし)
Twitter @nyampire
JIPDEC 電子情報利活用研究部 主任部員
OpenStreetMap Foundation Japan
オープンデータまわりでもボチボチ
OverPass APIとは?
OpenStreetMapの生データを、オブジェクトの属性ごとに
抽出してダウンロードできる、読み出し専用API
例えばこんなかんじのクエリで抽出
喫茶店だけ (amenity=cafe)
煙草の吸える喫茶店だけ (amenity=cafe and smoking=yes)
煙草が吸える場所、あるいは喫茶店だけ (amenity=cafe or smoking=yes)
○○町の中にある喫茶店だけ (amenity=cafe in SOME_AREA)
Hack’n Chop
“ウィザード” を押してクエリ生成
Overpass turbo(http://overpass-turbo.eu/)
クエリの生成と実行のできるウェブツール
当然オープンソース (https://github.com/tyrasd/overpass-turbo, MIT licensed)
Overass turboクエリフロー
OSM database
user
overpass turbo
[overpass API interface][OSM API interface]
通常の編集を行う場合のinterface
主な使われ方
osm24.eu
主な使われ方
Leaflet Overpass plugin
OSMデータ構造の基本
3つのオブジェクトタイプ
Node, 点, ポイント
Way, 線, ライン (closed way, 閉じたウェイ, ポリゴン)
Relation, リレーション
各オブジェクトには一意のIDが振られている
各オブジェクトに対して、key=valueのストアで属性管理
クエリの生成
“ウィザード” を押してクエリ生成
“amenity=cafe” と入力してみましょう
生成されたクエリ
抽出されたデータ
抽出されたデータは geoJSON, KML, GPX でエクスポート可能
[out:json][timeout:25];
// gather results
(
node["amenity"="cafe"]({{bbox}});
way["amenity"="cafe"]({{bbox}});
relation["amenity"="cafe"]({{bbox}});
);
// print results
out body;
>;
out skel qt;
クエリの説明
[出力はJSON形式]
[クエリ実行時のタイムアウトは25秒]
(
nodeオブジェクトの [amenity=cafe]を {{bbox}}内から抽出;
way 〃;
relation 〃;
)
出力の実行
OSM編集に使えるデータを抽出する場合、skel を meta に変更
qt は asc にもできるけど、どちらでも (データ並び順)
[out:json][timeout:25];
// gather results
(
node["amenity"="cafe"]({{bbox}});
way["amenity"="cafe"]({{bbox}});
relation["amenity"="cafe"]({{bbox}});
);
// print results
out body;
>;
out skel qt;
例: Nodeだけ抽出したい場合は
この部分を消して、node行だけにして実行
コメントアウトする場合は行頭に // を入れる
[out:json][timeout:25];
// gather results
(
node["amenity"="cafe"]["wheelchair"="yes"]({{bbox}});
);
// print results
out body;
>;
out skel qt;
車椅子で入れる喫茶店node
[out:json][timeout:25];
// gather results
(
node["amenity"="cafe"]({{bbox}});
node["wheelchair"="yes"]({{bbox}});
);
// print results
out body;
>;
out skel qt;
車椅子で入れるnode あるいは 喫茶店node
[out:json][timeout:25];
// gather results
(
node["amenity"="cafe"]["name"~"コトハナ"]({{bbox}});
);
// print results
out body;
>;
out skel qt;
正規表現も使えます
= のかわりに ~を使う。
!= とか !~ を使うと、○○を除いた、の表現
[out:json][timeout:25];
// gather results
(
node["amenity"="townhall"]({{bbox}});
node(around:100)["amenity"="cafe"]({{bbox}});
);
// print results
out body;
>;
out skel qt;
近傍検索
市役所 (amenity=townhall) と
そこから100メートル以内にある喫茶店 (amenity=cafe)
2つの記法、どっちがいいの?
OSM wikiのサンプルでは、2つの記法が出てきます
Overpass XML と Overpass QL (混在しています (^^;)
Overpass QLが推奨 (overpass XMLは将来的にdeprecate予定)
クエリの変換はこちら http://overpass-api.de/convert_form.html
OSMのリアルタイムなデータを動的に使いたい場合に便利
nogajunさんによる、非常に詳細な解説ページを参照☆彡
[uMapとOverpass API(overpass turbo)を使ってOpenStreetMatsuyaマップを作る]
http://www.nofuture.tv/diary/20150623.html#p01
ポップアップに画像 (Mapillaryとかflikrとか) を表示させる例
[OSM-ja] uMapでOverpass API検索を使う方法をまとめました
https://lists.openstreetmap.org/pipermail/talk-ja/2015-June/008948.html
uMapでの実装
higa4さんによる兼六園map
http://umap.fluv.io/ja/map/map_2554#17/36.56266/136.66250
より詳しいドキュメントは、OSM wikiを参照してください
JA:Overpass API/Overpass QL
skelとかmetaの説明もこちら
http://wiki.openstreetmap.org/wiki/JA:Overpass_API/Overpass_QL
Overpass API/Language Guide
クエリサンプルとかはこちら (ややoutdate部分あり)
http://wiki.openstreetmap.org/wiki/JA:Overpass_API/Language_Guide
詳細情報
動的じゃなくてよい場合
エクスポートしたgeoJSONをサーバ上に保存しておいて、
LeafletなどのgeoJSONレイヤに格納して重畳する方法
ウェイ情報を扱う場合にはこちらのほうが楽かも
その他の選択肢
turf.jsでいろいろできるらしい
JavaScriptで完結するGISソフトウェア
サンプル: https://www.mapbox.com/blog/dc-bikeshare-revisited/
APIドキュメンテーション: https://www.mapbox.com/developers/api/directions/
経路探索を使う場合、OSRMとかGraphHopperが有名
OSRM: http://project-osrm.org/
GraphHopper: https://graphhopper.com/
enjoy! :)

UDC in NAIST Overpass APIの紹介