JA:Overpass API/Overpass QL

From OpenStreetMap Wiki
Jump to: navigation, search
利用できる言語 — Overpass API/Overpass QL
· 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 · Tiếng Việt · Türkçe · Vahcuengh · vèneto · Wolof · Yorùbá · Zazaki · српски / srpski · беларуская · български · қазақша · македонски · монгол · русский · тоҷикӣ · українська · Ελληνικά · Հայերեն · ქართული · नेपाली · मराठी · हिन्दी · भोजपुरी · অসমীয়া · বাংলা · ਪੰਜਾਬੀ · ગુજરાતી · ଓଡ଼ିଆ · தமிழ் · తెలుగు · ಕನ್ನಡ · മലയാളം · සිංහල · བོད་ཡིག · ไทย · မြန်မာဘာသာ · ລາວ · ភាសាខ្មែរ · ⵜⴰⵎⴰⵣⵉⵖⵜ · አማርኛ · 한국어 · 日本語 · 中文(简体)‎ · 吴语 · 粵語 · 中文(繁體)‎ · ייִדיש · עברית · اردو · العربية · پښتو · سنڌي · فارسی · ދިވެހިބަސް
その他の言語このウィキの翻訳を支援してください
Overpass turbo · Overpass API · 言語リファレンス · クエリーの例 · 言語ガイド · 高度な例 · Sparse Editing · よくある質問 · MapCSS · その他: Overpass turbo 日本語 · Overpass API 日本語

Contents

概要

Overpass QL は、Overpass API における二番目の問い合わせ言語で、Overpass XML の代替として設計されたものです。Overpass QLは、C 言語風の文法用います。すなわち、クエリ全体のソースコードは、ステートメント からなっており、それぞれのステートメントはセミコロンで終わります。Overpass QL は命令型の言語です。すなわち、ステートメントが逐次処理されるにともない、実行状態がそれに応じて変化していきます。

実行状態には、デフォルトの集合 (set) および、オプションで名前つき集合があり、さらに、 for ブロックステートメントにはスタックがあります。集合の要素となり得るものには、ノード、ウェイ、リレーション、エリアがあります。これらは異なる種類が混在することができ、また、要素の数は任意です。集合は、ステートメントの結果集合として生成され、その後のステートメントで入力として読まれます。入力や結果として名前つき集合を指定しない場合は、暗黙のうちに、_ (単一の下線) という名前の既定の集合が、入力元や結果の書き込み先になります。集合の名前には、アルファベット、数字、下線を使うことができますが、最初の文字を数字にすることはできません。(暗黙あるいは明示的に) 新たな結果の書き込み先として既存の集合が割り当てられた場合、その集合の元からあった内容は上書きされてしまい、使えなくなります。集合はつねに大域的に有効です。

ステートメントには、複数の種類があります。ほぼ必ず必要なのは、アクション と呼ばれる print ステートメントです。これは、実行状態 (出力) を外部にもたらすものだからです。その他のステートメントは、以下のように分類されます。

  • 単独クエリー: それ自体で完結するステートメントです。
  • フィルター: これらは常に query ステートメントの一部となるもので、対象物のセレクターやフィルターからなります。
  • ブロックステートメント: ステートメントをグループ化したり、論理和やループに使うことができます。
  • 設定: 冒頭で指定可能な、出力形式などです。

集合 (set)

Overpass QL は、集合を伴って動作します。既定では、すべての読み取り元と送り先は "_" という既定の集合となります。

別の集合に送る場合は、"->" 書式を使います。たとえば以下のようにします。

  (node[name="Foo"];)->.a;

こうすると、name=Foo を持つすべてのノードが、集合 "a" に送られます。

ある集合から何かを選択する場合は、コマンドの末尾に ".a" のように付け加えます。

  node.a[amenity=foo];

こうすると、集合 "a" に含まれるノードのうち、amenity=foo タグを持つものがすべて返されます。

ブロックステートメント

和集合 (union)

union ブロックステートメントは、1 組の丸括弧の対で記述します。union ブロック内には、任意のステートメントの並びを置くことができ、入れ子になった unionforeach を置くこともできます。

  (ステートメント1; ステートメント2; )[->.result_set];

和集合には入力集合はありません。和集合は結果集合を生成します。和集合の結果集合は、送り先の有無にかかわらず、すべてのサブステートメントの結果集合の和集合になります。

例:

  (node[name="Foo"];way[name="Foo"];);

一つ目のステートメントでは "Foo" という値の name タグを持つ全ノードを、二つ目のステートメントでは "Foo" という値の name タグを持つ全ウェイを収集します。union ステートメントにより、全体の結果集合は、二つのステートメントの結果集合の和集合になります。

union ステートメントの結果集合は、通常の接尾辞の記法を使って送り先を指定することができます。

例:

  (node[name="Foo"];way[name="Foo"];)->.a;

先の例と同様ですが、結果は集合 "a" に書き込まれます。

制限事項: foreach および print ステートメントを union 内部に書くことはできません。

差集合 (difference)

difference ブロックステートメントは、1 組の丸括弧の対で記述します。difference ステートメントのなかには、ちょうど二つのステートメントを置き、その間にマイナス記号を置く必要があります。

  (ステートメント1; - ステートメント2;)[->.result_set];

入力集合をとりません。結果集合を生成します。この結果集合は、一つ目のサブステートメントの結果集合に含まれ、かつ二つ目のサブステートメントの結果集合に含まれないすべての要素からなります。

例:

  (node[name="Foo"]; - node(50.0,7.0,51.0,8.0););

これは、"Foo" という値の name タグを持ち、かつ与えられた領域には含まれないノードをすべて収集します。

difference ステートメントの結果集合は、通常の接尾辞の記法を使って送り先を指定することができます。

例:

  (node[name="Foo"]; - node(50.0,7.0,51.0,8.0);)->.a;

先の例と同様ですが、結果は変数 a に書き込まれます。

Intersection

It is also possible to produce a set of elements that appear in both of two input sets, i.e. elements that are part of both sets. This is described below in #By_input_set_.28.setname.29:

  node.a.b;

This is not a block statement, but listed here for its close relation to the difference statement described above.

収集制御ループ

For-each ループ (foreach)

foreach ブロックステートメントは、foreach キーワードと、それに続く 1 組の丸括弧の対で記述します。括弧内には、任意のステートメントの並びを置くことができ、入れ子になった unionforeach を置くこともできます。

入力集合をとります。結果集合は生成しません。foreach ステートメントは、入力集合の内容すべてにわたって、入力集合の各要素につき 1 回ずつ、ループします。

例:

  way[name="Foo"];
  foreach(
    (
      ._;
      >;
    );
    out;
  );

"Foo" という値の name タグを持つウェイすべてについて、ウェイごとに、そのウェイに含まれるノードを出力し、その直後に、ウェイ自身を出力します。より詳しくいうと、まず、way[name="Foo"] の結果集合を、次の入力集合として使います。次に、この入力集合の各要素について、ループの中身が1回ずつ実行されます。ループの中身では、その要素および要素に含まれるノードたちの和集合が作られ、その和集合が出力されます。 ループ実行中、ある反復において出力される部分集合は、別の反復におけるものとは独立しています。このため、全体の出力結果では、重複するオブジェクトがあるかもしれません(ループ内の out ステートメントでは union 処理はされません)。

foreach ステートメントの入力集合は、通常の接尾辞の書式を使って変更することができます。

例:

  foreach.a(...);

こうすると、既定の集合 "_" ではなく、集合 a をもとに、ループが実行されます。

丸括弧を開く直前に接尾辞の書式を追加することで、ループの要素を格納する集合を指定することもできます。

例:

  foreach->.b(...);

こうすると、ループの要素が変数 b に格納されます。このような記述をしない場合、foreach ステートメントでは、どの集合にも格納されません。 以下の例のようにすると、入力集合とループ要素の集合の両方を指定できます。

  foreach.a->.b(...);

注: 入力集合はループで変更することができません。集合を変更すると保存されて以降で使うことができますが、繰り返しの回数は変更されません。

単独クエリー

item

item 単独クエリーは、入力集合の接頭辞のみからなります。

指定された接頭辞にもとづく入力集合をとります。特に、union ステートメントで使うと便利です。union ステートメントで使った場合、その入力集合をそのまま union ステートメントの結果集合 (の一部) として生成します。

もっともありがちな使い方は、以下のように、既定の入力集合を使ったものです。

  ._;

union ステートメントの文脈の場合、以下の例は、既定の入力集合のアイテムすべてに、再起下降 の結果を追加したものを返します。

  (._; >;);

もちろん、以下のように、他の集合を使うこともできます。

  .a;

union ステートメントの文脈では以下のようになります。

  (.a; .a >;);

注: union ステートメント内で、後に続くステートメントは、item ステートメントの影響を受けません。特に、`.a;` は、その入力集合の内容を既定の集合 "_" に追加したりはしません。

item ステートメントは、フィルターとして使うこともできます。

再帰上昇 (<)

再帰上昇 単独クエリーは、単一の小なり記号で記述します。

入力集合をとります。結果集合を生成します。結果集合は以下のものから生成されます。

  • 入力集合に現れるノードを持つウェイすべて、加えて、
  • 入力集合に現れるノードまたはウェイを持つリレーションすべて、加えて、
  • 結果集合に現れるウェイを持つリレーションすべて

例:

  <;

再帰上昇ステートメントの入力集合は、通常の接頭辞の記法を使って、選ぶことができます。

  .a <;

再帰上昇ステートメントの結果集合は、通常の接尾辞の記法を使って、送り先を変えることができます。

  < ->.b;

もちろん、以下のように、この両方を変更することもできます。

  .a < ->.b;

再帰上昇リレーション (<<)

再帰上昇リレーション 単独クエリーは、再帰上昇と同様の文法を持っており、以下の2点だけが異なります。

  • 二連の小なり記号で記述します。
  • 入力集合に現れるリレーションをメンバーとして持つリレーションを、再帰的に返します。

特に、再帰上昇 単独クエリーと同様の記述を使って、入力集合や結果集合を変えることができます。

再帰上昇リレーション 単独クエリーは、被包含関係について、反射的かつ推移的な関係をもつ閉包を返します。

例:

  <<;

再帰下降 (>)

再帰下降 単独クエリーは、単一の大なり記号で記述します。

入力集合をとります。結果集合を生成します。結果集合は以下のものから生成されます。

  • 入力集合に現れるウェイの一部であるノードすべて、加えて、
  • 入力集合に現れるリレーションのメンバーであるノードおよびウェイすべて、加えて、
  • 結果集合に現れるウェイの一部であるノードすべて

特に、再帰上昇 単独クエリーと同様の記述を使って、入力集合や結果集合を変えることができます。

例:

  >;

再帰下降リレーション (>>)

再帰下降リレーション 単独クエリーは、再帰下降と同様の文法を持っており、以下の2点だけが異なります。

  • 二連の大なり記号で記述します。
  • 入力集合から得られるリレーションの要素たるリレーションを、再帰的に返します。

特に、再帰下降 単独クエリーと同様の記述を使って、入力集合や結果集合を変えることができます。

再帰下降リレーション 単独クエリーは、包含関係について、反射的かつ推移的な関係をもつ閉包を返します。

例:

  >>;

エリアのクエリー (is_in)

単独クエリー is_in は、以下のものを含むエリアを返します。

  • 与えられた座標(指定された場合) または、
  • 入力集合に含まれる1つ以上のノード(座標が指定されていない場合)

入力集合または単一の座標のいずれか一方を入力にとります。結果集合を生成します。結果は、入力集合から得られるノードの少なくとも一つ、または指定された座標を、その内部に含むエリアすべてです。

is_in cannot be directly used with any of the Overpass QL filters. For filtering the is_in result, a further query is needed (see below).

  [.input_set] is_in[->.result_set];
  is_in(緯度,経度)[->.result_set];

もっとも短い形は、検索対象の座標として入力集合をとるものです。以下の例のようになります。

  is_in;

入力集合は、通常の接頭辞の書式を使って変更することができます。

  .a is_in;

結果集合は、通常の接尾辞の記法を使って、送り先を変えることができます。

  is_in->.b;

もちろん、以下のように、この両方を変更することもできます。

  .a is_in->.b;

既存のノードを使うかわりに、2個の浮動小数点数をカンマで区切った形で、座標を指定することもできます。緯度、経度の順に書きます。座標を指定した場合、入力集合は無視されます。以下の例のようになります。

  is_in(50.7,7.2);

この形式の場合も、結果集合は、通常の接尾辞の記法を使って、送り先を変えることができます。

  is_in(50.7,7.2)->.b;

エリアの生成は、ある抽出規則によっています。すべてのウェイやリレーションに、対応するエリアがあるわけではありません。詳細は areas.osm3s および Areas の Wiki ページをご覧ください。

To filter the result returned by is_in by additional filter criteria, an additional query is needed:

  is_in(48.856089,2.29789);
  area._[admin_level="2"];     // ._ represents the default inputset, which contains all areas returned by ''is_in''

フィルター

もっとも重要なステートメントは、クエリー ステートメントです。これは単一のステートメントではなく、種類指定子 node, way, relation (または短縮形 rel), area のいずれかと、その後に続く、単独または複数のフィルターからなります。結果集合は、各フィルターの条件にマッチする要素すべてです。

例:

  node[name="Foo"];
  way[name="Foo"];
  rel[name="Foo"];
  area[name="Foo"];

ここで、 node, way, rel, area は種類指定子、[name="Foo"] はフィルターであり、セミコロンでステートメントが終わります。

クエリーステートメントの結果集合は、通常の接尾辞の記法を使って、送り先を変えることができます。

  node[name="Foo"]->.a;

個々のフィルターは、入力集合をとるものがあり、そのようなものは個々のフィルターにおいて入力集合を変更することができます。これについては、それぞれのフィルターの説明をご覧ください。

タグによるフィルター (has-kv)

has-kv フィルターは、属性値のあるタグを持つ、あるいは持たない要素をすべて選択します。OSM の基本的なオブジェクトの種類であるノード、ウェイ、リレーション、および、拡張された種類であるエリアに対応します。

入力集合をとりません。すべてのフィルターに共通ですが、結果集合はステートメント全体に対して生成され、個々のフィルターには生成されません。

どのフィルターも、開き角括弧( [ )で始まり、その次に単引用符または二重引用符で括られたキー文字列があり、その後はフィルターにより異なります。どのフィルターも、閉じ角括弧( ] )で終わります。文字列がアルファベットだけからなる場合は、引用符を省略することができます。

等号 (=, !=)

もっともありがちな形式です。指定された、特定の値を持つタグを含む要素をすべて選択します。この形式では、キー文字列の後に、等号と、その後に値の文字列を置きます。以下に、例として、いくつかの変形を挙げます。

  node["name"="Foo"];
  node[name=Foo];
  node['name'="Foo"];
  node[name="Foo"];
  node["name"='Foo'];

数字、空白類文字などを含む値は、以下のように、単引用符または二重引用符で括る必要があります。

  node["name"="Foo Street"];
  node["name"='Foo Street'];
  node[name="Foo Street"];

等値演算子 (訳註: '=') を使って空の値を問い合わせることは、できません。空の値の検索は、正規表現を使っておこなうことができます。

node[power=""];          // 非対応
node[power~"^$"];        // かわりに、正規表現を使う

同様に、このようなキー・値型のクエリーを使って空のキー値を問い合わせることもできないので、正規表現を使って表現する必要があります。

node[~"^$"~"."];         // 空のキー ("") で、何か値を持つノードを検索

註: Overpass Turbo Wizard には、""="" を自動的に変換する機構が組み込まれています。

存在

二つ目の形式です。特定のキーを持つ要素を、値によらず、すべて選択します。キー文字列と閉じ角括弧の間には何も置きません。

  node["name"];
  node['name'];
  node[name];

Not exists

This variant selects all element, that don't have a tag with a certain key and an arbitrary value. This shortcut is available since release 0.7.53.

  node[!"name"];
  node[!'name'];
  node[!name];


In previous versions, 'not exists' had to be written as node["name"!~".*"];.


値の正規表現マッチ (~, !~)

三つ目の形式です。特定のキーと、正規表現にマッチする値を持つ要素をすべて選択します。キー文字列の後には、チルダと、その後に検索対象の正規表現の文字列を置きます。

  node["name"~"^Foo$"];    /* "Foo" と完全に一致するものを検索 */
  node["name"~"^Foo"];     /* "Foo" から始まるものすべてを検索 */
  node["name"~"Foo$"];     /* "Foo" で終わるものすべてを検索 */
  node["name"~"Foo"];      /* "Foo" を含むものすべてを検索 */
  node["name"~"."];        /* すべてを検索 (「存在」と同じ) */
  node["name"!~"."];       /* "name" タグがないノードを検索(name キーがないもの) */

なお、QL 中ではバックスラッシュをエスケープする必要があります。 ["name"~"^St\."] は、^St. という正規表現にもとづく結果 ("St" で始まる name すべてを検索) が得られます。["name"~"^St\\."] ならば、St\. という正規表現に相当します ("St." で始まる name すべてを検索)。これは、C 言語のエスケープ規約によるものであり、XML の文法は当てはまりません。

大文字・小文字を区別しない

以下のようにして、大文字・小文字を区別しないようにすることもできます。

  node["name"~"^Foo$",i];    /* "foo", "FOO", "fOo", "Foo" などを検索。 */

キーと値(正規表現の有無に関わらず)の形式では、否定を使うことができます。この場合、指定されたキーを持つが値はマッチしない要素、および、指定されたキーのタグを持たない要素を選択します。

  node["name"!="Foo"];
  node["name"!~"Foo"];
  node["name"!~"Foo",i];

キー/値の正規表現マッチ (~"key regex"~"value regex")

四つ目の形式です。キーと値の両方が正規表現にマッチする要素すべてを選択します。最初のチルダ (~) の後に、キーを求めるための正規表現を置き、そのあとに、もう一つのチルダと、値のための正規表現を置きます。

  node[~"^addr:.*$"~"^Foo$"];    /* addr:* タグの値が "Foo" と完全に一致するものを検索 */
  node[~"^addr:.*$"~"^Foo"];     /* addr:* タグの値が "Foo" で始まるものを検索 */
  node[~"^addr:.*$"~"Foo$"];     /* addr:* タグの値が "Foo" で終わるものを検索 */
  node[~"^addr:.*$"~"Foo"];      /* addr:* タグの値が "Foo" を含むものを検索 */
  node[~"^addr:.*$"~"."];        /* 任意の値をもつ addr:* タグを検索 */

This format also supports case-insensitive searches: node[~"^addr:.*$"~"^Foo$",i];

境界ボックス

bbox-query フィルターは、境界ボックス内部の要素すべてを検索します。

入力集合をとりません。すべてのフィルターに共通ですが、結果集合はステートメント全体に対して生成され、個々のフィルターには生成されません。

  (south,west,north,east)

開き丸括弧で始まり、カンマで区切られた4個の浮動小数点数が続き、閉じ丸括弧で終わります。

それぞれの浮動小数点数は、境界ボックスの限界を示します。1個目の数は南限、すなわち最小の緯度です。2個目は西限で、通常は最小の経度です。3個目は北限、すなわち最大の緯度です。4個目は東限で、通常は最大の経度です。2個目の引数が4個目の引数より大きい場合、境界ボックスは180度の経線を跨ぐ形になります。

例:

  node(50.6,7.0,50.8,7.3);

再帰 (n, w, r, bn, bw, br)

再帰 フィルターは、与えられたパラメーターに応じて、入力集合の要素のメンバーの要素すべて、あるいは、入力集合の要素をメンバーとして持つ要素すべてを選択します。

入力集合は、接頭辞の記法を追加することで変更することができます。すべてのフィルターに共通ですが、結果集合はステートメント全体に対して生成され、個々のフィルターには生成されません。

開き丸括弧で始まり、w (ウェイをもとに順方向), r (リレーションをもとに順方向), bn (ノードをもとに逆方向), bw (ウェイをもとに逆方向), br (リレーションをもとに逆方向) のいずれかが続きます。その後に、オプションで、入力集合を指定します。閉じ丸括弧で終わります。

以下は、既定の入力集合を使った例です。

  node(w);        // 入力集合に含まれるすべてのウェイの子ノードを選択
  node(r);        // 入力集合に含まれるリレーションのメンバーのノードを選択
  way(bn);        // 入力集合に含まれるすべてのノードの親ウェイを選択
  way(r);         // 入力集合に含まれるリレーションのメンバーのウェイを選択
  rel(bn);        // 入力集合に含まれるノードをメンバーとして持つリレーションを選択
  rel(bw);        // 入力集合に含まれるウェイをメンバーとして持つリレーションを選択
  rel(r);         // 入力集合に含まれるすべてのリレーションのメンバーのリレーションを選択
  rel(br);        // 入力集合に含まれるすべてのリレーションの親リレーションを選択

以下は、入力集合を変更した例です。

  node(w.foo);

再帰の対象を、特定の役割(role)をもつリレーションのメンバーに限定することができます。コロンと役割名を、閉じ丸括弧の直前に追加すればよいです。

以下は、既定の入力集合を使った例です。

  node(r:"role");        // 入力集合に含まれるリレーションのメンバーのノードを選択
  way(r:"role");         // 入力集合に含まれるリレーションのメンバーのウェイを選択
  rel(bn:"role");        // 入力集合に含まれるノードをメンバーとして持つリレーションを選択
  rel(bw:"role");        // 入力集合に含まれるウェイをメンバーとして持つリレーションを選択
  rel(r:"role");         // 入力集合に含まれるすべてのリレーションのメンバーのリレーションを選択
  rel(br:"role");        // 入力集合に含まれるすべてのリレーションの親リレーションを選択

以下は、入力集合を変更した例です。

  node(r.foo:"role");

また、役割を持たないものを明示的に検索することもできます。

  node(r:"");
  node(r.foo:"");

入力集合によるフィルター (.setname)

"item" フィルターは、入力集合のすべての要素を選択します。

すべてのフィルターに共通ですが、結果集合はステートメント全体に対して生成され、個々のフィルターには生成されません。

ドットのあとに、入力集合の名前を書きます。

例: 既定の集合の場合は以下のようになり、

  node._;

名前つき集合の場合は以下のようになります。

  node.a;

複数の入力集合を指定することもできます。

  node.a.b;

このステートメントは、入力集合 .a と入力集合 .b両方 (積集合) に属するノードをすべて返します。

要素 id によるフィルター

id-query フィルターは、与えられた種類で、与えられた id を持つ要素を選択します。 OSM のデータ種類のノード、ウェイ、リレーションのほか、エリアにも対応しています。

入力集合をとりません。すべてのフィルターに共通ですが、結果集合はステートメント全体に対して生成され、個々のフィルターには生成されません。

開き丸括弧で始まり、その後に正の整数が続きます。閉じ丸括弧で終わります。

例:

  node(1);
  way(1);
  rel(1);
  area(1);

エリア id は、OSM のウェイに対してはウェイの id に 2400000000 を加え、リレーションに対しては id に 3600000000 を加える必要があります。なお、エリアの生成は、ある抽出規則によっています。つまり、すべてのウェイやリレーションに、対応するエリアがあるわけではありません。詳細は areas.osm3s をご覧ください。

他の要素との相対位置 (around)

around フィルターは、入力集合の要素から一定距離内にある要素すべてを選択します。座標を指定した場合は、入力集合のかわりに指定した座標を使います。入力集合は、接頭辞の記法を追加することで変更することができます。すべてのフィルターに共通ですが、結果集合はステートメント全体に対して生成され、個々のフィルターには生成されません。

距離 0 は、ウェイの交差判定に使うことができます。

文法: 開き丸括弧で始まり、その後にキーワード around が続きます。その後に、オプションで、入力集合の指定が続きます。さらにその後に、距離をメートル単位で表す単一の浮動小数点数が続きます。最後に、閉じ丸括弧、または、緯度・経度を表す二つの浮動小数点数(カンマ区切り)および閉じ丸括弧で終わります。

  (around[.input_set]:距離)
  (around:距離,緯度,経度)

例:

  node(around:100.0);
  way(around:100.0);
  rel(around:100.0);

入力集合を変えた例:

  node(around.a:100.0);

座標を指定した例:

  node(around:100.0,50.7,7.1);
  way(around:100.0,50.7,7.1);
  rel(around:100.0,50.7,7.1);

例: ボンにある映画館のうち、バス停から 100m 以内にあるものをすべて検索

area[name="Bonn"];
node(area)[highway=bus_stop];
node(around:100)[amenity=cinema];
out;

ポリゴンによるフィルター (poly)

polygon フィルターは、与えられた境界ボックス内部にある、指定された種類の要素をすべて選択します。

入力集合をとりません。すべてのフィルターに共通ですが、結果集合はステートメント全体に対して生成され、個々のフィルターには生成されません。

開き丸括弧で始まり、キーワード poly が続きます。その後に、偶数個の浮動小数点数を空白類文字で区切った文字列が続きます。2個ずつの浮動小数点の組は、座標を表すもので、緯度・経度の順で記述します。閉じ丸括弧で終わります。

  (poly:"緯度_1 経度_1 緯度_2 経度_2 緯度_3 経度_3 …");

例は以下のとおりです (ドイツ・ボン周辺の三角形)。

  node(poly:"50.7 7.1 50.7 7.2 50.75 7.15");
  way(poly:"50.7 7.1 50.7 7.2 50.75 7.15");
  rel(poly:"50.7 7.1 50.7 7.2 50.75 7.15");

newer

newer フィルターは、指定された日時以降に変更された要素すべてを検索します。他のフィルターとは異なり、このフィルターは単独で使うことはできません。背後にあるデータベースインスタンスが過去のデータに対応している場合は、"newer" ではなく "changed" を使ったほうがおそらくよいでしょう。

入力集合をとりません。すべてのフィルターに共通ですが、結果集合はステートメント全体に対して生成され、個々のフィルターには生成されません。

開き丸括弧から始まり、日時指定が続きます。なお、この日時指定では省略形を使うことはできず、常に単引用符または二重引用符で括る必要があります。閉じ丸括弧で終わります。

例:

  node._(newer:"2012-09-14T07:00:00Z");

これは、指定した入力集合から、協定世界時で 2012 年 9 月 14 日午前 7 時以降に変更されたノードすべてを検索します。

変更日時によるフィルター (changed)

changed フィルターは、指定された2個の日時の間に変更されたことのある要素すべてを選択します。日時が1個だけ指定された場合、2個目の日時はデータベースの最新の日時とみなします。 日時を1個だけ指定して、現在のタイムスタンプのもとで実行された場合、以下の2点の違いを除き、"newer" と同じ結果が得られます。違いの一つは、こちらの方がより速いこと、もう一つは、単一のフィルターとして使うことができることです。

入力集合をとりません。すべてのフィルターに共通ですが、結果集合はステートメント全体に対して生成され、個々のフィルターには生成されません。

開き丸括弧から始まり、日時指定が続きます。なお、この日時指定では省略形を使うことはできず、常に単引用符または二重引用符で括る必要があります。その後に、カンマと、2個目の日時指定が続きます。閉じ丸括弧で終わります。

例: 指定された日時から現在までの変更すべて

  node._(changed:"2012-09-14T07:00:00Z");

例: 2個の指定日時の間の変更すべて

  node._(changed:"2012-09-14T07:00:00Z","2012-09-14T07:01:00Z");

ユーザーによるフィルター (user, uid)

user フィルターは、指定されたユーザーが最後に手を加えた要素すべてを検索します。

入力集合をとりません。すべてのフィルターに共通ですが、結果集合はステートメント全体に対して生成され、個々のフィルターには生成されません。

開き丸括弧で始まり、「キーワード user、コロン、検索対象のユーザー名を表す文字列」または「キーワード uid のあとに検索対象のユーザーを表すユーザー ID 」が続きます。閉じ丸括弧で終わります。

例:

  node(user:"Steve");
  node(uid:1);

Since release 0.7.53 it is also possible to specify multiple user names:

   node(user:"Mapper1","Mapper2","Mapper 3");
   node(uid:1,2,4,8,16);

エリアによるフィルター (area)

area フィルターは、与えられたエリア内部にある、指定した種類の要素をすべて選択します。なお、過去のデータを対象とする場合についても、エリアは常に現在のデータに基づきますので注意してください。

入力集合は、接頭辞の記法を追加することで変更することができます。すべてのフィルターに共通ですが、結果集合はステートメント全体に対して生成され、個々のフィルターには生成されません。

文法: 開き丸括弧ではじまり、キーワード area が続きます。その後に、コロンと非負整数を付けることができます。閉じ丸括弧で終わります。

ノードの場合は、エリアの内部または境界線上にあるものが検索されます。ウェイの場合は、少なくとも 1 点 (線分上の点も可) がエリアの内部 (境界線を含まない) にあるものが検索されます。エリア境界線上に終端があるだけで、エリアと交わらないようなウェイは、検索されません。リレーションの場合は、そのメンバーのいずれかがエリア内部 (境界線上を含まない) にあるものが検索されます。

area ステートメントで整数が指定されない場合は、入力集合から得られるエリアが使われます。例は以下のようになります。

  node(area);
  way(area);
  rel(area);

入力集合を変えた例は以下のようになります。

  node(area.a);
  way(area.a);
  rel(area.a);

整数を追加すると、入力集合は無視され、そのかわりに指定された整数の id を持つエリアを使います。

  node(area:2400000001);
  way(area:2400000001);
  rel(area:2400000001);

Caveat: area(area); is currently not supported. In this case, the (area) filter will be silently ignored, leading to unexpected results.


Because areas in OSM are not native elements but are only inferred from the OSM database using its closed ways or relations; this facility allows grouping their various representation in a coherent set which can store their geometry, independently of their complexity and representation in the OSM database, as if they were a single distinctive element, without using complex filtering rules in your query. However associating these objects with an OSM id attribute requires some adjustment because the same id value could be used for unrelated elements with different type (way or relation). For this reason, areas returned by the Overpass API only have a "virtual" id specific to the Overpass API, but not found directly in the OSM database.

エリア id の求めかたは、OSM のウェイに対してはウェイの id に 2400000000 を加え、リレーションに対しては id に 3600000000 を加えることになっています。なお、エリアの生成は、ある抽出規則によっています。つまり、すべてのウェイやリレーションに、対応するエリアがあるわけではありません。詳細は areas.osm3s をご覧ください。

エリアは、Overpass API サーバー上の定期的なジョブで生成されているため、OSM 本体のデータベースとは数時間のずれがあります。Overpass json や xml での結果に含まれる `timestamp_areas_base` の値を確認すれば、正確なタイムスタンプがわかります。

If you want more immediate results (not depending on the delayed batch processing), you can also write your own filters without using this facility in your Overpass query: use standard OSM element types and ids and filter them by specific tags of your choice.

See areas.osm3s for details of the filters (written using the XML variant of the Overpass query language) currently by Overpass used to generate the areas that can be queried with this facility. Those areas are defined using the "pivot" query feature (see below).

エリアの中核 (pivot)

pivot フィルターは、指定された種類の要素で、与えられたエリアの輪郭を定義するものを選択します。

入力集合は、接頭辞の記法を追加することで変更することができます。すべてのフィルターに共通ですが、結果集合はステートメント全体に対して生成され、個々のフィルターには生成されません。

開き丸括弧で始まり、キーワード pivot が続きます。閉じ丸括弧で終わります。

このステートメントは、入力集合中の各エリアに対して、それぞれのエリアの生成元となる要素を検索します。そのような要素は、マルチポリゴンリレーションまたはウェイのいずれかです。

例:

  way(pivot);
  rel(pivot);

入力集合を変更した例:

  way(pivot.a);
  rel(pivot.a);

以下の例では、最初の行で、グレーター・ロンドン地方のエリアを見つけて、その結果を結果集合 .londonarea に格納します。次の行では、結果集合 .londonarea に含まれるエリアを、pivot フィルターを使って、対応する OSM のリレーションに変換します。最終的に、out geom; でそのリレーションを (ウェイとノードを含めて) 出力します。

area[name="London"][admin_level=6][boundary=administrative]->.londonarea;
rel(pivot.londonarea);
out geom;

アクション

現在のところ、1 種類のアクションだけがあります。入力集合の内容を出力するというものです。

出力 (out)

out アクションは、out とセミコロンの間に、空白類文字で区切ったパラメーターを追加して、構成することができます。

out アクションは入力集合をとります。結果集合は返しません。入力集合名を前に置くことで、入力集合を変えることができます。

使えるパラメーターは以下のとおりで、順序は任意です。

  • 饒舌さ度合い。以下のいずれか一つ。既定値は body
    • ids: 要素の id のみを出力します。
    • skel: 必要な位置情報をあわせて出力します。追加されるのは、ノードの座標、および、ウェイとリレーションについてはそのメンバーの id です。
    • body: データを使うために必要な情報をすべて出力します。追加されるのは、すべての要素のタグと、リレーションのメンバーの役割です。
    • tags: 各要素がもつ id とタグのみを出力し、座標やメンバーの情報は出力しません。
    • meta: 要素についてのあらゆる情報を出力します。body で出力される情報に加えて、すべての要素について、バージョン、変更セットの id、タイムスタンプ、最後に手を加えたユーザーのデータが含まれます。
  • 派生情報の追加。以下のいずれか一つ。
    • bb: 各要素に、その要素の境界ボックスを追加します。ノードに対しては "geom" と同じです。ウェイに対しては、含まれる全ノードが内包される境界ボックスです。リレーションに対しては、メンバーたる全ノードおよび全ウェイを内包する境界ボックスです (メンバーたるリレーションの影響はありません)。
    • center: ウェイおよびリレーションに対して、前述の境界ボックスの中心を追加します。なお、中心点は、必ずしもポリゴン内部にあるとは限らないので注意してください()。
    • geom: 各オブジェクトに完全な位置情報を追加します。各ノード、ウェイおよびリレーションのメンバーたる各ノードに座標を追加します。また、全リレーションに、座標つきの "nd" メンバーを追加します。

"geom" パラメーターの後には、"(南,西,北,東)" の形式の境界ボックスを追加することができます。この場合、追加した境界ボックス内部の座標のみが生成されます。ウェイについては、正しい形の線分群とするために、境界ボックスからはみだした最初の座標も生成されます。

  • 並び順の指定。以下のいずれか一つ。既定値は asc
    • asc: オブジェクト id でソートします。
    • qt: 4分割タイルのインデックスでソートします; これは、大雑把な位置順であり、id によるソートよりかなり高速です。
  • 出力する要素数の最大値を指定する非負整数。既定値は無制限。

例:

  out;

メタ情報を含めずに、要素を出力します。

例:

  out meta;

メタ情報を含めた、要素を出力します。

例:

  out 99;

最大で 99 個の要素を出力します。

例:

  out meta qt 1000000;

最大で 1,000,000 個の要素を、位置順に並べ、メタ情報を含めて出力します。

例:

  .a out;

出力するデータとして、集合 a から読み取ります。

設定

timeout

timeout 設定は、1個の非負整数のパラメーターを持ちます。既定の値は 180 です。

このパラメーターは、利用者が考える、クエリーの実行時間の最大許容値を、秒単位で表します。クエリーの実行がこの時間を超えた場合、サーバーは時間切れとしてクエリーを中断します。二つ目の効果として、大きな値を指定した場合、サーバーがクエリーの実行前に拒否する可能性が高くなります。

このため、本当に複雑で大きなクエリーを送る場合は、大きな値、たとえば1時間を表す "3600" を指定してください。この場合、お使いのクライアントが、指定した時間内にクライアント側からタイムアウトしないようにしてください。

例:

  [timeout:180]

要素の上限 (maxsize)

maxsize 設定は、1個の非負整数のパラメーターを持ちます。既定の値は 536870912 (512 MB) です。

このパラメーターは、利用者が考える、クエリーの実行によるサーバー上の RAM の最大許容値をバイト単位で表します。クエリーがこの値を超える RAM を要した場合、サーバーはメモリー枯渇としてクエリーを中断します。二つ目の効果として、大きな値を指定した場合、サーバーがクエリーの実行前に拒否する可能性が高くなります。

このため、本当に複雑で大きなクエリーを送る場合は、大きな値、たとえば 1 GB を表す "1073741824" を指定してください。 The maximum value highly depends on the current server load, e.g. requests for 2GB will likely be rejected during peak hours, as they don't fit into the overall resource management. Technically speaking, maxsize is treated as a 64bit signed number.

例:

  [maxsize:1073741824]

Important notice: Recently, a new mechanism was introduced to abort queries exceeding 2 GB of memory. This exact size of this limit is still under discussion and might change over time. If you experience error messages like "runtime error: Query run out of memory using about 2048 MB of RAM.", be sure to read this thread as well: http://permalink.gmane.org/gmane.comp.gis.openstreetmap.overpass/237

出力形式 (out)

out 設定は out アクションとは関係ないので注意してください。両者の記法を混同しないように

out 設定は、OSM データを返す際の出力形式を定義します。5 個の値のいずれかを指定することができます。既定値は xml です。

  • xml
  • json (geoJSON とは別物)
  • csv
  • custom
  • popup

例:

[out:json]


CSV 出力モード

CSV 出力形式は、OSM データを csv ドキュメントとして返します。これは LibreOffice などのツールで直接開くことができます。フィールドの並びを定義するための構成パラメーターが必要となります。また、オプションで、csv ヘッダー行や、区切り文字のためのパラメーターを指定することができます。

形式:

[out:csv( フィールド名_1 [,フィールド名_n ...] [; csv-ヘッダー行 [; csv-区切り文字 ] ] )]
フィールド名のリスト

通常の OSM のフィールド名のほか、以下の特別なフィールドを使うことができます。

特別なフィールド名 説明
 ::id OSM オブジェクトの ID
 ::type OSM オブジェクトの種類: node, way, relation
 ::otype OSM オブジェクトの種類を数値で
 ::lat 緯度 (ノードに対して、または out center モードの場合に利用可能)
 ::lon 経度 (ノードに対して、または out center モードの場合に利用可能)
以下のメタ情報フィールドは、OSM 要素の出力に out meta; が使われている場合のみ使用可能です。
 ::version OSM オブジェクトのバージョン番号
 ::timestamp OSM オブジェクトの最終変更のタイムスタンプ
 ::changeset オブジェクトが変更された変更セット
 ::uid OSM のユーザー id
 ::user OSM のユーザー名

なお、これらの特別なフィールドはいずれも、2個のコロン "::" を前に置く必要があります。


例:

[out:csv(::"id", amenity, name, operator, opening_hours, "contact:website", "contact:phone", brand, dispensing, lastcheck)];

ボンにある鉄道の駅:

[out:csv(::id,::type,"name")];
area[name="Bonn"]->.a;
( node(area.a)[railway=station];
  way(area.a)[railway=station];
  rel(area.a)[railway=station]; );
out;


ヘッダー行

ヘッダー行は、一つ目のオプションのパラメーターです。フィールドのリストの直後に、セミコロンで区切って追加することができます。指定可能な値には、truefalse があります。このパラメーターを指定しなかった場合は、ヘッダー行が出力されます。

[out:csv(::"id",amenity,name,operator,opening_hours,"contact:website","contact:phone",brand,dispensing,lastcheck;false)];


区切り文字

既定では、各フィールドはタブ文字 (\t) で区切られます。しかし、この区切り文字の設定は、二つ目のオプションのパラメーターを使って変えることができます。以下の例では、すべての出力フィールドが、タブ文字の代わりにパイプ文字 ("|") で区切られます。

[out:csv(::"id",amenity,name,operator,opening_hours,"contact:website","contact:phone",brand,dispensing,lastcheck;true;"|")];


Checking for complete data

Unlike other output modes like XML and JSON, there's currently no indication of any error message at all. An empty result (or a result with just a header line) might indicate either that nothing was found or that the query was aborted due to timeout or some other more serious error condition. One way to work around this is to introduce an additional counter, which summarizes the previous query result and is always put as the very last output statement of a query.

The following example extends the previously shown list of all railway stations in Bonn by an additional count output:

[out:csv(::type,::id,"name",::count)];
area[name="Bonn"]->.a;
( node(area.a)[railway=station];
  way(area.a)[railway=station];
  rel(area.a)[railway=station]; );
out;
out count;

Note that the result now includes an additional line with @type count and an indication of how many total elements are contained in the current resultset. If the final count line is missing or the total number differs, you know for sure that something went wrong and the query results are incomplete/inconsistent.

@type	@id	name	@count
node	26945519	Bonn-Oberkassel	
node	1271017705	Bonn-Beuel	
node	2428355974	Bonn-Bad Godesberg	
node	2713060210	Bonn Hauptbahnhof	
node	3400717493	Bonn-Mehlem	
count			5


custom および popup の各値も、追加の構成パラメーターが必要となります。詳細は output formats documentation をご覧ください。

大域的な境界ボックス (bbox)

bbox 設定を使うと、すべてのクエリー (明示的に別の境界ボックスが定義されているものを除く) に対する暗黙的な境界ボックスを定義することができます。

境界ボックスは、南側の緯度西側の経度北側の緯度東側の経度 の順 (これは 標準の順序 です) で記述します。

  [bbox:,西,,]

例:

  [bbox:50.6,7.0,50.8,7.3]

おおむね、北緯 50.7 度、東経 7.15 度にあるドイツの都市ボン周辺の境界ボックスを適用します。

クエリーを、data= パラメーターの値として URL エンコードする場合、境界ボックスを別のパラメーターとして追加することもできます。この場合は、経度-緯度 の順で指定します。これは OpenLayers その他のフレームワークと共通の順序です。

リクエスト全体の例:

  /api/interpreter?data=[bbox];node[amenity=post_box];out;&bbox=7.0,50.6,7.3,50.8

これは、おおむねドイツ・ボンにある郵便ポストすべてを検索します。

過去のデータ ("date")

date 設定は、データベースが、過去の時点でのデータベースの状態にもとづき、クエリーに回答するようにします。たとえば、破壊されたデータを再構築するような場合に有用です。

識別子 "date" と、その後に続くコロンおよび日付指定からなります。

例:

  [date:"2012-09-12T06:55:00Z"]

この後のクエリーを、2012 年 9 月 14 日 15:00 UTC 時点であるかのように処理します。


Limitation : The earliest possible date to return a result is 2012-09-12 06:55:00 UTC (1347432900 in epoch seconds).

It corresponds to the first change included in the first ODbL compliant planet file, which was created on 2012-09-14. If your query asks for an object in a state prior to what this planet file contains, Overpass API will return the version contained in the first ODbL compliant planet.


Origin of the name : "Attic Data" refers to the "invisible" data of the versions of OSM data older than the recent one. On the OSM website it can be found behind the "history" link every object has. The term "Attic Data" stems from CVS-terminology and there referred to data which was not really needed anymore but still kept to maybe return the system to the consistent state of an earlier date.

On purpose the term "historic data" was not used since it is not really "historic" as in "old castle" or similar (have a look at OpenHistoricalMap) but as in "deprecated" or "outdated".¹

2個の日時の間の差分 ("diff")

diff 設定は、データベースが、過去の二つの異なる時点におけるクエリーの差分をとるようにします。たとえば、データベース抽出用のデルタ生成に有用です。

識別子 "diff" の後にコロンと、その後に日付指定、さらに、オプションでカンマと二つ目の日付指定からなります。日付指定が一つだけの場合は、二つ目の日付は現時点とみなします。

例:

  [diff:"2012-09-14T15:00:00Z"]

この後のクエリーを、2012 年 9 月 14 日 15:00 時点であるかのように処理します。次に、同じクエリーを現時点のデータに対して処理します。最後に、この二つの結果の差分を出力します。

  [diff:"2012-09-14T15:00:00Z","2012-09-21T15:00:00Z"]

これも、基本的に同じですが、9 月 14 日の状態と 9 月 21 日の状態とを比較するところが違います。

Note that the output does not include any intermediate versions, which might exist between the first and the last timestamp, i.e. if there are several changes on an object, only the last version in the given timeframe is returned.

2個の日時の間の拡張形式の差分 ("adiff")

adiff は基本的には "diff" と同じですが、新しい方の結果に含まない要素すべてについて、何が起きたかを表すところが違います。

要素が削除されている場合、最終削除日が出力され、"visible=false" と示されます。要素が変更されてクエリーにマッチしなくなっている場合、最終変更日が出力され、"visible=true" と示されます。

詳しい情報は、 Augmented Diffs を参照してください。

特別な書式

コメント

この問い合わせ言語では、C のソースコードなどと同じ形式でコメントを書くことができます。

  out; // 単一行のコメント
  /* スラッシュとアスタリスクで始まるコメントは、必ずアスタリスクとスラッシュで閉じる必要があります。 */
  /* なお、この形のコメントは、
         複数行にわたって書くことができます。 */

エスケープ

以下に挙げる、C 形式のエスケープシーケンスを使うことができます。

  • \n: キャリッジリターンをエスケープ
  • \t: タブ文字をエスケープ
  • \", \': それぞれ、二重引用符、単引用符をエスケープ
  • \\: バックスラッシュをエスケープ
  • \u#### (ハッシュ文字は、4桁の十六進数です): 対応する unicode UTF-16 コードユニットをエスケープします。Unicode escape sequences をご覧ください。
    なお、データベースでは、文字は UTF-8 で 1 バイト (U+0000..U+007F の範囲にある、7 ビット US-ASCII 文字集合に属する文字のみ) あるいはマルチバイトにエンコードされます。Unicode の標準 17 面内のスカラー値が割り当てられたすべての文字は、UTF-8 としてエンコードされます。
    しかし、このエスケープ書式では、BMP に割り当てられた文字にしか対応しません。「サロゲート」は Unicode の「文字」ではなく、妥当な UTF-8 にエンコードできません。BMP の非 ASCII 文字は、UTF-8 では 2 バイト (U+0080..U+07FF の範囲) または 3 バイト (U+0800..U+FFFFの範囲から、U+D800..U+DFFFの範囲の「サロゲート」を除いたもの) にエンコードされます。
    BMP 外の Unicode 文字は、UTF-16 ではサロゲートペアで表現されます。「妥当な」UTF-16 サロゲートペア (U+D800..U+DBFF の範囲の「上位サロゲート」に、U+DC00..U+DFFFの範囲の「下位サロゲート」が続くもの) のみが、UTF-8 に変換可能であり、\uD###\uD### のようにエスケープされます(不正なサロゲートペアや、ペアになっていないサロゲートのエスケープ結果は定義されません)。このようにエスケープされた妥当なサロゲートペアは、UTF-8 に変換すると 4 バイト (追加面 1 から 15) または 5 バイト (最後の追加面である 16、私用面で相互運用性がないため OSM データでは使ってはいけません) になります。
  • 現在のところ、近代的な C で使われる、妥当な 17 個の Unicode 各面上の任意のコードポイント (サロゲートを除く) を表現できる \U000##### という共通のエスケープの書式には、対応していません。また、任意の 8 ビットバイト用の共通のエスケープ書式 '\x## (C において、エンコーディング非依存のものとして定義されたもの) にも対応していません。エスケープする必要がなければ、リクエストにエスケープはなるべく使わずに、生の妥当な UTF-8 を使ってください。

実験的な機能

この節で述べる機能は、v0.7.51 で導入されたものですが、十分テストされたものではなく、公式に周知されたものでもありません。何かバグや問題があった場合は、Github の issue として報告いただくようお願いします。

要素の計数

既存の出力モードのほか、out count; を使うと、指定された入力セットに含まれる要素の総数を、個々の OSM オブジェクトを転送することなしに返すことができます。XML, JSON, CSV モードで使うことができます。

out count;


XML 出力モード
  <count total="923" nodes="923" ways="0" relations="0"/>


JSON 出力モード
{
  "count": {
    "total": 923,
    "nodes": 923,
    "ways": 0,
    "relations": 0,
    "areas": 0
  }
}


CSV 出力モード

さきに概説した CSV 出力モードの出力フィールドのほかに、要素の計数機能による特別なフィールド名が追加されています。

特別なフィールド名 説明
以下の各フィールドは、out count; ステートメントを通じてのみ使うことができます。
 ::count 入力セット中の要素 (ノード、ウェイ、リレーション、エリア) 数の総計を返します
 ::count:nodes 入力セット中のノードの数を返します
 ::count:ways 入力セット中のウェイの数を返します
 ::count:relations 入力セット中のリレーションの数を返します
 ::count:areas 入力セット中のエリアの数を返します

ウェイ・リレーションを、エリアに対応づける (map_to_area)

註: このステートメントは、今後、仕様が変わる可能性があります

map_to_area ステートメントは、OSM のオブジェクト id (ウェイ、リレーションのいずれも可) を、そのオブジェクトに対応する Overpass API におけるエリア id に対応づけます。

これは、Overpass API 内部で、以下のような対応づけ方法によりおこなわれます。

  • ウェイFor ways: ウェイの OSM id に 2400000000 を加える
  • リレーション: リレーションの OSM id に 3600000000 を加える

例:

rel(62716);
out;              // リレーション 62716 を出力
map_to_area;      // OSM のリレーションを、id に 3600000000 を加えることで、Overpass API のエリアに対応づけ
out;              // エリア 3600062716 を出力


このステートメントの主な使い途は、大きいエリアの一部分であるエリア内のオブジェクトを検索する("エリア内エリアクエリー")というものです。

: Overpass API 内部のエリア生成過程では、OSM のすべてのウェイやリレーションに対してエリアが生成されるわけではありません。与えられたウェイやリレーションに対応するエリアがない場合、map_to_area は当該オブジェクトを飛ばして、エリアは追加しません。


以下に、このステートメントの使い方として考えられるものの概観を示します。

例 1: ケルンの中心業務地区にあるすべての酒場を検索

名前が "Innenstadt" のエリアという条件だけで問い合わせると、ケルン以外も含んだ大量のエリアが返されてしまいます。

area[name="Köln"]->.b;
rel(area.b)[name="Innenstadt"];
map_to_area -> .a;
node(area.a)[amenity=pub];
out meta;


例 2: ヘッセン州の郡のうち、消防署のないものをすべて検索

area[admin_level=4]["name"="Hessen"][boundary=administrative]->.boundaryarea;

( node(area.boundaryarea)["amenity"="fire_station"];
  way(area.boundaryarea)["amenity"="fire_station"];>;) ->.a;

.a is_in -> .b; 
area.b[admin_level=8] -> .bf; 

rel(area.boundaryarea)[admin_level=8];
map_to_area -> .bllf;

(.bllf - .bf ) ; 
rel(pivot); (._;>;); out;


例 3ː 郡ごとの薬屋の数を計数

[out:csv(::"type",::"id", name, admin_level,::"count")];
area[name="Saarland"][boundary];
 rel(area)[boundary][admin_level=6];
 map_to_area;
 foreach->.d(
   (.d;);out; 
   (node(area.d)[amenity=pharmacy];
    way(area.d)[amenity=pharmacy];
    relation(area.d)[amenity=pharmacy];);
   out count;
 );