JA:Overpass API/FAQ
Servers status · Versions · Development · Technical design · Installation · XAPI compatibility layer · Public transport sketch lines · アプリケーション · Source code and issuesOverpass turbo · Wizard · Overpass turbo shortcuts · MapCSS stylesheets · Export to GeoJSON · もっと (日本語) · Development · Source code and issues · Web siteOverpass Ultra · Examples · Overpass Ultra extensions · MapLibre stylesheets · URL Params · もっと (日本語) · Source code and issues · Web site
クエリー
クエリーをもとにマップ上に描いたウェイが、期待したものと違うのはなぜ?
ウェイで使われているノードも一緒に返されるようにしてください。通常は、以下のようにすればよいです。
<union> <recurse type="way-node"/> </union>
クエリーに対して何も返らないのはなぜ? test map page が "Searching..." のままになってしまうのはなぜ?
クエリーの文法が妥当か確認してください。たとえば XML を使っている場合、スラッシュが漏れていないか、あるいはタグを閉じ忘れていないか、など。
union 内の二つのクエリーは、AND 条件? OR 条件?
OR です。
「type=boundary または type=multipolygon というタグを持つリレーションと、そのメンバーのウェイと、そのメンバーのウェイで使われているノードを全部取得する」というクエリーは、どのように書いたらいい?
以下のようにすればよいです。
[timeout:86400]; ( rel[type=boundary]; rel[type=multipolygon]; ); ( ._; way(r); node(w); ); out;
この例を、順に見ていきましょう。
[timeout:86400];
は、この例では結果が本当に大きなものになるはずなので、必要です。86400 は秒単位での時間で、実行時間が長くて丸一日かかりそうだということです。既定値は 180 秒で、web ブラウザーなどの HTTP クライアントの通常のタイムアウトに合わせた値となっています。
rel[type=boundary];
は、データベースから、キー "type" と値 "boundary" のタグを持つリレーションをすべて収集します。この結果は、クエリーサーバーのメモリー上で、既定の動作として、"_" という集合に格納されます。
この部分の結果を見たい場合、以下のようにして、この時点での集合の内容を出力することができます。
http://overpass-api.de/api/interpreter?data=rel[type=boundary];out;
同様に、 rel[type=multipolygon] は、データベースから、キー "type" と値 "multipolygon" のタグを持つリレーションをすべて収集します。以下のようにして、結果を確認できます。
http://overpass-api.de/api/interpreter?data=rel[type=multipolygon];out;
この時点で、データはかなり大量になっています。
ここで、union ステートメントを適用します。これは、ここまでの2件の結果それぞれをコピーして、結果としてそれらの和集合を生成するものです。
( rel[type=boundary]; rel[type=multipolygon]; );
これの意味は以下のとおりです。まず、rel[type=boundary]; の出力が収集され、次に rel[type=multipolygon]; の出力が収集されます。ステートメントの最後の部分で、この両者の和集合がコンテナー "_" に格納され、最後のサブステートメント "rel[type=multipolygon]" におけるコンテナー "_" を置き換えます。この時点でのコンテナー "_" の内容は、以下を実行すれば見ることができます。
http://overpass-api.de/api/interpreter?data=(rel[type=boundary];rel[type=multipolygon];);out;
文脈上は、コンテナー "_" には type が boundary または multipolygon であるリレーションがすべて含まれました。ここで、二つ目の union ブロックに入ります。
( ._; way(r); node(w); );
最初のサブステートメント "._" は、union ブロック内でのみ有用なものです。これは、入力コンテナー "_" の内容を、コンテナー "_" に出力するものです。これは、コンテナー "_" に変更を加えるものではなく、現在のコンテナー "_" の内容をコピーして union ステートメントの出力に加えるものです。
これで、必要な種類のリレーションすべてを、コンテナー "_" と、uinon の内部コンテナーの両方に格納することができました。
次のサブステートメント "way(r);" は、入力をコンテナー "_" から読み取り、出力を同じコンテナー "_" に書き出して、元の入力データを上書きするものです。これにより、文脈上は、"way(r);" は、必要な種類のリレーションのメンバーたるウェイすべてを、コンテナー "_" に格納します。これは union のサブステートメントなので、union ブロック全体としては、この出力を内部ストレージに追加することになります。
その次のサブステートメント "node(w);" は、入力をふたたびコンテナー "_" から読み取り、出力を同じコンテナー "_" に書き出します。これは、入力中のウェイのメンバーたるノードをすべて検索します。入力元のコンテナー "_" には、この時点で、コンテナー "_" 中のリレーションのメンバーたるウェイがすべて含まれているので、必要なノードがすべてコンテナー "_" に含まれることになります。また、まだ union ブロックの中にいるので、union の内部ストレージには、必要なリレーション ("._" による)、ウェイ ("way(r);" による)、ノード ("node(w);" による) が含まれることになります。union ステートメントの終わり、ソースコードでいえば ");" の部分で、union ステートメントがこれらをコンテナー "_" に格納します。
最後に必要なのは、"out;" ステートメントを使ってこれを出力することだけです。メタ情報が必要な場合は、"out meta;" を使えばよいでしょう。高速に実行したい場合は、"out qt;" をお試しください。これは、要素をまず種類の順、次いでid の順に出力するのではなく、まず種類の順、次いで場所の順に出力するもので、出力がより高速になります。なお、以下のURL中の "+" は、URL 全体がリンクとして認識されるよう表示するための cgi のエスケープであって、Overpass QL の文法によるものではありませんが、サーバー上で自動的に変換されます。
http://overpass-api.de/api/interpreter?data=[timeout:86400];(rel[type=boundary];rel[type=multipolygon];);(._;way(r);node(w););out+qt;
(最も速い)
http://overpass-api.de/api/interpreter?data=[timeout:86400];(rel[type=boundary];rel[type=multipolygon];);(._;way(r);node(w););out;
(ふつう)
http://overpass-api.de/api/interpreter?data=[timeout:86400];(rel[type=boundary];rel[type=multipolygon];);(._;way(r);node(w););out+meta;
(最も詳細)
出力
print コマンドは、各 union ステートメントの結果をすべて出力するのか? それとも最後のステートメントの結果だけか?
print コマンド実行時点での集合 "_" の内容を出力します。このため、「最後のステートメントの結果」ということになります。
クエリ言語と文法
どの問い合わせ言語を使うのがよいか?
Overpass QL の書式を使うことをおすすめします。Overpass QL と XML のどちらも同じ文脈を扱うことができますが、Overpass QL のほうが簡潔です。XML は多くの方にとって扱いづらいという理由で、Overpass QL が作られました。
この .->x とか .->_ って、どういうこと?
Overpass は 命令型の実行モデル を持ちます。とくに、ステートメントが順次実行されてゆき、各ステートメントはセミコロンで終わります。各ステートメントの結果は、メモリー上で、既定では "_" という名前を持つ集合に蓄積されます。ステートメントに入力が必要な場合は、入力として "_" から読み込みます。たとえば、print ステートメントは、"_" から読み込みます。
複雑なクエリーにおいては、複数の集合を使うのが便利なことがあります。そのような場合は、出力を別の集合、たとえば "x" という名前の集合にリダイレクトすることができます。質問にあるような書式は、これを制御するものです。