JA:Overpass API/言語ガイド
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
このページに書かれている機能は最新ではなく不完全です。機能の包括的な一覧は、 Overpass QL のウィキページを参照してください。 |
このガイドではOverpass APIを用いたクエリの豊富なサンプルをしめします。あなたの必要に応じてこれらのクエリを活用してください。
背景とコンセプト
Overpass APIは、自分が指定した基準によってOSMデータを検索することができます。その目的のため、特別にあつらえられたクエリ言語を持っています。
Overpass APIでは基本として、順番に実行されるステートメントによって、OSMデータ(ノード、ウェイ…)の列が生成され加工されます。例えば次の簡単なクエリは、指定された矩形範囲内のすべてのノードを含むデータ列を生成し、出力します。
node(50.745,7.17,50.75,7.18);out;
さらにバス停だけを見るために、結果列をフィルターすることができます。
node(50.745,7.17,50.75,7.18)[highway=bus_stop];out;
また、選択されたノードを参照しているウェイを含むように結果を拡張することもできます。この場合、これらのウェイから参照されているすべてのノードにまで結果を拡張したいかも知れません。
node(50.745,7.17,50.75,7.18);way(bn);(._;>;);out;
これらのステートメントとその文法は、以降で詳細に説明します。
言語
現在のOverpass APIでは、単一のHTTP GETリクエストの中ですべての表現能力をしています。この目的のため、普及しているXMLクエリ言語と並行して、新しいクエリ言語Overpass QLが導入されました。これらは双方向に変換ができます。後述のサンプルのどれかをhttp://overpass-api.de/convert_form.htmlの中でペーストしてみてください。そのフォームでは出力として以下を選べます。
- XMLクエリ形式: 後述のすべてのサンプルのXML形式と合致します。
- 読みやすいOverpass QL: 後述のOverpass QL形式に合致します。
- 簡潔なOverpass QL: 同じことを表現する1行のHTTP GETリクエストを生成します。
クエリを実行するには、代わりにhttp://overpass-api.de/query_form.htmlを使ってください。
後述のQL文法の例のいくつかは見覚えがあるかも知れません。QL文法はより簡潔で、C言語のようなプログラミング言語にやや似ています。ステートメントは必ずセミコロン ";" で終わります。さらに、
- ステートメントは、"node"、"way"、"rel"、"relation"のどれか("rel"は"relation"の省略形)で始まるクエリ ステートメント、または">"、">>"、"<"、"<<"の特殊ステートメントです。
- または"out"で始まる出力ステートメントです。
クエリ ステートメントは、タイプと、1つ以上の節から構成されます。節にはいろいろなタイプがあります。
タグ リクエストのすべての変形。例えば、
["key"="value"]
["key"]
["key"~"value"]
["key"!="value"]
["key"!~"value"]
または矩形範囲節
(51.0,7.0,52.0,8.0)
矩形範囲節は必ず低緯度、低経度、高緯度、高経度の順序です。XAPI文法での順序とは異なることに注意してください。XML文法では名前付きのパラメータを使うことで安全を確保しています。
またはメンバー関係のリンクの順向きか逆向きの再帰
(r)
(w)
(n)
(br)
(bw)
(bn)
(>)
(>>)
(<)
(<<)
または、"(type:value)"という形式の特殊な節。
より詳細は、使用例の該当する部分で記述されます。
リンクについて
大部分のサンプルでは地図へのリンクにより図示されます。これはまだ実験的なやり方です。矩形範囲は常にドイツの町ボンを見せるように固定さてています。いくつかのクエリはとても長い時間がかかります。サーバーに必要なキャッシュが無ければ1分以上かかるかも知れません。記号は見た目が悪いですが、これはエンドユーザー向けのマッシュアップでは置き換えることができるでしょう。記号は発見のしやすさが第一であるべきです。
使用例
この記号 がある場合はクリックすることができます。overpass turboを使ってクエリとその結果を調べられます。
何かを見つける
OpenStreetMapデータの中から何かを見つけるということは、ある場所か、特定のタグの値か、を検索することを意味します。以下のサンプルのタグでは好きなキーを選ぶことができます。第一歩として名前によってオブジェクトを探しましょう。"name"キーの特定の値について検索します。
正確な名前によって
最初のサンプルでは、nameタグの値によってノードを検索します。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="name" v="Gielgen"/>
</query>
<print/>
</osm-script>
|
node["name"="Gielgen"];
out body;
|
結果を表示: OpenLayers map, JSON, XML
正確な名前と大まかな場所によって
もし結果が十分に正確でなければ、矩形範囲を指定することにより、特定の矩形範囲の内部だけから結果を得ることができます。座標の順番は (低緯度、低経度、高緯度、高経度) です。矩形範囲が用意できなければ、以下のサンプルがちょうど良いでしょう。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="name" v="Gielgen"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
|
node
["name"="Gielgen"]
(50.7,7.1,50.8,7.2);
out body;
|
結果を表示: OpenLayers map, JSON, XML
あるものの近くにある他のもの
複数の結果を得るためのもっと身近な方法としては、近くの場所を指定することで何かを見つけることができます。例えば、"Bonn"と呼ばれる場所から半径1000メートル以内にある"Gielgen"という場所を検索できます。
(回転楕円体を考慮した計算ではないので(詳しくは ここを参照)、ある程度の近似になっています)
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="name" v="Bonn"/>
</query>
<query type="node">
<around radius="1000"/>
<has-kv k="name" v="Gielgen"/>
</query>
<print/>
</osm-script>
|
node["name"="Bonn"];
node
(around:1000)
["name"="Gielgen"];
out body;
|
結果を表示: OpenLayers map, JSON, XML
あいまいな名前
正確な名前を知らなくてもオブジェクトを見つけることができます。この目的のため、Overpass APIでは正規表現(POSIX拡張)が使えます。便利な正規表現のサンプルをいくつか示します。
最初のサンプルは"holtorf"を名前の一部に含んでいるノードをすべて検索します。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="name" regv="holtorf"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
|
node
["name"~"holtorf"]
(50.7,7.1,50.8,7.25);
out body;
|
結果を表示: OpenLayers map, JSON, XML
二つ目のサンプルは、名前の先頭に"Holtorf"を含んでいるノードをすべて検索します。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="name" regv="^Holtorf"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
|
node
["name"~"^Holtorf"]
(50.7,7.1,50.8,7.25);
out body;
|
結果を表示: OpenLayers map, JSON, XML
三つ目のサンプルは、名前の最後に"holtorf"を含んでいるノードをすべて検索します。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="name" regv="Holtorf$"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
|
node
["name"~"holtorf$"]
(50.7,7.1,50.8,7.25);
out body;
|
結果を表示: OpenLayers map, JSON, XML
もちろん "^Holtorf$" で検索することもできますが、値の一致検索と同じことです。
大文字小文字の違いを無視するために、両方をかぎかっこで囲んだ正規表現で検索することができます。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="name" regv="[hH]oltorf"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
|
node
["name"~"[hH]oltorf"]
(50.7,7.1,50.8,7.25);
out body;
|
結果を表示: OpenLayers map, JSON, XML
アクセント記号と装飾文字
多くのヨーロッパ言語では、よく知られたラテン文字を装飾した異文字を持っています。"e" だけでなく、"é" や "ê" のように。これらも正規表現で扱えます。
候補を並べたリストによって
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="name" regv="H[oôóòö]ltorf" />
<bbox-query s="50.7" w="7.1" n="50.8" e="7.25" />
</query>
<print />
</osm-script>
|
node
["name"~"H[oôóòö]ltorf"]
(50.7,7.1,50.8,7.25);
out body;
|
または、ドットのワイルドカードによって
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="name" regv="H.ltorf" />
<bbox-query s="50.7" w="7.1" n="50.8" e="7.25" />
</query>
<print />
</osm-script>
|
node
["name"~"H.ltorf"]
(50.7,7.1,50.8,7.25);
out body;
|
注意: Please note:
- 一つのワイルドカードのドットは、UTF-8でエンコードされた一つのコードポイントを置き換えられ、1バイトとは限りません。(UTF-8内で1バイトでエンコードされるのは7ビットのUS-ASCIIサブセット内の文字だけです) したがって一つのドットは "e" にも "é" にも "ê" にも(それだけでなくラテン以外の文字や、"-" や空白にも)一致しますが、単一のコードポイントでエンコードされない "ø̄" とは一致しません。but as the precombined letter barred o followed by the combining macron, or as the precombined letter o with macron followed by the combiningbar overlay, or as the base letter o followed in any order by the combining macron and the combinining bar overlay).
- Letters with combining diacritics should be stored in the database in Unicode “Normalized Form Composed”, or NFC. Most letters with diacritics used in modern European languages are composable in NFC, but not every pair consisting in a base letter with by a single combining diacritic are composable into a single code point, and some letters with two combiing diacritics are still encodable in NFC with a single codepoint, such as "ḗ" used in Vietnam and will be matched by a single wildcard dot), instead of the canonically equivalent enconding as the base letter "e" followed by the two distinct combining diacritics in either order (one of this order is the “Normalized Form Decomposed” (NFD) used by some OSes like MacOS (which prefers storing filenames encoded as NFD in its filesystem), or by some keyboard drivers or text editors.
- For this reason it is not easy to match all possible encoding forms of the same base letter e (including lettercase variants) with or without one or more combining diacritics: the Overpass API still does not support matching regular expressions based on collation (whose rules depend on the language and script used, and on the collator used for that language and script, and on the collation strength parameters (such as letter case sensitivity). Instead you can enumerate expected the letter variants in [square] brackets, or use unions of queries for each orthography or encoding of the letter you're looking for.
一つまたはそれ以外の名前
二つの値のどちらも許したい場合、パイプを使うことができます。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="name" regv="holtorf|Gielgen"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
|
node
["name"~"holtorf|Gielgen"]
(50.7,7.1,50.8,7.25);
out body;
|
結果を表示: OpenLayers map, JSON, XML
正規表現(POSIX拡張)のより詳しい情報は、コンソール画面か好きな検索エンジンで "man 7 regex" で見つかります。
否定
正規表現そのものでは否定を扱えません。そのためOverpass QLには明示的な否定オペレータがあります。
例えば、以下のクエリはhighwayキーの値を持たないすべてのウェイを返します。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="way">
<has-kv k="highway" modv="not" regv="."/>
<bbox-query e="7.18" n="50.75" s="50.74" w="7.17"/>
</query>
<print limit="" mode="body" order="id"/>
</osm-script>
|
way
["highway"!~"."]
(50.74,7.17,50.75,7.18);
out body;
|
結果を表示: OpenLayers map, JSON, XML
二つ目の例として、待合所のあるバス停にクエリを限定できます。技術的には、"highway"="bus_stop" を持ち、"shelter" タグは存在するが "no" にはセットされていないノードを検索します。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="highway" v="bus_stop"/>
<has-kv k="shelter"/>
<has-kv k="shelter" modv="not" v="no"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
|
node
["highway"="bus_stop"]
["shelter"]
["shelter"!="no"]
(50.7,7.1,50.8,7.25);
out body;
|
結果を表示: OpenLayers map, JSON, XML
同じことを正規表現で。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="highway" v="bus_stop"/>
<has-kv k="shelter"/>
<has-kv k="shelter" modv="not" regv="no"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
|
node
["highway"="bus_stop"]
["shelter"]
["shelter"!~"no"]
(50.7,7.1,50.8,7.25);
out body;
|
結果を表示: OpenLayers map, JSON, XML
複数のタグ
もちろん、"highway" タグに値 "bus_stop" を、"shelter" タグに値 "yes" を持つノードを検索することもできます。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="highway" v="bus_stop"/>
<has-kv k="shelter" v="yes"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
|
node
["highway"="bus_stop"]
["shelter"="yes"]
(50.7,7.1,50.8,7.25);
out body;
|
結果を表示: OpenLayers map, JSON, XML
通りなどのウェイ
前述のクエリはすべて、ウェイやリレーションにも使えます。おなじみの矩形範囲の中にある "Gielgenstraße" 通りを検索します。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="way">
<has-kv k="name" v="Gielgenstraße"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<print/>
</osm-script>
|
way
["name"="Gielgenstraße"]
(50.7,7.1,50.8,7.25);
out;
|
結果を表示: OpenLayers map, JSON, XML
地図上にウェイを表示したい場合(または他の理由で座標が必要な場合)、ウェイの各ノードをリクエストする必要があることに注意してください。これはrecurseステートメントの追加でできます。ウェイ自身も取得するには両方をunionステートメントに入れます。これらのステートメントは後で説明されます。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="way">
<has-kv k="name" v="Gielgenstraße"/>
<bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
</query>
<union>
<item />
<recurse type="way-node"/>
</union>
<print/>
</osm-script>
|
(
way
["name"="Gielgenstraße"]
(50.7,7.1,50.8,7.25);
>;
);
out;
|
リレーション
今度は "network"="VRS" かつ "ref"="636" のリレーションを検索します。これはローカルなバス路線です。ネットワークの略称は独特なものなので、矩形範囲やその類の助けは要りません。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="relation">
<has-kv k="network" v="VRS"/>
<has-kv k="ref" v="636"/>
</query>
<print/>
</osm-script>
|
relation
["network"="VRS"]
["ref"="636"];
out body;
|
結果を表示: OpenLayers map, JSON, XML
すべての種類のオブジェクト
最後に、矩形範囲内で特定のタグを持つすべての種類のオブジェクトを検索します。すべてのタイプごとにタグを繰り返してunionオペレータを使う必要があります。地図上にすべてを表示するため、結果の中のリレーションとウェイに参照されるノードとウェイも要求します。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<union>
<query type="node">
<has-kv k="amenity" v="fire_station"/>
<bbox-query e="7.3" n="50.8" s="50.6" w="7.0"/>
</query>
<query type="way">
<has-kv k="amenity" modv="" v="fire_station"/>
<bbox-query e="7.3" n="50.8" s="50.6" w="7.0"/>
</query>
<query type="relation">
<has-kv k="amenity" modv="" v="fire_station"/>
<bbox-query e="7.3" n="50.8" s="50.6" w="7.0"/>
</query>
</union>
<union>
<item/>
<recurse type="down"/>
</union>
<print/>
</osm-script>
|
(
node
["amenity"="fire_station"]
(50.6,7.0,50.8,7.3);
way
["amenity"="fire_station"]
(50.6,7.0,50.8,7.3);
rel
["amenity"="fire_station"]
(50.6,7.0,50.8,7.3);
);
(._;>;);
out;
|
結果を表示: OpenLayers map JSON, XML.
矩形範囲内のすべてのデータ
bbox-queryは、指定された矩形範囲からすべてのノード、ウェイ、リレーションをダウンロードします。以下のように指定します。
- s 10進数の度で示された最南端 (もっとも低い緯度。赤道から経線に沿ってもっとも近い点を測る。南半球ではマイナス)
- w10進数の度で示された最西端 (もっとも低い経度。グリニッジ経線から緯線に沿ってもっとも近い点を測る。西半球ではマイナス)
- n 10進数の度で示された最北端 (もっとも高い緯度。赤道から経線に沿ってもっとも近い点を測る。北半球ではプラス)
- e 10進数の度で示された最東端 (もっとも高い経度。グリニッジ経線から緯線に沿ってもっとも近い点を測る。東半球ではプラス)
この座標は、OSMデータベースとOverPass APIにおいて、実際の地点をWGS84楕円体上へのノードへ直立投影することによって記述されます。
Overpass QL形式は暗黙的な順序 (s, w, n, e) を持っていることにも注意してください。XML文法より簡潔になりますが、正しい順序になるように注意が必要です。矩形範囲が180度経線を通り過ぎてクエリの経度が±180.0度を超える場合、そしてそのような場合のみ、最西端が最東端より大きくなります。(この場合、クエリは180度経線の両側の二つの矩形範囲のunionと等価です。)
ノード
小さなサンプル矩形範囲の中のノードすべて。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
<print/>
</osm-script>
|
node(50.746,7.154,50.748,7.157);
out body;
|
結果を表示: OpenLayers map, JSON, XML
ウェイ
同じように、矩形範囲の中のすべてのウェイを取れます。矩形範囲の中にあるノードを持つウェイだけでなく、矩形範囲のどこかと交わるだけのウェイも見つかります。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="way">
<bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
</query>
<print/>
</osm-script>
|
way(50.746,7.154,50.748,7.157);
out body;
|
結果を表示: OpenLayers map, JSON, XML
リレーション
矩形範囲の中のノードまたはウェイをメンバーとして持てば、リレーションは矩形範囲の中の中で見つかります。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="relation">
<bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
</query>
<print/>
</osm-script>
|
relation(50.746,7.154,50.748,7.157);
out body;
|
結果を表示: OpenLayers map, JSON, XML
地図呼び出しの例
たいていの場合、完全なデータよりも一つのタイプの要素に対して興味があるでしょう。まず、「完全な地図データ」の意味の定義として、いくつか有効なものがあります。最初のあいまいなトピックとして、矩形範囲に一部だけ含まれるウェイのメンバーで矩形範囲の外側にあるものをどう扱うか、ということがあります。
同じ疑問はリレーションに対しても可能です。右左折制限がほしい場合は、リレーションに含まれているすべての要素を取りたいでしょう。例えば矩形範囲がロシア国境にかかっているとき、世界の半分にまたがる何万キロの境界をダウンロードしたくはないでしょう。
リレーションに関する二つ目の疑問は、リレーションのリレーションが含まれるべきかどうかです。
そのような理由で、これ以降のサンプルでは地図呼び出しのいくつかの変形を示します。自分好みの風味のクエリを構築できることは、クエリのパラダイムがその強みを証明する試練です。必要に応じて以下のサンプルの中から選択したり修正したりしてください。
呼び出しに含まれるステートメントの一部は、さらに後ろの上級のセクションで説明されることがあります。
あり得そうなもっともシンプルな地図呼び出し
次の呼び出しは矩形範囲の中のすべてのノード、そのようなノードをメンバーとして持つすべてのウェイ、そのようなノードやウェイをメンバーに持つすべてのリレーションを含みます。返されたウェイやリレーションがすべてOpen Layersで表示されないことに注目してください。Open Layersではウェイに属するノードや、リレーションのメンバーがすべて得られている必要があるからです。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<union into="_">
<bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
<recurse type="up"/>
</union>
<print mode="meta"/>
</osm-script>
|
(
node(50.746,7.154,50.748,7.157);
<;
);
out meta;
|
結果を表示: (Open Layersでは見えません) JSON, XML
この例では "<" オペレータは、必要となるウェイとリレーションのメンバーのリンクの逆方向の解決をすべて実行します。この動作をステップごとの逆方向の再帰に分解することもできます。
- まず、見つかったノードにリンクしているリレーションをすべて取得: rel(bn);
- 次に、見つかったノードにリンクしているウェイをすべて取得: way(bn);
- 最後に、見つかったウェイにリンクしているリレーションをすべて取得: rel(bw);
逆方向のメンバー解決をすべて行うために、rel(br);は見つかったリレーションをメンバーとして持つリレーションを探します。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<union into="_">
<bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
<recurse into="x" type="node-relation"/>
<recurse type="node-way"/>
<recurse type="way-relation"/>
</union>
<print mode="meta"/>
</osm-script>
|
(
node(50.746,7.154,50.748,7.157);
rel(bn)->.x;
way(bn);
rel(bw);
);
out meta;
|
結果を表示: (Open Layersでは見えません) JSON, XML
リレーション以外の完全なウェイ
次の呼び出しは、矩形範囲の中のすべてのノード、矩形範囲の中のすべてのウェイ、それらのウェイのメンバーのノードすべて(矩形範囲の内か外かに関わらず)、それらのノードかウェイをメンバーとして持つすべてのリレーション、を含みます。今のところ、矩形範囲付きのwayの呼び出しでクエリが遅くなることがあります。対策する予定ですが、辛抱強くお待ちください。返されたウェイやリレーションがすべてOpen Layersで表示されないことに注目してください。Open Layersではウェイに属するノードや、リレーションのメンバーがすべて得られている必要があるからです。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<union into="_">
<bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
<recurse into="x" type="node-relation"/>
<query type="way">
<bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
</query>
<recurse into="x" type="way-node"/>
<recurse type="way-relation"/>
</union>
<print mode="meta"/>
</osm-script>
|
(
node(50.746,7.154,50.748,7.157);
rel(bn)->.x;
way(50.746,7.154,50.748,7.157);
node(w)->.x;
rel(bw);
);
out meta;
|
結果を表示: OpenLayers map, JSON, XML
完全なウェイとリレーション
次の呼び出しは、矩形範囲内のすべてのノード、それらのノードを参照しているすべてのウェイ、それらのウェイのメンバーのノードすべて(矩形範囲の内か外かに関わらず)、それらのノードかウェイをメンバーとして持つすべてのリレーション、そのリレーションのメンバーであるノードとウェイ、そのウェイのノード、を含みます。リレーションを巻き込むため矩形範囲から遠く離れたオブジェクトも含まれることに注意してください。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<union into="_">
<bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
<recurse type="up"/>
<recurse type="down"/>
</union>
<print limit="" mode="meta" order="id"/>
</osm-script>
|
(
node(50.746,7.154,50.748,7.157);
<;
>;
);
out meta;
|
結果を表示: OpenLayers map, JSON, XML
この例では、"<" が逆方向のメンバー解決、">" が順方向のメンバー解決を行います。特に ">" は、見つかったすべてのリレーションについてメンバーのノード、メンバーのウェイ、それらのウェイのメンバーのノードをかき集めます。この例もまた、構成要素のブロックに分解できます。
- node(w) は、見つかったウェイのメンバーであるノードをかき集めます。
- node(r) は、見つかったリレーションについて同じことをします。
- way(r) は、見つかったリレーションのメンバーであるウェイをかき集めます。
rel(r)ステートメントは、見つかったリレーションのメンバーであるリレーションをかき集めますが、ここには含まれていません。もっと段階的な同様のクエリは、このようになります。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<union into="_">
<bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
<recurse into="x" type="node-relation"/>
<recurse type="node-way"/>
<recurse type="way-relation"/>
</union>
<union into="_">
<item set="_"/>
<recurse type="relation-way"/>
</union>
<union into="_">
<item set="_"/>
<recurse into="x" type="relation-node"/>
<recurse type="way-node"/>
</union>
<print mode="meta"/>
</osm-script>
|
(
node(50.746,7.154,50.748,7.157);
rel(bn)->.x;
way(bn);
rel(bw);
);
(
._;
way(r);
);
(
._;
node(r)->.x;
node(w);
);
out meta;
|
結果を表示: OpenLayers map, JSON, XML
リレーションのリレーションも
次の呼び出しはさらに、矩形範囲の中で5段階の子孫として見つかるリレーションについてのリレーションをすべて含みます。そのリレーションのメンバーはあえて含んでいません。ドイツの地図データの大部分という結果、つまり数100メガバイトのデータになるからです。5段階の子孫はすべての逆方向のリンクを得るにはたいてい十分すぎることに注意してください。もし逆方向のリンクがすべて含まれているのか疑問である場合、もうひとつrel(br);ステートメントを加えて、データがさらに返ってくるか確かめてください。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<union into="_">
<bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
<recurse into="x" type="node-relation"/>
<recurse type="node-way"/>
<recurse type="way-relation"/>
</union>
<union into="_">
<item set="_"/>
<recurse type="relation-way"/>
</union>
<union into="_">
<item set="_"/>
<recurse into="x" type="relation-node"/>
<recurse type="way-node"/>
</union>
<union into="_">
<item set="_"/>
<recurse type="relation-backwards"/>
<recurse type="relation-backwards"/>
<recurse type="relation-backwards"/>
<recurse type="relation-backwards"/>
</union>
<print mode="meta"/>
</osm-script>
|
(
node(50.746,7.154,50.748,7.157);
rel(bn)->.x;
way(bn);
rel(bw);
);
(
._;
way(r);
);
(
._;
node(r)->.x;
node(w);
);
(
._;
rel(br);
rel(br);
rel(br);
rel(br);
);
out meta;
|
結果を表示: OpenLayers map, JSON, XML
多角形による領域選択
矩形範囲に加えて、多角形もダウンロードの領域を切り抜くのに使えるようになりました。シンプルな例は、ドイツにある筆者の住む町の部分です。
(
node(poly:"50.7 7.1 50.7 7.12 50.71 7.11");
<;
);
out meta;
より一般的に、前述のサンプルは多角形のバリエーションとして応用できます。bbox 条件を polygon 条件に置き換えるだけです。唯一の制限は、多角形はノードの境界としてのみ使えるという点です。ウェイとリレーションを得るには様々な再帰ステートメントのどれかを使ってください。
rel2poly.plから出てくるような多角形を境界として使いたい場合、以下のbashスクリプトpoly2request.shで変換することができます。
#!/usr/bin/env bash
echo -n '(node(poly:"'
awk '{ if ($1 != "1" && $1 != "polygon" && $1 != "END") printf $2" "$1" "; }'
echo '");<;);out;'
そして以下のようにダウンロードできます。
./poly2request.sh <polygon.txt >request.txt
wget --post-file=request.txt http://overpass-api.de/api/interpreter
出力形式の制御
Print は名前の通りのことをします。それまでのクエリの返り値である内容を出力します。したがってほぼすべてのクエリはprintステートメントで終わるでしょう。簡潔さのためOverpass QLでは、printはout;に改名されました。
詳細さの程度
Printには4段階の詳細さがあり、mode属性で指定します。body (デフォルト)、skeleton、ids_only、metaです。これらは以下のサンプルで、クエリと結果の一部を示しながら説明します。出力が簡潔なほどクエリの実行も速くなります。そのため、このガイドではOpenLayersレイヤー向けにskeletonを使います。データを編集したい場合は、metaが最適な選択になりそうです。何が欲しいか不明確な場合は、まずbodyを試してみてください。
標準 (body)
bodyはデフォルトのモードです。ID、子要素、タグが出力されます。bodyモードにしたいときは、mode属性を省略できます。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="name" v="Gielgen"/>
<has-kv k="place" v="suburb"/>
</query>
<print/>
</osm-script>
|
node
["name"="Gielgen"]
["place"="suburb"];
out;
|
結果を表示: OpenLayers map, JSON, XML
簡潔 (skeleton)
skeleton出力モードはいくぶん短くなります。タグは出力されず、IDと子要素、ノードの座標のみになります。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="name" v="Gielgen"/>
<has-kv k="place" v="suburb"/>
</query>
<print mode="skeleton"/>
</osm-script>
|
node
["name"="Gielgen"]
["place"="suburb"];
out skel;
|
結果を表示: OpenLayers map, JSON, XML
概要 (ids_only)
ids_onlyはもっとも短い出力モードです。Overpass QLではids_onlyはidsに短縮されました。座標が無いのでOpen Layersには使えないことに注意してください。 ids_only is the shortest print mode; only ids are printed. ids_only is shortened to ids in Overpass QL. Note that this doesn't work with Open Layers because no coordinates are returned.
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="name" v="Gielgen"/>
<has-kv k="place" v="suburb"/>
</query>
<print mode="ids_only"/>
</osm-script>
|
node
["name"="Gielgen"]
["place"="suburb"];
out ids;
|
結果を表示: OpenLayers map, JSON, XML
詳細 (meta)
meta はもっとも完璧なモードです。子要素とタグの他、メタデータ(タイムスタンプ、バージョン、変更セット、ユーザー名とID)も出力されます。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="name" v="Gielgen"/>
<has-kv k="place" v="suburb"/>
</query>
<print mode="meta"/>
</osm-script>
|
node
["name"="Gielgen"]
["place"="suburb"];
out meta;
|
結果を表示: OpenLayers map, JSON, XML
特に、JOSMの中で結果を扱うにはこのようなメタデータが必要になります。
順序属性
要素の順序を変えることもできます。デフォルトでは要素はそのIDで並べられます(order="id")。要素がその位置で並んでいても良ければ、より速く結果を得られます(order="quadtile"、Overpass QLではqt)。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="name" v="Gielgen"/>
<has-kv k="place" v="suburb"/>
</query>
<print order="quadtile"/>
</osm-script>
|
node
["name"="Gielgen"]
["place"="suburb"];
out qt;
|
結果を表示: OpenLayers map, JSON, XML
上限属性
出力される要素の数を制限することもできます。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="node">
<has-kv k="name" v="Gielgen"/>
</query>
<print limit="2"/>
</osm-script>
|
node["name"="Gielgen"];
out 2;
|
結果を表示: OpenLayers map, JSON, XML
この例では出力を最大2個のノードに制限しています。
幾何学的な属性
オブジェクトの外接矩形の中心点を加えます。ただしオブジェクトの領域内であるかは保証されません。
Overpass XML | Overpass QL |
---|---|
<osm-script>
<query type="relation">
<has-kv k="boundary" v="postal_code"/>
<has-kv k="postal_code" v="65343"/>
</query>
<print geometry="center"/>
</osm-script>
|
rel["boundary"="postal_code"][postal_code=65343];
out center;
|
ファイル形式の選択
JSONまたはXMLで結果を取得できます。デフォルトではデータはXMLです。JSONで結果を取得するには、クエリのヘッダ(最初のステートメントの前)にJSONを追加するだけです。
Overpass XML | Overpass QL |
---|---|
<osm-script output="json">
<query type="node">
<has-kv k="name" v="Gielgen"/>
</query>
<print/>
</osm-script>
|
[out:json];
node["name"="Gielgen"];
out body;
|
CSV (Comma Separated Values) 形式: Overpass QL wiki page を参照。
結果を表示: OpenLayers map, JSON, XML
要素IDでのクエリ
データベースの中から特定のIDの要素がほしければ、それを検索できます。
- ノードの例:
Overpass XML | Overpass QL |
---|---|
<osm-script>
<id-query ref="507464799" type="node"/>
<print/>
</osm-script>
|
node(507464799);
out;
|
結果を表示: OpenLayers map, JSON, XML.
- ウェイの例:
Overpass XML | Overpass QL |
---|---|
<osm-script>
<id-query ref="24777894" type="way"/>
<print/>
</osm-script>
|
way(24777894);
out;
|
結果を表示: OpenLayers map, JSON, XML.
- リレーションの例:
Overpass XML | Overpass QL |
---|---|
<osm-script>
<id-query ref="1745069" type="relation"/>
<print/>
</osm-script>
|
relation(1745069);
out;
|
結果を表示: OpenLayers map, JSON, XML.
フィルターされたデータの編集
このセクションは Sparse Editing ページへ移動しました。
言語仕様
この部分は言語仕様に移動しました。
関連項目
- Overpass API
- Overpass QL
- Examples (英語)
- Advanced Examples (英語)
- FAQ
- Sparse Editing
- Overpass API入門 Boris Mericskay筆(フランス語・pdf形式)