Pl:Overpass API/Language Guide

From OpenStreetMap Wiki
Jump to navigation Jump to search

Przewodnik użycia Overpass API

Overpass API logo.svg
edit
Overpass API · Odniesienie do języka API · Przewodnik językowy · Terminologia fachowa · Obszary · Przykłady zapytań · Rzadkie edycje · Stałe ID · FAQ · więcej (polski) · Strona internetowa
Status serwerów · Wersje · Rozwój · Projekt techniczny · Instalacja OSM3S servera · Warstwa zgodności XAPI · Render linii transportu publicznego · Aplikacje · Kod źródłowy i problemy
Overpass turbo · Asystant · Skróty Overpass'a turbo · Arkusze stylów MapCSS · Eksport do GeoJSON · więcej (polski) · Rozwój · Kod źródłowy i problemy · Strona internetowa
Overpass Ultra · Overpass Ultra extensions · Arkusze stylów MapLibre ·więcej (polski) · Kod źródłowy i problemy · Strona internetowa

Ten przewodnik pokazuje wiele przykładów dla zapytań z Overpass API. Zapraszamy do dostosowania zapytań do konkretnych potrzeb.

Założenia i koncepcje

Overpass API pozwala zapytać dane OSM według własnych kryteriów. W tym celu posiada specjalnie napisany język zapytań.

Podstawowa semantyka Overpass API jest taka, że przepływy danych OSM (węzły, linie ...) są wytwarzane i modyfikowane przez wyrażenia, które są wykonywane jedno po drugim. Poniższe proste zapytania mogą, na przykład, wygenerować przepływ danych zawierających wszystkie węzły w danym obszarze, a następnie je wydrukować:

node(50.745,7.17,50.75,7.18);out;

Następnie można filtrować dalszy wynikowy przepływ, szukając tylko przystanków autobusowych:

node(50.745,7.17,50.75,7.18)[highway=bus_stop];out;

Albo można też przedłużyć wynik dołączając linie, które odwołują się, wykorzystując wybrane węzły. W tym przypadku, możesz także rozszerzyć wyniki do wszystkich węzłów odwołujących się do tych linii:

node(50.745,7.17,50.75,7.18);way(bn);(._;>;);out;

Te wyrażenia i ich składnia są opisane poniżej bardziej szczegółowo.

Języki programowania

Overpass API oferuje teraz pełną moc wyrażania w pojedynczym żądaniu HTTP GET. W tym celu, nowy język zapytania Overpass QL został wprowadzony równolegle do ustalonego języka znaczników XML. Zawsze można konwertować z jednego do drugiego: Wystarczy wkleić jeden z poniższych przykładów do http://overpass-api.de/convert_form.html.
Możemy tam wybrać rodzaj formatu wyjściowego

  • format XML: postać ta odpowiada poniższej formie XML we wszystkich przykładach.
  • ładny Overpass QL: postać ta odpowiada poniższej formie Overpass QL
  • zwięzły Overpass QL: daje jedną linię HTTP GET żądania dla tego samego wyrażenia.

Aby wykonać zapytanie, używamy zamiast tego http://overpass-api.de/query_form.html.

Tak jak to jest w kilku przykładach składni QL poniżej. Składnia QL jest bardziej zwięzła i jest w pewnym stopniu podobna do grupy języków programowania C. Wyrażenie zawsze kończy się średnikiem ";". Ponadto wyrażenie jest:

  • albo wyrażeniem zapytania. Zaczyna od "node", "way", "rel" or "relation" ("rel" jest tylko skrótem "relation") lub jest jednym ze specjalnych wyrażeń ">", ">>", "<", or "<<".
  • lub wyrażenie wyjściowe. Zaczyna od "out".

Wyrażenie zapytania składa się z typu oraz co najmniej jednego zdania. Istnieją różne rodzaje zdań:

Wszystkie warianty żądań znaczników; np,

  ["key"="value"]
  ["key"]
  ["key"~"value"]
  ["key"!="value"]
  ["key"!~"value"]

lub współrzędne dotyczące wybranego obszaru

  (51.0,7.0,52.0,8.0)

Współrzędne wybranego obszaru zawsze zaczynają się od niższej szerokości geograficznej, następnie dolnej długości, a następnie górnej szerokości i górnej długości geograficznej. Zauważmy, że jest inna od składni XAPI. Składnia XML jest zabezpieczona za pomocą nazwanych parametrów.

Lub rekurencji do przodu lub do tyłu dotyczących linków członkostwa

  (r)
  (w)
  (n)
  (br)
  (bw)
  (bn)
  (>)
  (>>)
  (<)
  (<<)

Lub specjalne zdanie w postaci "(type:value)".

Więcej informacji znajduje się w odpowiednich częściach Przykładów użycia.

Linki do mapy

Większość przykładów jest ilustrowanych pokazując linki do mapy. To rozwiązanie jest nadal bardzo eksperymentalne. Wybrany obszar jest ustawiony na stałe, aby zobaczyć niemieckie miasto Bonn. Kilka zapytań związanych z tym obszarem potrzebuje sporo czasu, może ponad minutę, jeżeli żadna z potrzebnych danych nie jest w pamięci podręcznej serwera. Symbole są brzydkie, ale to może być również zmienione dla warstwy mashup dla użytkowników końcowych. Powinny one być, przede wszystkim, łatwe do znalezienia.

Przykłady użycia

Gdziekolwiek pojawi się ten symbol: overpass turbo icon, można go kliknąć, aby użyć overpass turbo do kontroli zapytania i jego rezultatów.

Wyszukiwanie

Znalezienie czegoś w danych OpenStreetMap zawsze znaczy wyszukiwanie lokalizacji lub wartości niektórych tagów. Można wybrać dowolną wartość dla znacznika w poniższych przykładach. Na początku możemy znaleźć obiekty według ich nazw, więc szukamy pewnych wartości dla klucza "name".

Dokładna nazwa

W pierwszym przykładzie, szukamy węzła według wartości nazwanego tagu:

Overpass XML Overpass QL
try it yourself in overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" v="Gielgen"/>
  </query>
  <print/>
</osm-script>
try it yourself in overpass-turbo
node["name"="Gielgen"];
out body;

Wynik: OpenLayers map, JSON, XML.

Dokładna nazwa i orientacyjna lokalizacja

Jeśli jest to niewystarczająco dokładne, można również zaznaczyć obszar, aby uzyskać wyniki tylko z danego obszaru. Kolejność współrzędnych jest (dolna szer., dolna dł., górna szer., górna dł.). Jeśli nie masz zaznaczonego obszaru, poniższy przykład może lepiej pasować:

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
node
  ["name"="Gielgen"]
  (50.7,7.1,50.8,7.2);
out body;

Wynik: OpenLayers map, JSON, XML.

Obiekt w pobliżu innego obiektu

Sposób mniej techniczny, aby otrzymać jeden z wielu wyników, szukając czegoś, podając pobliską lokalizację. Na przykład, możesz wyszukać lokalizację o nazwie "Gielgen" w promieniu 1000 metrów od miejsca zwanego "Bonn".

(Należy pamiętać, że obliczenia są robione według nie-sferoidalnej wzoru (zobacz więcej tutaj), co może spowodować pewne przybliżenie)

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
node["name"="Bonn"];
node
  (around:1000)
  ["name"="Gielgen"];
out body;

Wynik: OpenLayers map, JSON, XML.

Nazwa orientacyjna

Ale nawet wtedy, gdy nie znamy dokładnej nazwy obiektu, możemy go znaleźć. W tym celu, Overpass API obsługuje ( rozszerzony POSIX) regularne wyrażenia. Damy kilka przykładów przydatnych regularnych wyrażeń.

Pierwszy przykład wyszukuje każdy węzeł, który zawiera element "holtorf" w nazwie:

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
node
  ["name"~"holtorf"]
  (50.7,7.1,50.8,7.25);
out body;

Wynik: OpenLayers map, JSON, XML.

Drugi przykład wyszukuje każdy węzeł, który ma ciąg "Holtorf" jako początek nazwy:

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
node
  ["name"~"^Holtorf"]
  (50.7,7.1,50.8,7.25);
out body;

Wynik: OpenLayers map, JSON, XML.

Trzeci przykład wyszukuje każdy węzeł, który ma ciąg "Holtorf" na końcu nazwy:

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
node
  ["name"~"holtorf$"]
  (50.7,7.1,50.8,7.25);
out body;

Wynik: OpenLayers map, JSON, XML.

Oczywiście można też szukać "^Holtorf$", ale to jest to samo jak zwykłe wyszukiwanie samej wartości.

Można również szukać w zależności od wielkość liter w wyrażeniach regularnych załączając oba warianty w nawiasach:

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
node
  ["name"~"[hH]oltorf"]
  (50.7,7.1,50.8,7.25);
out body;

Wynik: OpenLayers map, JSON, XML.

Znaki diakrytyczne i dekoracyjne

Wiele języków europejskich posiada zmodyfikowane warianty dobrze znanych znaków łacińskich, np, nie tylko "e", ale także "é" , "ę" lub "ê". Można je użyć w wyrażeniu regularnym:

Przez podanie ich według listy:

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
node
  ["name"~"H[oôóòö]ltorf"]
  (50.7,7.1,50.8,7.25);

out body;

Lub poprzez wstawienie kropki "." jako wieloznacznika:

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
node
  ["name"~"H.ltorf"]
  (50.7,7.1,50.8,7.25);

out body;

Proszę zwrócić uwagę:

  • Pojedynczy wieloznacznik w postaci kropki zastępuje pojedynczy punkt kodu systemu kodowania UTF-8, niekoniecznie tylko jeden bajt w tym kodowaniu znaków (tylko znaki w 7-bitowym US-ASCII podzbiorze są kodowane w UTF-8 jako jeden bajt). Tak więc kropka znaczy "e" jak również "é", "ę" lub "ê" (ale także każdą inną literę, w tym nie-łacińskie; "-" lub spację), ale nie "ø̄", który nie jest kodowany jako pojedynczy punkt kodowy, ale jako wstępnie połączone letter barred o a następnie combining macron lub jako wstępnie połączone letter o with macron a następnie combiningbar overlay, lub jako podstawowy letter o a następnie w dowolnej kolejności combining macron i combinining bar overlay).
  • Litery z łączonymi znakami diakrytycznymi powinny być przechowywane w bazie danych w formacie UnicodeNormalized Form Composed”, or NFC. Większość liter ze znakami diakrytycznymi używanymi w nowoczesnych językach europejskich są composable w NFC, ale nie każda para wchodząca w skład litery podstawowej z pojedynczym łącznikem znaku diakrytycznego jest "composable" w jednym punkcie kodu, a niektóre litery z dwóch połączonych znaków diakrytycznych nadal są kodowane w NFC jako pojedynczy punkt kodowy, takie jak "ḗ", używane w Wietnamie zostaną dopasowane do kropki jako wieloznacznika), zamiast kanonicznie równoważnego kodowania jako litery podstawowej "e", a następnie dwóch różnych połączonych znaków diakrytycznych w dowolnej kolejności (jedną z tych kolejność jest “Normalized Form Decomposed” (NFD) używany przez niektóre systemy operacyjne, jak MacOS (który preferuje przechowywanie nazw plików zakodowanych w NFD w systemie plików), lub przez niektóre sterowniki klawiatury i edytory tekstu.
  • W związku z tym, że nie jest łatwo dopasować wszystkie możliwe formy kodowania tej samej podstawowej litery jak "e" (w tym wariant wielkości litery) z lub bez jednego lub więcej łączących znaków diakrytycznych: Overpass API nadal nie obsługuje dopasowania wyrażeń regularnych na podstawie sortowań (których zasady zależą od używanego języka i skryptu, od sortowania stosowanych dla tego języka i skryptu i od ważności parametrów (takich jak sortowanie liter w zależności od ich wielkości). Zamiast tego można podać spodziewane warianty liter w [nawiasach kwadratowych], lub używać związków zapytań dla każdej ortografii lub kodowania litery, której szukasz.

Dwie alternatywne nazwy

Jeśli chcemy wyszukać dwie alternatywne wartości, można użyć do tego znaku"|".

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
node
  ["name"~"holtorf|Gielgen"]
  (50.7,7.1,50.8,7.25);
out body;

Wynik: OpenLayers map, JSON, XML.


Więcej informacji na temat (rozszerzony POSIX) wyrażeń regularnych można znaleźć na konsoli lub za pomocą ulubionej wyszukiwarki wpisując "man 7 regex".

Obiekt nie występujący

Wyrażenia regularne nie zezwalają na negację na własną rękę. Z tego powodu, istnieje jednoznaczyny operator negacji w Overpass QL.

Na przykład, poniższe zapytanie uzyskuje wszystkie możliwe wyniki, które nie mają wartości "highway":

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
way
  ["highway"!~"."]
  (50.74,7.17,50.75,7.18);
out body;

Wynik: OpenLayers map, JSON, XML.

W drugim przykładzie można ograniczyć zapytanie do przystanków autobusowych, które mają schronienie. Technicznie, szukamy węzłów z "highway"="bus_stop" i obecności tagu "shelter", ale nie ustawiamy na "no".

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
node
  ["highway"="bus_stop"]
  ["shelter"]
  ["shelter"!="no"]
  (50.7,7.1,50.8,7.25);
out body;

Wynik: OpenLayers map, JSON, XML.

To samo jako wyrażenie regularne:

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
node
  ["highway"="bus_stop"]
  ["shelter"]
  ["shelter"!~"no"]
  (50.7,7.1,50.8,7.25);
out body;

Wynik: OpenLayers map, JSON, XML.

Obiekt z wieloma tagami

Oczywiście możemy szukać węzły, których tag "highway" ma wartość "bus_stop" i tag "shelter" mający wartość "yes":

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
node
  ["highway"="bus_stop"]
  ["shelter"="yes"]
  (50.7,7.1,50.8,7.25);
out body;

Wynik: OpenLayers map, JSON, XML.

Ulice i inne drogi

Każde z powyższych zapytań odnosi się również do dróg i relacji. Szukamy ulicy "Gielgenstraße" w obecnie znanej powierzchni:

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
way
  ["name"="Gielgenstraße"]
  (50.7,7.1,50.8,7.25);
out;

Wynik: OpenLayers map, JSON, XML.

Należy pamiętać, że trzeba również zapytać o węzły drogi, jeśli chcemy zobaczyć drogę na mapie (lub potrzebujemy współrzędnych z innego powodu. Odbywa się to z "extra-recursive down" wyrażeniem. Aby uzyskać także drogę, podajemy oba zapytania w union wrażeniu. Wszystkie te wyrażenia są wyjaśnione poniżej.

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
(
  way
    ["name"="Gielgenstraße"]
    (50.7,7.1,50.8,7.25);
  >;
);
out;

Relacje

A teraz szukamy relacji "network"="VRS" i "ref"="636". Jest to lokalna linia autobusowa. Jako że skrót sieć jest wyjątkowy, nie potrzebujemy podawać współrzędnych obszaru poszukiwań lub innych podobnych pomocy.


Overpass XML Overpass QL
try it yourself in overpass-turbo
<osm-script>
  <query type="relation">
    <has-kv k="network" v="VRS"/>
    <has-kv k="ref" v="636"/>
  </query>
  <print/>
</osm-script>
try it yourself in overpass-turbo
relation
  ["network"="VRS"]
  ["ref"="636"];
out body;

Wynik: OpenLayers map, JSON, XML.

Obiekty wszelkiego rodzaju

I wreszcie, szukamy wszelkiego rodzaju obiekty z danym tagiem w obrębie obwiedni. Należy powtórzyć tag dla każdego typu elementu i użyć union operatora. Aby umożliwić przestawienie wszystkiego na mapie, możemy również zapytać o węzły i drogi, które są określane przez relacje i drogi w wyniku:

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
(
  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;

Wynik: OpenLayers map JSON, XML.

Wszystkie dane w obrębie ramki

bbox-query pozwala na pobranie wszystkich węzłów, dróg lub relacji w obrębie zaznaczonej ramki. Podajemy z:

  • s limit południowy w stopniach dziesiętnych (najniższa szerokość, mierzona wzdłuż południka od najbliższego punktu na równiku, ujemna na półkuli południowej)
  • w limit zachodni w stopniach dziesiętnych (najniższa długość, mierzona wzdłuż równoleżnika, od najbliższego punktu na południku Greenwich, ujemna na półkuli zachodniej)
  • n limit północny w stopniach dziesiętnych (najwyższa szerokość, mierzona wzdłuż południka od najbliższego punktu na równiku, pozytywna na półkuli północnej)
  • e limit wschodni w stopniach dziesiętnych (najwyższa długość, mierzona wzdłuż równoleżnika, od najbliższego punktu na południku Greenwich, pozytywna w półkuli wschodniej))

Te współrzędne są określone w bazie OSM oraz w OverPass API przez pionowo przedstawione prawdziwe punkty dla węzłów na elipsoidzie WGS84.

Prosimy pamiętać również, że forma Overpass QL ma bezwarunkową kolejność (S, W, N, E). To jest bardziej zwięzłe niż składnia XML, ale oczywiście wymaga pewnych starań, aby uzyskać prawidłową kolejność. Limit zachodni jest wyższy od limitu wschodniego, jeśli i tylko wtedy, gdy zapytanie przewyższa długość geograficzną ± 180,0 stopni z ramką przechodzącą przez anty-południk (w tym przypadku zapytanie jest równoważne do "union" dwóch zaznaczonych pól na każdej stronie anty-południka.)

Węzły

Wszystkie węzły w małej, przykładowej, ramce obwiedni:

Overpass XML Overpass QL
try it yourself in overpass-turbo
<osm-script>
  <bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
  <print/>
</osm-script>
try it yourself in overpass-turbo
node(50.746,7.154,50.748,7.157);
out body;

Wynik: OpenLayers map, JSON, XML.

Linie

W podobny sposób możemy uzyskać wszystkie linie w obrębie zaznaczonej ramki. Linie te są wykryte nie tylko dlatego, że posiadają węzły wewnątrz zaznaczonej ramki, ale także dlatego, że po prostu zostały przecięte przez ramkę.

Overpass XML Overpass QL
try it yourself in overpass-turbo
<osm-script>
  <query type="way">
    <bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
  </query>
  <print/>
</osm-script>
try it yourself in overpass-turbo
way(50.746,7.154,50.748,7.157);
out body;

Wynik: OpenLayers map, JSON, XML.

Relacje

Relacja będzie wykryta w zaznaczonej ramce, jeśli typ członu relacji; węzeł lub linia znajduje się w obrębie ramce.

Overpass XML Overpass QL
try it yourself in overpass-turbo
<osm-script>
  <query type="relation">
    <bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
  </query>
  <print/>
</osm-script>
try it yourself in overpass-turbo
relation(50.746,7.154,50.748,7.157);
out body;

Wynik: OpenLayers map, JSON, XML.

Przykładowa mapa wywołań

Tak w ogóle, raczej będziemy bardziej zainteresowani kompletem danych niż tylko elementami jednego typu. Po pierwsze, istnieje kilka ważnych definicji, co znaczy "kompletne dane mapy". Jednym z niejasnych tematów jest, co zrobić z węzłami poza zaznaczoną ramką, które są częściami linii, która znajduje się częściowo wewnątrz ramki.

To samo pytanie dotyczy relacji. Jeśli czekamy na ograniczenia skrętu, może wolimy otrzymać wszystkie zawarte elementy relacji. Jeśli zaznaczona ramka dotknie na przykład granicę Rosji, prawdopodobnie nie chcemy pobrać dziesięć tysięcy kilometrów granicy wokół połowy świata.

Drugie pytanie brzmi, czy relacje w relacjach powinny być dołączone?

Z tego powodu, podamy przykłady kilku wariantów wywołań mapy. Jest to dyscyplina, gdzie paradygmat zapytań pokazuje swoją siłę: możemy skonstruować zapytanie każdego rodzaju. Wystarczy wybrać jeden z poniższych przykładów lub zmodyfikować je do własnych potrzeb.

Poszczególne wyrażenia wywołań są wyjaśnione w bardziej zaawansowanych sekcjach poniżej.

Możliwie najprostsze wywołanie mapy

Niniejsze wywołanie mapy obejmuje wszystkie węzły w zaznaczonej ramce, wszystkie linie, które mają taki węzeł jako człon linii i wszystkie relacje, które mają taki węzeł lub linię jako człon relacji. Proszę zauważyć, że nie wszystkie linie lub relacje są wyświetlane w Open Layers, ponieważ Open Layers wymagają aby wszystkie węzły linii lub jako człony relacji były obecne.

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
(
  node(50.746,7.154,50.748,7.157);
  <;
);
out meta;

Wynik: (Open Layers doesn't show), JSON, XML.

Operator "<"robi tu wszystkie wymagane do tyłu rozdzielczości linków członkostwa linii i relacji. Możemy również podzielić je na krok-po-kroku do tyłu rekurencje:

  • Po pierwsze, uzyskajmy wszystkie relacje należące do znalezionych węzłów: rel(bn);
  • Następnie, uzyskajmy wszystkie linie należące do znalezionych węzłów tylko: way(bn);
  • Na koniec, uzyskajmy wszystkie relacje należące do znalezionych linii: em>rel(bw);

Aby zakończyć listę wstecznej rozdzielczości linków członkostwa, rel(br);, znajdzie relacje, które znalazły relacje jak członkostwo.

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
(
  node(50.746,7.154,50.748,7.157);
  rel(bn)->.x;
  way(bn);
  rel(bw);
);
out meta;

Wynik: (Open Layers doesn't show), JSON, XML.

Kompletne linie, ale nie relacje

To wywołanie obejmuje wszystkie węzły w zaznaczonej ramce, wszystkie linie w zaznaczonej ramce, wszystkie węzły należące do tych linii, czy są one wewnątrz ramki, czy też nie, oraz wszystkie relacje, które mają takie węzły lub linie będące członami relacji. W tej chwili wywołanie z way z w zaznaczonej ramce sprawia, że zapytanie jest czasami powolne. Będę pracował nad tym, ale proszę o cierpliwość. Proszę zauważyć, że nie wszystkie zwrortne relacje są wyświetlane w Open Layers, dlatego, że Open Layers wymaga aby wszystkie węzły linii były obecne.

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
(
  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;

Wynik: OpenLayers map, JSON, XML.

Kompletne linie i relacje

To wywołanie obejmuje wszystkie węzły w zaznaczonej ramce, wszystkie linie odnoszące się do tych węzłów, wszystkie węzły należące do tych linii, czy są wewnątrz ramki lub nie, wszystkie relacje, które mają takie węzły lub linie należące to tej relacji,oraz jej węzły i linie, a nawet węzły tych linii. Należy pamiętać, że ze względu na zaangażowane relacji, obiekty będące dość daleko poza ramką, mogą są ujęte.

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
(
  node(50.746,7.154,50.748,7.157);
  <;
  >;
);
out meta;

Wynik: OpenLayers map, JSON, XML.

Operator "<" robi tu wszystkie wymagane do tyłu rozdzielczości linków członkostwa linii i relacji, a ">" robi wszystkie wymagane do przodu rozdzielczości linków. W szczególności, ">" zbiera dla wszystkich, znalezionych relacji, należących do nich, linii oraz węzłów należących do tych linii. To znowu może być podzielone na poszczególne bloki:

  • node(w) zbiera węzły, które są członami znalezionych linii
  • node(r) robi to samo ze znalezionymi relacjami
  • way(r) zbiera linie, które należą do znalezionych relacji

Operator rel(r) zbiera relacje, które są członami znalezionych relacji, ale nie są tu wywoływane.
Teraz to samo zapytanie, jak wcześniej,ale w bardziej formie krok-po-kroku:

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
(
  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;

Wynik: OpenLayers map, JSON, XML.

Relacje na relacjach

To wywołanie obejmuje dodatkowo wszystkie relacje na relacjach, że do pięciu poziomów zależnego pochodzenia, przybywają jako człony relacji w zaznaczonej ramce. Ich członkostwo nie jest celowo uwzględnione, ponieważ mogłoby skończyć z wywołaniem znacznej części wszystkich danych mapy Niemiec; czyli kilkaset megabajtów danych. Należy również zauważyć, że pięć poziomów pochodzenia zazwyczaj jest więcej niż wystarczająco, aby otrzymać wszystkie wsteczne. Jeśli masz wątpliwości, czy wszystkie wsteczne, po prostu dodaj kolejne rel(br); wywołanie i zobaczyć, czy więcej danych zostało pokazane.

Overpass XML Overpass QL
try it yourself in overpass-turbo
<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>
try it yourself in overpass-turbo
(
  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;

Wynik: OpenLayers map, JSON, XML.

Region w obrębie wielokąta

Poza wyborem w zakresie zaznaczonej ramki, teraz wielokąty mogą być również stosowane do wycinania regionu do pobrania. Prostym przykładem jest część mojego rodzinnego miasta w Niemczech:

try it yourself in overpass-turbo
(
  node(poly:"50.7 7.1 50.7 7.12 50.71 7.11");
  <;
);
out meta;

Wynik: XML, JSON

Przykłady z powyżej mogą być dostosowane do wariantu wielokąt: Wystarczy wymienić stan "bbox" na stan "polygon". Jedynym ograniczeniem jest to, wielokąty mogą być używane tylko jako granice dla węzłów. Prosimy skorzystać z jednej z różnych powtarzalnych wezwań aby dostać linie i relacje z nich.

Jeśli chcemy użyć wielokąta na wyjściu rel2poly.pl, jako granicę, możemy go prze konwertować z następującą powłoką bash poly2request.sh:

#!/usr/bin/env bash

echo -n '(node(poly:"'
awk '{ if ($1 != "1" && $1 != "polygon" && $1 != "END") printf $2" "$1" "; }'
echo '");<;);out;'

Teraz możemy dostać pobranie z np,

./poly2request.sh <polygon.txt >request.txt
wget --post-file=request.txt http://overpass-api.de/api/interpreter

Kontrola formatu wyjściowego

Print, robi to, co jego nazwa znaczy: drukuje treść zapytania jako dane zwrotne. Tak więc, prawie każde zapytanie kończy się wyrażeniem print. Dla zwięzłości, nazwa print została zmieniona na out; w Overpass QL.

Stopień wielomówności

Print występuje w czterech różnych stopniach oznajmiania, które są określone przez atrybuty trybu mode: body (domyślnie), skeleton, ids_only, i meta.
Są one opisane w następujących przykładach, wraz z odpowiednich części zapytania i wynikiem. Im bardziej wyjście jest zwięzłe, tym szybciej działa zapytanie.
Z tego powodu skeleton jest używany w niniejszym przewodniku dla warstw OpenLayers.
'meta' może być najlepszym wyborem, jeśli chcesz edytować dane. Jeśli nie masz pewności, co potrzebujesz, spróbuj najpierw body.

Normalny (body)

body jest trybem domyślnym: identyfikatory, elementów podrzędne i tagi są drukowane. Jeśli chcemy tryb body, możemy pominąć atrybut mode.

Overpass XML Overpass QL
try it yourself in overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" v="Gielgen"/>
    <has-kv k="place" v="suburb"/>
  </query>
  <print/>
</osm-script>
try it yourself in overpass-turbo
node
  ["name"="Gielgen"]
  ["place"="suburb"];
out;

Wynik: OpenLayers map, JSON, XML.

Zwięzly (skeleton)

Tryb druku skeleton jest nieco krótszy: Tagi nie są drukowane w tym trybie, jedynie identyfikatory, elementów podrzędne i współrzędne węzłów:

Overpass XML Overpass QL
try it yourself in overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" v="Gielgen"/>
    <has-kv k="place" v="suburb"/>
  </query>
  <print mode="skeleton"/>
</osm-script>
try it yourself in overpass-turbo
node
  ["name"="Gielgen"]
  ["place"="suburb"];
out skel;

Wynik: OpenLayers map, JSON, XML.

Krótki (ids_only)

Tryb ids_only jest najkrótszym trybem drukowania; drukowane są tylko identyfikatory. ids_only jest skrócony do ids w Overpass QL. Należy pamiętać, że to nie działa z Open Layers, ponieważ współrzędne nie są oddawane.

Overpass XML Overpass QL
try it yourself in overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" v="Gielgen"/>
    <has-kv k="place" v="suburb"/>
  </query>
  <print mode="ids_only"/>
</osm-script>
try it yourself in overpass-turbo
node
  ["name"="Gielgen"]
  ["place"="suburb"];
out ids;

Wynik: OpenLayers map, JSON, XML.

Rozwlekły (meta)

Tryb meta jest trybem najbardziej kompletnym. Obok elementów podrzędnych i tagów, również metadane (datownik, wersja, changeset, nazwę użytkownika i id) są drukowane:

Overpass XML Overpass QL
try it yourself in overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" v="Gielgen"/>
    <has-kv k="place" v="suburb"/>
  </query>
  <print mode="meta"/>
</osm-script>
try it yourself in overpass-turbo
node
  ["name"="Gielgen"]
  ["place"="suburb"];
out meta;

Wynik: OpenLayers map, JSON, XML.

Metadane są, w szczególności, niezbędne do obsługi wyników w JOSM.

Kolejność atrybutów

Można również zmienić kolejność elementów. Domyślnie elementy są sortowane według ich ID (tj, order="id").
Możemy otrzymać szybsze rezultaty, jeśli elementy będą sortowane według ich lokalizacji (czyli order="quadtile", lub qt w Overpass QL).

Overpass XML Overpass QL
try it yourself in overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" v="Gielgen"/>
    <has-kv k="place" v="suburb"/>
  </query>
  <print order="quadtile"/>
</osm-script>
try it yourself in overpass-turbo
node
  ["name"="Gielgen"]
  ["place"="suburb"];
out qt;

Wynik: OpenLayers map, JSON, XML.

Limitowanie atrybutów

Jest również możliwe ograniczenie ilości drukowanych elementów:

Overpass XML Overpass QL
try it yourself in overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" v="Gielgen"/>
  </query>
  <print limit="2"/>
</osm-script>
try it yourself in overpass-turbo
node["name"="Gielgen"];
out 2;

Display result: OpenLayers map, JSON, XML.

To ogranicza dane wyjściowe co najwyżej do dwóch węzłów.

Wybór formatu pliku

Możemy uzyskać wynik jako JSON lub XML. Domyślnie otrzymujemy wynik jako XML. Aby uzyskać wynik jako JSON, wystarczy dodać wymóg JSON do nagłówka zapytania (przed pierwszym wywołaniem):

Overpass XML Overpass QL
link=http://overpass-turbo.eu/?Q=%3Cosm-script%20output%3D%22json%22%3E%0A%20%20%3Cquery%20type%3D%22node%22%3E%0A%20%20%20%20%3Chas-kv%20k%3D%22name%22%20v%3D%22Gielgen%22%2F%3E%0A%20%20%3C%has-kv k="name" v="Gielgen"/> 2Fquery%3E%0A%20%20%3Cprint%2F%3E%0A%3C%2Fosm-script%3E&C=50.73515;7.20519;14&R
<osm-script output="json">
  <query type="node">
    <has-kv k="name" v="Gielgen"/>
  </query>
  <print/>
</osm-script>
try it yourself in overpass-turbo
[out:json];
node["name"="Gielgen"];
out body;

Wynik: OpenLayers map, JSON, XML.

Zapytanie według identyfikatora elementu

Jeśli chcemy konkretny identyfikator z bazy danych, można zapytać o to.

Przykład dla węzła

Overpass XML Overpass QL
try it yourself in overpass-turbo
<osm-script>
  <id-query ref="507464799" type="node"/>
  <print/>
</osm-script>
try it yourself in overpass-turbo
node(507464799);
out;

Wynik: OpenLayers map, JSON, XML.

Przykład dla linii

Overpass XML Overpass QL
try it yourself in overpass-turbo
<osm-script>
  <id-query ref="24777894" type="way"/>
  <print/>
</osm-script>
try it yourself in overpass-turbo
way(24777894);
out;

Wynik: OpenLayers map, JSON, XML.

Przykład dla relacji

Overpass XML Overpass QL
try it yourself in overpass-turbo
<osm-script>
  <id-query ref="1745069" type="relation"/>
  <print/>
</osm-script>
try it yourself in overpass-turbo
relation(1745069);
out;

Wynik: OpenLayers map, JSON, XML.

Edycja filtrowanych danych

Jeżeli dane OSM są bardzo gęste na pewnym obszarze, wtedy staje się coraz trudniej dokonać edycji. Poprzez połączenie JOSM i Overpass API można to przezwyciężyć: Wtyczka mirrored_download ułatwia pobieranie niezbędnych danych. Pracując w ten sposób zbliżamy się do pojęcia "warstw" w klasycznych systemach GIS.
Uwaga: Edycja w ten sposób wymaga więcej uwagi niż zwykle. Proszę przeczytać poniżej.

Jako przykład, chcemy sprawdzić, które sklepy w Bonn mają już tag "wheelmap" i dodamy go jeśli dotyczy.

W tym celu instalujemy w JOSM wtyczkę "mirrored_download" i jako tapetę, standardową czarno-białą mapę OSM. Następnie pobieramy przefiltrowane dane.

Środki ostrożności

Edytowanie w ten sposób wymaga więcej staranności niż zwykle: Zmiana geometrii może spowodować bałagan z niewidocznymi obiektami. Ponadto, węzły mogą należeć do nie-do-pobrania linii i w ten sposób edycja może wpłynąć na nieznane linie. Ten problem pojawia się tylko przy brzegach zaznoczonej ramki w JOSM.
Z tych powodów: Proszę nie usuwać węzłów ani nie przemieszczać ich. Zmiana tagów lub podział i łączenie linii jest natomiast bezpieczne, a to obejmuje kilka ciekawych scenariuszy edycji.

Instalowanie wtyczki "mirrored_download"

Musimy to zrobić i kolejne kroki tylko raz, ponieważ JOSM przechowuje lokalnie ustawienia i wtyczki.

  • Wybierz "Edycja > Ustawienia ...".
  • Wybierz "Konfiguracja dostępnych wtyczek" w panelu po lewej stronie (Ikona przedstawiająca wtyczkę).
  • Wybierz "Pobierz listę"
  • Wpisz "mirr" w polu Szukaj i zaznacz "mirrored_download".
  • "OK". "Uruchom ponownie" i poczekaj na restart.

Instalowanie warstwy tła edycji

  • Wybierz "Edycja > Ustawienia ...".
  • Wybierz "TMS/WMS", dolna pozycja w panelu po lewej stronie.
  • Wybierz z "Wpisy dostępne domyślnie" opcje "OpenStreetMap (Mapnik Black & White)"
  • Kliknij przycisk "Aktywuj", a następnie "OK".

Wybierz następnie z "Podkłady mapy > OpenStreetMap (Mapnik Black & White)". Widać mapę jasno szarą. Prawdziwa mapa ukaże się po wybraliśmy obwiedni w następnym etapie. Można zignorować ostrzeżenie o błędzie niedopasowania, ponieważ mapa bazowa OSM jest projektowo w podobny sposób wyrównana jak dane z których są pobrane.

Pobieranie danych

Wybierz "Plik> Pobierz z Overpass API".

Zaznacz odpowiednie pole na "Slippy Map". Można pomniejszyć/powiększyć za pomocą kółka myszy. Można przesuwać, trzymając prawy przycisk myszy i przeciągając. Możesz wybrać obwiednie poprzez przeciągnięcie z wciśniętym lewym klawiszem myszy.

Wklej następujące zapytanie do "Overpass query". Używamy tutaj:

( node[shop];
  way[shop];>;
  rel[shop];>;);
(._;rel(bn););
(._;rel(bw););
(._;rel(br););
out meta;

Składnia jest wyjaśniona w następnej sekcji poniżej. Obwiednia zostanie ustawiona automatycznie przez JOSM. Istotne jest to, że możemy pobrać tutaj także relacje i odniesienia do pobranych obiektów takich, którymi JOSM może się zająć, kiedy edytujemy.

Kliknij "Pobierz" i czekaj, aż zakończy się pobieranie. Podczas testów może to trwać 5 do 15 sekund.

Josm shops in Krakow.PNG

Prosimy pamiętać o ostrożności, lub użyć jej jako elastycznego read-only odczytu obiektach OSM w wybranej kategorii.

Więcej przydatnych zapytań

Cała sieć ulic:

( way[highway];>;);
(._;rel(bn););
(._;rel(bw););
(._;rel(br););
out meta;

Wszystkie dane dotyczące transportu publicznego:

( way[highway];>;
  way[railway];>;
  node[public_transport];
  node[highway=bus_stop];);
(._;rel(bn););
(._;rel(bw););
(._;rel(br););
out meta;

FAQ

Zobacz pl:Overpass API/FAQ#Language