Overpass API Abfrage CSV error

Hey,
ich nutze die Overpass API in meinem Python Scripts mit overpy. Meine Abfrage soll mir alle Straßennamen in einer Stadt geben. Wenn ich den Befehl auf der API Webseite direkt eingebe funktioniert er. Probiere ich das in Python bekomme ich aber folgende Exception:
overpy.exception.OverpassUnknownContentType: Unknown content type: text/csv

Das hier ist die Abfrage:
[out:csv(highway,name)];
area
[name=“Berlin”];
way(area)[highway][name];
out;

Und das hier das Python Script:
result = api.query(“”"
[out:csv(highway,name)];
area
[name=“Berlin”];
way(area)[highway][name];
out;
“”")

Ich gehe davon aus, dass der Fehler an der Anfrage des csv Formats liegt. Ich kenne mich aber zu wenig mit der Overpass API aus, um zu wissen wie ich den Code ändern muss.

Vielen Dank im voraus!

Hallo und willkommen im Forum!

Ich kenne mich zwar mit overpy nicht aus, aber ich könnte mir vorstellen, dass dir hier eher geholfen werden kann, wenn du deine bisherige Overpass-Abfrage mal mit uns teilst. :wink:

Mir scheint, dass overpy CSV als Format gar nicht unterstützt.

Hier wird nur JSON und XML aufgeführt.

Auch der Sourcecode kennt nur JSON und XML und bringt bei allen anderen Formaten die von dir genannte Exception:

content_type = f.getheader("Content-Type")

if content_type == "application/json":
    return self.parse_json(response)

if content_type == "application/osm3s+xml":
    return self.parse_xml(response)
    
current_exception = exception.OverpassUnknownContentType(content_type)
if not do_retry:
    raise current_exception
retry_exceptions.append(current_exception)
continue

Du müsstest also stattdessen z.B. folgende JSON-Abfrage verwenden und daraus dann mit Hilfe deines Python-Scripts die benötigten Daten rausfiltern:

[out:json];
area[name="Berlin"];
way(area)[highway][name];
out;
1 Like

Verstehe. Bin gerade dabei. Aber das sollte das Problem beheben. Danke!

Eine Frage habe ich noch. Wie kann ich das noch auf Berlin in Deutschland gebrenzen. Den gerade bekomme ich auch Straßen in New Jersey im Viertel Berlin…

Probier es mal so:

[out:json];
{{geocodeArea:"Berlin, Deutschland"}}->.searchArea;
way["highway"]["name"](area.searchArea);
out;

Geht das auch ohne zwei geschweifte Klammern, denn die werden bei Python nicht zugelassen?

Du kannst es auch so machen:

[out:json];
area["ISO3166-2"="DE-BE"];
way(area)[highway][name];
out;

Das nutzt den ISO3166-2-Code der Relation “Berlin” (“DE-BE”) um eindeutig das richtige Berlin auszuwählen.

Oder du nutzt stattdessen direkt die OSM-ID der Relation “Berlin” (62422):

[out:json];
rel(62422);
map_to_area;
way(area)[highway][name];
out;
1 Like