[diff:…] vergleicht die Antwort einer Abfrage an zwei Daten. compare(delta:id()) entfernt die Elemente, die in beiden Antworten vorkommen; übrig bleiben die Restaurants, die hinzukamen oder wegfielen.
Diese Abfrage vergleicht die Restaurants im Niederdorf, der Altstadt von Zürich östlich der Limmat, am 1. Januar 2023 und am 1. Januar 2025.
Die Abfrage
[out:xml][timeout:60][diff:"2023-01-01T00:00:00Z","2025-01-01T00:00:00Z"]; nw(47.369,8.541,47.376,8.547)(if:t["amenity"]=="restaurant"); compare(delta:id()); out meta center;
Ausführen
Live-Ergebnis von overpass.ch, bis zu 12 Stunden zwischengespeichert. Kartendaten © OpenStreetMap-Mitwirkende (ODbL).
So funktioniert es
[diff:"2023-01-01T00:00:00Z","2025-01-01T00:00:00Z"]führt die Abfrage an beiden Daten aus. Diffs brauchen[out:xml].(if:t["amenity"]=="restaurant")wählt die Restaurants. In Abfragen auf alte Daten ist das schneller als ein Tag-Filter in eckigen Klammern.compare(delta:id())behält die Elemente, derenid()sich zwischen den beiden Daten unterscheidet. Eine ID ändert sich nie; übrig bleibt also, was nur in einer der beiden Antworten steht.<action type="create">ist ein Restaurant, das hinzukam.<action type="delete">ist eines, das wegfiel, mit seiner Version vom ersten Datum.- Weggefallen heisst nicht immer geschlossen. Von den zehn hier wurden fünf gelöscht, zwei sind als stillgelegt markiert, und drei wurden zu einer Bar, einem Fast-Food-Lokal und einem Punkt ohne Tags.
Varianten
- Auch hinzugekommen heisst nicht immer eröffnet: Ein Restaurant kann jahrelang bestanden haben, bevor es jemand erfasst hat.
[adiff:…]ergänzt die neue Version jedes weggefallenen Elements, so sehen Sie, was daraus wurde: siehe Änderungen in einem Gebiet.- Läden statt Restaurants:
(if:t["shop"]!=""). - Eine ganze Stadt:
area["name"="Zürich"]["admin_level"="8"]->.a;undnw(area.a). Fünf Jahre Restaurants in Zürich dauerten etwa 15 Sekunden.
Aus Ihrem Code ausführen
curl https://api.overpass.ch/v1/IHR_API_SCHLÜSSEL/interpreter \
--data-urlencode 'data@query.overpassql'
import requests
query = open("query.overpassql").read()
r = requests.post("https://api.overpass.ch/v1/IHR_API_SCHLÜSSEL/interpreter",
data={"data": query}, timeout=120)
r.raise_for_status()
print(r.text)
const res = await fetch("https://api.overpass.ch/v1/IHR_API_SCHLÜSSEL/interpreter", {
method: "POST",
body: new URLSearchParams({ data: query }),
});
if (!res.ok) throw new Error(await res.text());
console.log(await res.text());
Speichern Sie die Abfrage als query.overpassql. Sie funktioniert genauso in Overpass Turbo, QGIS und JOSM.