JA:Overpass API/FAQ

From OpenStreetMap Wiki
Jump to: navigation, search
利用できる言語 — Overpass API/FAQ
Afrikaans Alemannisch aragonés asturianu azərbaycanca Bahasa Indonesia Bahasa Melayu Bân-lâm-gú Basa Jawa Baso Minangkabau bosanski brezhoneg català čeština 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 norsk nynorsk occitan Oromoo oʻzbekcha/ўзбекча Plattdüütsch polski português português do Brasil română shqip slovenčina slovenščina Soomaaliga suomi svenska 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 · もっと (日本語) · Development · 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" という名前の集合にリダイレクトすることができます。質問にあるような書式は、これを制御するものです。