JA:Overpass API/FAQ

From OpenStreetMap Wiki
Jump to navigation Jump to search
Overpass API logo.svg
edit
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 · もっと (日本語) · Development · Source code and issues · Web site
Overpass 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" という名前の集合にリダイレクトすることができます。質問にあるような書式は、これを制御するものです。