JA:Overpass API

From OpenStreetMap Wiki
Jump to: navigation, search
利用できる言語 — Overpass API
· Afrikaans · Alemannisch · aragonés · asturianu · azərbaycanca · Bahasa Indonesia · Bahasa Melayu · Bân-lâm-gú · Basa Jawa · Basa Sunda · Baso Minangkabau · bosanski · brezhoneg · català · čeština · corsu · dansk · Deutsch · eesti · English · español · Esperanto · estremeñu · euskara · français · Frysk · Gaeilge · Gàidhlig · galego · Hausa · hrvatski · Igbo · interlingua · Interlingue · isiXhosa · isiZulu · íslenska · italiano · Kiswahili · Kreyòl ayisyen · kréyòl gwadloupéyen · Kurdî · latviešu · Lëtzebuergesch · lietuvių · magyar · Malagasy · Malti · Nederlands · Nedersaksies · norsk bokmål · norsk nynorsk · occitan · Oromoo · oʻzbekcha/ўзбекча · Plattdüütsch · polski · português · română · shqip · slovenčina · slovenščina · Soomaaliga · suomi · svenska · Tagalog · Tiếng Việt · Türkçe · Vahcuengh · vèneto · Wolof · Yorùbá · Zazaki · српски / srpski · беларуская · български · қазақша · македонски · монгол · русский · тоҷикӣ · українська · Ελληνικά · Հայերեն · ქართული · नेपाली · मराठी · हिन्दी · भोजपुरी · অসমীয়া · বাংলা · ਪੰਜਾਬੀ · ગુજરાતી · ଓଡ଼ିଆ · தமிழ் · తెలుగు · ಕನ್ನಡ · മലയാളം · සිංහල · བོད་ཡིག · ไทย · မြန်မာဘာသာ · ລາວ · ភាសាខ្មែរ · ⵜⴰⵎⴰⵣⵉⵖⵜ ⵜⴰⵏⴰⵡⴰⵢⵜ‎ · አማርኛ · 한국어 · 日本語 · 中文(简体)‎ · 中文(繁體)‎ · 吴语 · 粵語 · ייִדיש · עברית · اردو · العربية · پښتو · سنڌي · فارسی · ދިވެހިބަސް
その他の言語このウィキの翻訳を支援してください
Overpass API logo.svg
±
Overpass API · 言語リファレンス · 言語ガイド · Technical terms · 言語ガイド · クエリーの例 · 高度な例 · Sparse Editing · Permanent ID · よくある質問 · もっと (日本語) · Web site
Servers status · Versions · Development · Technical design · Installation · XAPI compatibility layer · Public transport sketch lines · アプリケーション · Source code and issues
Overpass turbo · Wizard · Overpass turbo shortcuts · MapCSS stylesheets · Export to GeoJSON · もっと (日本語) · Source code and issues · Web site
Overpass API logo.svg

概要

Overpass API(別名 OSM3S)とは読み出し専用のAPIであり、OSM地図データの中から個別に選択された部分を取り出します。Webを介したデータベースとして動作します。利用者はAPIに対してクエリを送り、クエリに対応したデータ セットを受け取ります。

編集に最適化されている標準のAPIとは異なり、OverPass APIはデータ利用者向けに最適化されています。利用者は数個の要素を即座に得たり、最大約1億個の要素を数分かかって得ることができ、例えば位置、オブジェクトのタイプ、タグの内容、近接度やその組合せによる検索条件によって選び出すことができまる。様々なサービスのデータベースのバックエンドとして動いています。

Overpass APIはXAPIより強力なクエリ言語((言語ガイド言語リファレンスIDEの一例)を持ちますが、XAPIからのスムーズな移行が可能な互換レイヤーも備えています。

OSMの標準サービスを最小限でスケーラブルに保っておくため、Overpass APIはサードパーティのサービスとして動作します。パブリックに利用できるサービスとして以下のものがあります。

どちらのサーバーも1日当たり1,000,000リクエストの処理能力があります。1日あたり10,000クエリまたは5GBのデータ取得より少なければ、他のユーザーを邪魔しないと考えてよいでしょう。

Overpass APIへのクエリは、XMLかOverpass QL形式です。文法は下記参照。

Overpass turboフロントエンドを使って、上記のOverpass APIインスタンスへのクエリを作成したり表示したりすることができます。

Overpass APIはパーマネント リンクも提供しています。

開発者 / システム管理者

最新の安定リリースgitソースコード リポジトリ(最新バージョン)から、独自のインスタンスをインストールすることができます。ライセンスはAffero GPL v3です。

このプロジェクトは、Roland Olbricht (mail: roland.olbricht@gmx.de)がメンテナンスしています。ソースコードへのバグ レポートやプル リクエストなどの貢献も歓迎しています。

開発者向けのメーリングリストもあります。

制限

どのようなサービスにも制限は付き物です。Overpass APIもそうです。

  • 大きなデータのダウンロード:

Overpass APIクエリの結果のサイズは、ダウンロードが完了して初めて分かります。残り時間を推定することはできません。 同じ領域からの場合でも、すでに静的に用意されたものに比べ、Overpass APIから動的に生成されるファイルをダウンロードするためには、たいていはより長い時間がかかります。したがって、国レベルのサイズの領域から(ほぼ)すべてのデータを抽出しようとする場合には、Planet.osmミラーを使う方が良いでしょう。領域の中で利用可能なデータのうちの一部分の選択だけを必要とする場合に、Overpass APIは便利なのです。

  • OSMデータの履歴のクエリ:

Overpass APIは 変更セットベースの抽出条件は提供しません。時刻ベースの差分を使うワークアラウンドも可能ですが、ややこしいでしょう。オブジェクトの全履歴も得ることもできませんが、時刻ベースの選択基準を使えばオブジェクトのある時点での状態を得ることはできます。

マップ クエリ

クエリの詳細な文法を説明する前に、おそらく最も一般的な使い方であるマップ クエリを示します。このクエリは特定の矩形領域内の全データ(メタデータを含む)を収集します。

Overpass XML Overpass QL
try it yourself in overpass-turbo
<union>
  <bbox-query s="51.249" w="7.148" n="51.251" e="7.152"/>
  <recurse type="up"/>
</union>
<print mode="meta"/>
try it yourself in overpass-turbo
(node(51.249,7.148,51.251,7.152);<;);out meta;

クエリを実行するには、ここのクエリフォームに入力しても良いし、Overpass turboを使って結果を地図上で確認することもできます。

矩形領域(51.249,7.148,51.251,7.152)の中の値は、最小緯度、最小経度、最大緯度、最大経度(つまり、南-西-北-東)の順序です。矩形領域の詳細は後で説明します。

シンプルな使用例

Overpass APIクエリ言語についての詳細は、Overpass API言語ガイド、またはOverpass APIクエリ言語の解説を参照してください。

高度な使用例

以下の使用例では、まだ説明していないコマンド、recursearoundを紹介します。これらのコマンドは、他のコマンドと組み合わせないと意味がありません。

繰り返しますが、以下の例はすべてhttp://www.overpass-api.de/query_form.htmlへコピーして試してみることができます。

注意: クエリが完了するまでには数分かかるでしょう。もしタイムアウトになる場合は、タイムアウト時間を延長することができます。

recurse

recurseは、リレーションの所属関係へのクエリを行います。ウェイに参照されている全ノード、リレーションのメンバーである全ノードと全ウェイの取得ができます。また逆方向に、ノード、ウェイ、リレーションに対して、その要素がメンバーになっているウェイやリレーションを取得できます。要素のタイプを選ぶには、typeを使います。

例: refキーの値がCE 61であるリレーションのノードをすべて取得します。現実にはCE 61路線のバス停をすべて取得します。

<query type="relation">
  <has-kv k="ref" v="CE 61"/>
</query>
<recurse type="relation-node"/>
<print/>

refキーの値がCE 61であるリレーションのウェイをすべて取得します。現実にはCE 61路線の運行ルートです。

<query type="relation">
  <has-kv k="ref" v="CE 61"/>
</query>
<recurse type="relation-way"/>
<print/>

上記のウェイのノードをすべて取得します。バス停は含まれませんが、これは意図通りです。後述のunionの例を参照してください。

<query type="relation">
  <has-kv k="ref" v="CE 61"/>
</query>
<recurse type="relation-way"/>
<recurse type="way-node"/>
<print/>

Lichtscheidという名前を持つノードをメンバーとして持つすべてのリレーションを取得します。これらは、その場所に停車するバス路線です。

<query type="node">
  <has-kv k="name" v="Lichtscheid"/>
</query>
<recurse type="node-relation"/>
<print/>

指定した矩形領域に含まれるノードをメンバーとして持つすべてのウェイを取得します。

<bbox-query s="51.249" n="51.251" w="7.149" e="7.151"/>
<recurse type="node-way"/>
<print/>

リレーションのメンバーであるリレーションを取得することもできます。

<query type="relation">
  <has-kv k="name" v="VRR Buslinien"/>
</query>
<recurse type="relation-relation"/>
<print/>

逆方向もできます。

<query type="relation">
  <has-kv k="ref" v="CE 65"/>
</query>
<recurse type="relation-backwards"/>
<print/>

around

一つまたは複数のノードの近くにあるノードすべてを、aroundで取得できます。 例えば、Bristolと呼ばれるノードから10メートル以内にあるノードをすべて取得します。

Overpass turboで実際に試す
<query type="node">
  <has-kv k="name" v="Bristol"/>
</query>
<around radius="10"/>
<print/>

クエリを連鎖させれば、第1の基準に一致するノードの近くに位置して第2の基準を満足するようなノードだけを取得することができます。ここでは、"Bristol"という名前のパブから100メートル以内のバス停をすべて探してみましょう。

Overpass turboで実際に試す
<query type="node">
  <has-kv k="amenity" v="pub"/>
  <has-kv k="name" v="Bristol"/>
</query>
<query type="node">
  <around radius="100"/>
  <has-kv k="highway" v="bus_stop"/>
</query>
<print/>

基本要素

まだ説明していない補助的なステートメンがあります。特に、unionitem、変数メカニズム、osm-scriptforeachです。

しつこいですが、以下の例はすべてhttp://www.overpass-api.de/query_form.htmlへコピーして試してみることができます。

union

unionによって、いくつかのクエリの結果をまとめることができます。例えば名前がLichtscheidまたはMüngstener Straßeであるノードをすべて取得できます。

<union>
  <query type="node">
    <has-kv k="name" v="Lichtscheid"/>
  </query>
  <query type="node">
    <has-kv k="name" v="Müngstener Straße"/>
  </query>
</union>
<print/>

別の例として、あるリレーションと、そのメンバーすべてと、メンバーであるウェイに含まれるノードとを取得します。

<union>
  <query type="relation">
    <has-kv k="ref" v="CE 61"/>
  </query>
  <recurse type="relation-node" into="nodes"/>
  <recurse type="relation-way"/>
  <recurse type="way-node"/>
</union>
<print/>

ここは少し説明が必要でしょう:

  • queryは、refがCE 61のリレーションを収集します。その結果をデフォルト変数 _ に書き込みます。そして外側のunionがデータを収集します。
  • recurse relation-nodeは、上記で見つかったリレーションのメンバーであるようなノードを収集します。結果は変数nodesに置かれます(この変数は以降では使われず、ただ単にデフォルト変数の中のリレーションを残すためのものです)。そして外側のunionにより収集されます。
  • recurse relation-wayは、再びデフォルト変数を参照し、デフォルト変数内のリレーションのメンバーであるウェイを返します。同様に、外側のunionが結果を収集します。
  • 最後にrecurse way-nodeは、たった今収集されたウェイのメンバーであるノードを返します。これがunionの結果に入るデータの最後の一群です。

複雑に感じるでしょうか、それは正しいです。どのようにステートメントの文法を改善できるか、提案を歓迎しています。私自身はシステマティックな改善方法をまだ見つけられていません。

ここまでで、bbox-queryといくつかのrecurseステートを組合せ、unionで全部を囲むことによって、地図の取り出しを組み立てることができるようになりました。

item

itemや変数の背景にある考え方は一部、これまでの例で見てきたものです。 すべてのステートメントは入力をある変数から取り出し、出力をある変数へ置きます。変数名が省略された場合、デフォルトは _ になります。これにより、ほとんどの場合は明示的に変数を定義する必要が無くなります。from属性で名前を指定された変数から入力が取り出され、intoで指定された変数へ出力が置かれます。

<query type="way" into="foo">
  <has-kv k="name" v="Am Hofe"/>
</query>
<print from="foo"/>

例えば、これはprintの例で示されたものと同じことをしますが、明示的に記述された変数fooを使用します。

このコンセプトを汎用的にするために、unionqueryへの入力を、itemによって指定できます。

<query type="relation">
  <has-kv k="network" v="VRR"/>
  <has-kv k="ref" v="645"/>
</query>
<recurse type="relation-node" into="stops"/>
<query type="node">
  <around from="stops" radius="100"/>
  <has-kv k="highway" v="bus_stop"/>
</query>
<union>
  <item/>
  <recurse type="node-relation"/>
  <query type="node">
    <around from="stops" radius="100"/>
    <has-kv k="park_ride"/>
  </query>
</union>
<print/>

この例の中ほどのitemは、それまでに収集されたbus_stopのデータがunionの結果に含まれることを保証します。 クエリを可能にするためにstops変数がどのように必要となるかも、この例で分かります。

<bbox-query s="51.15" n="51.35" w="7.0" e="7.3"/>
<recurse type="node-way"/>
<query type="way">
  <item/>
  <has-kv k="highway" v="motorway"/>
</query>
<print/>

クエリ中のitemは、見つけられる項目を、その前のステップ、recurseですでに見つかっている項目の中だけに限定します。このようにして、ある矩形領域の中で任意のタグをもつウェイを見つけることができる、完全なクエリが可能になります。

osm-script

明示的に指定しなければ、osm-scriptは暗黙的に追加されます。明示的に指定するのは、リソースの使い方を調整したいときです。

<osm-script timeout="900" element-limit="1073741824">

<bbox-query s="51.15" n="51.35" w="7.0" e="7.3"/>
<print/>
</osm-script>

この例はタイムアウトを3分から15分(900秒と記述)に延ばします。 さらに、メモリ使用のソフト クォータが1Gバイト(= 1073741824バイト)にセットされます。

foreach

<query type="relation">
  <has-kv k="type" v="multipolygon"/>
  <has-kv k="name"/>
</query>
<foreach into="pivot">
  <union>
    <recurse type="relation-way" from="pivot"/>
    <recurse type="way-node"/>
  </union>
  <make-area pivot="pivot"/>
</foreach>

これは領域を作るためのルールの核心部分です。ここではmake-areaの説明はしません。最初のquery部分は、特定の性質を持つリレーションを集めます。2番目の部分では、queryの結果に含まれる各要素に何かをしようとします。foreachがこれを行います。ループの中身は入力となる集合の要素すべてに対して一回ずつ実行されます。この例ではpivotという名前の出力集合へ、そのそれぞれの要素も含められます。

メタ データ

printの特別なモードとは別に、特定のメタ データのための専用のクエリが2つあります。usernewerです。

user

ある特定のユーザーによって最後に変更されているデータすべてを選択できます。 ユーザー名を選びましょう(例として、私のです)。

<user name="Roland Olbricht"/>
<print mode="meta"/>

または、ユーザーIDを選びましょう。

<user uid="65282"/>
<print mode="meta"/>

このステートメントは、クエリ ステートメントの中でも使えます。その場合、指定されたユーザーによって最後に変更されたデータに、クエリ結果が限定されます。

<query type="node">
  <user name="Roland Olbricht"/>
  <has-kv k="highway" v="bus_stop"/>
  <bbox-query s="51.2" n="51.35" w="7.05" e="7.3"/>
</query>
<print mode="meta"/>

newer

newerはクエリ ステートメントの中で使えます(単独のステートメントとしては使えません)。 与えられた日時より新しい要素に、出力を限定します。 日時は、YYYY-MM-DDTHH:MM:SSZ の形式である必要があります。必然的に、常にUTCタイム ゾーンとして扱われます。

<query type="node">
  <newer than="2011-08-01T00:00:00Z"/>
  <has-kv k="highway" v="bus_stop"/>
  <bbox-query s="51.2" n="51.35" w="7.05" e="7.3"/>
</query>
<print mode="meta"/>

矩形領域内で特定の日時より新しいノードをすべて取りたい場合は、queryitemサブ ステートメントを付けます。

<bbox-query s="51.2" n="51.35" w="7.05" e="7.3"/>
<query type="node">
  <item/>
  <newer than="2011-08-01T00:00:00Z"/>
</query>
<print mode="meta"/>

公共交通の例

Overpass APIがアプリケーション内でどのように使えるか、の例として興味深いのは、公共交通の線ダイアグラムを生成するサービスです。

Preview of Transportation Example 1

Preview of Transportation Example 2

(サーバーの負荷によって、リクエストしてから生成されるまでに10秒ほどかかるときもあります。辛抱してください。)

XAPI互換レイヤー

詳細や使用例は

を参照してください。

Overpass関連のプログラム、スクリプト

Python API

Node.js API

  • query-overpassは、シンプルなAPIラッパーで、OverpassへのCLI

Converters

議論、プレゼン、ワークショップ

このセクションでは、Overpass APIやそれに関連するこれまでのプレゼン、議論、ワークショップを一覧します。プレゼンの多くはサンプルが豊富で、初心者の出発点としても適しています。

日付 イベント 場所 タイトル タイプ 発表者 言語 リンク
2015年3月 FOSSGIS 2015 ミュンスター (ドイツ) OpenStreetMapで宝探し プレゼン Roland Olbricht ドイツ語 概要, ビデオ
2015年3月 FOSSGIS 2015 ミュンスター (ドイツ) Overpass APIによるOpenStreetMapデータの維持と探索 ワークショップ (有料) Roland Olbricht ドイツ語 素材の参照不可
2015年2月 FOSDEM 2015 ブリュッセル (ベルギー) Overpass-API - OpenStreetMapデータを検索するサービス プレゼン Roland Olbricht 英語 スライド, ビデオ
2014年9月 ボン (ドイツ) ZERAでのOverpass-APIセミナー ワークショップ Roland Olbricht ドイツ語 Manuscript, スライド
2014年6月 SotM-EU 2014 カールスルーエ (ドイツ) Overpass API v0.7.50 - 時間次元 プレゼン Roland Olbricht 英語 スライド/ビデオ
2014年6月 SotM-EU 2014 カールスルーエ (ドイツ) 疎な編集 - 大スケールのオブジェクトを編集する プレゼン Roland Olbricht 英語 スライド/ビデオ
2014年3月 FOSSGIS 2014 ベルリン (ドイツ) Overpass APIによるOpenStreetMapデータの抽出、分析、フィルター ワークショップ (有料) Roland Olbricht ドイツ語 素材の参照不可
2013年10月 Intergeo 2013 エッセン (ドイツ) Overpass APIによるOSMデータの直接利用 プレゼン Roland Olbricht ドイツ語 スライド
2013年10月 OSMit 2013 ロヴェレート (イタリア) Overpass Turbo プレゼン Martin Raifer イタリア語 スライド
2013年3月 FOSSGIS 2013 ラッパーズヴィール (スイス) Overpass APIによるOpenStreetMapデータの抽出、分析、フィルター ワークショップ Roland Olbricht ドイツ語 スライド
2013年3月 FOSSGIS 2013 ラッパーズヴィール (スイス) overpass turbo - OpenStreetMapデータの簡単な解析 プレゼン Martin Raifer ドイツ語 スライド, ビデオ, FOSSGIS 2013会議資料
2013年3月 FOSSGIS 2013 ラッパーズヴィール (スイス) OSM、OpenLayers、Overpass APIによるモバイル カードの生成 プレゼン Roland Olbricht ドイツ語 スライド, ビデオ
2012年12月 OSMDE009 OSMトーク: Overpass API ポッドキャスト Roland Olbricht, Stephan/RadioOSM ドイツ語 リンク
2012年3月 FOSSGIS 2012 ベルリン (ドイツ) Overpass API プレゼン Roland Olbricht ドイツ語 スライド, FOSSGIS 2012会議資料
2011年6月 SotM-EU 2011 ウィーン (オーストリア) Overpass API - オープンでスリムなXAPIの代用 プレゼン Roland Olbricht 英語 スライド, ビデオ