Anleitung

Fehler der Overpass API erklärt

Was 400, 429 und 504 bedeuten, warum eine Abfrage mit HTTP 200 scheitern kann und wie Sie jeden Fehler beheben. Mit Code für Wiederholungen in Python und JavaScript.

Sie sehenBedeutungLösung
400 Bad RequestDie Abfrage hat einen Syntaxfehler.Lesen Sie die Fehlerzeile; prüfen Sie Anführungszeichen, Semikolons und Kürzel von Overpass Turbo.
429 Too Many RequestsRate-Limit: zu viele Abfragen gleichzeitig oder hintereinander.Warten, dann mit zunehmenden Pausen wiederholen. Abfragen einzeln senden.
504 Gateway TimeoutDer Server ist zu ausgelastet, um die Abfrage anzunehmen.Später wiederholen; weniger Zeit und Speicher verlangen.
runtime error: Query timed outDie Abfrage lief länger als ihr [timeout:].Die Suche eingrenzen oder den Timeout erhöhen.
runtime error: Query run out of memoryDie Antwort braucht mehr als [maxsize:].Kleineres Gebiet, schlankere Ausgabe, oder maxsize erhöhen.
Leeres ErgebnisNichts hat gepasst.Name des Gebiets, admin_level, Tags und Ausgabe prüfen.

400 Bad Request: Syntaxfehler

Der Server konnte die Abfrage nicht lesen. Die Antwort ist eine HTML-Seite mit Zeilen wie Error: line 2: parse error: ';' expected - ')' found. Die Zeilennummer zeigt auf das Problem.

  • Kürzel von Overpass Turbo. {{bbox}}, {{geocodeArea:Paris}} und {{center}} ersetzt nur Overpass Turbo. In Ihrem eigenen Code ersetzen Sie sie durch Koordinaten oder eine Abfrage mit Gebiet. Das ist die häufigste Ursache.
  • Anführungszeichen. Werte mit Leerzeichen, Doppelpunkten oder Sonderzeichen brauchen gerade doppelte Anführungszeichen: ["addr:street"="Main Street"]. Typografische Anführungszeichen aus einer Textverarbeitung funktionieren nicht.
  • Fehlende Semikolons am Ende einer Anweisung, oder ein fehlendes out;.
  • Koordinaten in der falschen Reihenfolge. Ein Begrenzungsrahmen ist Süd, West, Nord, Ost. Vertauschte Werte sind kein Syntaxfehler, liefern aber nichts.

429 Too Many Requests

Ein Rate-Limit wurde erreicht. Auf dem öffentlichen overpass-api.de heisst das, dass alle Slots Ihrer IP-Adresse belegt sind; wie die Slots funktionieren, steht in «Too Many Requests» auf overpass-api.de.

Auf overpass.ch sagt der JSON-Body, welches Limit Sie erreicht haben (rate_limited, concurrency_limit oder quota_exceeded), und der Header Retry-After, wie viele Sekunden Sie warten müssen. Siehe die Liste der Fehler.

504 Gateway Timeout

Die Meldung «The server is probably too busy to handle your request» heisst, dass die Abfrage gar nicht gestartet wurde. Overpass nimmt Abfragen nach der Laufzeit und dem Speicher an, die sie verlangen ([timeout:] und [maxsize:]). Ist der Server ausgelastet, werden grosse Anfragen zuerst abgewiesen.

  • Verlangen Sie nur, was Sie brauchen: [timeout:25] statt [timeout:900].
  • Wiederholen Sie nach einer Pause, mit zunehmenden Wartezeiten (Code unten).
  • Kommt es zu jeder Tageszeit vor, ist der Server überlastet. Ein Server mit reservierter Kapazität löst das; auf overpass.ch kommen bezahlte Tarife zuerst an die Reihe.

«runtime error: Query timed out»

Achtung: Dieser Fehler kommt mit HTTP 200. Bei JSON-Ausgabe steht die Meldung im Feld remark, und elements kann leer oder unvollständig sein. Prüfen Sie remark in Ihrem Code immer.

{
  "elements": [],
  "remark": "runtime error: Query timed out in \"query\" at line 3 after 26 seconds."
}
  • Setzen Sie den Filter, der am meisten aussortiert, an den Anfang, und grenzen Sie immer nach Gebiet oder Begrenzungsrahmen ein.
  • Vermeiden Sie reguläre Ausdrücke auf Schlüssel über grosse Regionen ([~"."~"."]).
  • Erhöhen Sie den Timeout im Rahmen Ihrer Limits: [timeout:120].
  • Teilen Sie grosse Regionen auf, oder verwenden Sie out count, wenn Sie nur Zahlen brauchen.

«runtime error: Query run out of memory»

Die Antwort bräuchte mehr Speicher als erlaubt (standardmässig 512 MiB). Auch dieser Fehler kommt mit HTTP 200 und einem remark.

  • Verwenden Sie eine schlankere Ausgabe: out center; oder out tags; statt out geom;, und out skel;, wenn Sie keine Tags brauchen.
  • Suchen Sie in einem kleineren Gebiet, oder teilen Sie es auf.
  • Erhöhen Sie das Limit: [maxsize:1073741824] (1 GiB), im Rahmen Ihres Tarifs.

Leere Ergebnisse

  • Falsches Gebiet. area["name"="…"] passt auf den genauen Namen in der Landessprache, und viele Orte haben denselben Namen. Ergänzen Sie das richtige admin_level. Teilen sich mehrere Orte mit diesem Namen die Stufe (elf Orte namens Paris haben Stufe 8), ergänzen Sie auch die Wikidata-ID: ["wikidata"="Q90"]. is_in zeigt die Stufen an einem Punkt. In Lissabon zum Beispiel ist die Gemeinde Stufe 7, nicht 8.
  • Nur Nodes gesucht. Viele Läden und die meisten Parks sind Ways. Verwenden Sie nwr und out center;.
  • Ways ohne Koordinaten. out; liefert bei Ways nur die IDs der Nodes. Verwenden Sie out geom; oder (._;>;); out;.
  • Tags anders geschrieben. Prüfen Sie den Tag im Wiki von OpenStreetMap oder an einem bekannten Beispiel auf der Karte.

Code für Wiederholungen

Wiederholen Sie nur Fehler, die verschwinden können (429, 503, 504), warten Sie jedes Mal länger, und halten Sie sich an Retry-After, wenn der Server ihn sendet. Prüfen Sie remark bei jeder erfolgreichen Antwort.

import time, requests

URL = "https://api.overpass.ch/v1/IHR_API_SCHLÜSSEL/interpreter"

def overpass(query, tries=5):
    wait = 10
    for _ in range(tries):
        r = requests.post(URL, data={"data": query}, timeout=300)
        if r.status_code in (429, 503, 504):
            time.sleep(int(r.headers.get("Retry-After", wait)))
            wait *= 2
            continue
        r.raise_for_status()
        data = r.json()
        if "remark" in data:  # Timeouts und Speicherfehler kommen mit HTTP 200
            raise RuntimeError(data["remark"])
        return data["elements"]
    raise RuntimeError("Overpass ist ausgelastet, Abbruch")

Für den öffentlichen Server ersetzen Sie die URL durch https://overpass-api.de/api/interpreter.

Genug von 429 und 504?

overpass.ch betreibt dieselbe Overpass API mit den Daten der ganzen Welt, minütlichen Aktualisierungen und Limits pro API-Schlüssel. Bezahlte Tarife kommen zuerst an die Reihe.