Abfrage von Straßen innerhalb einer PLZ und das nur für Deutschland?

Hallo ihr,

wie grenze ich mit einer Abfrage das Land und die PLZ ein, wird das stabil funktionieren, oder sollte das Land besser anders eingegrenzt werden?

=> Ich möchte jeweils alle Straßen, die innerhalb einer deutschen PLZ vorkommen können, anzeigen.

[out:csv(name;false)];
area[postal_code="XXXXX"]->.a;
(
  area.a -> .b;
  area.b["ISO3166-1"="DE"];
);
way(area.b)[highway][name];
out;

=> Die Abfrage führt IMO im Test im Overpass Turbo zu einem plausiblem Ergebnis, so dass z. B. auch bei vierstelligen PLZs wie “04209” Leipzig oder “01157” Dresden nicht französische, tschechische, etc. Straßen geliefert werden.

==> Allerdings kommen Straßen im Ergebnis mehrfach vor, könnte das auch irgendwie eindeutig abgefragt werden (in SQL wäre das DISTINCT oder GROUP BY)?

Viele Grüße,
Christoph

PS: Das ist eine Fortführung dieses alten Threads: PLZ als Geodaten und Verwendung der Straßen in Adressverwaltungen?

Schau bitte einmal hier; leider liefert meine Umsetzung

// [out:csv(name;false)];  // ALT-Version
[out:csv(::id, "name",::count; false; ",")];
area[postal_code="XXXXX"]->.a;
(
  area.a -> .b;
  area.b["ISO3166-1"="DE"];
);
way(area.b)[highway][name];
out;

immer noch Dubletten, vielleicht findet jemand den Fehler …

Sind es echte Dubletten, d.h. die gleiche Straße - oder sind es einfach nur die real existierenden mehrfachen Straßennamen in einem PLZ-Gebiet? Dazu gibt es diverse Beiträge (vor allem) von @flohoff, z.B: Sind Adressen in OSM „amtlich“ oder „postalisch“? - #76 by flohoff

Edit:
Durch die Ausgabe von ::id bekommt man die verschiedenen Abschnitte der gleichen Straße. Bei Weglassen fallen die echten (wenigen) Mehrfachvorkommen unter den Tisch.

M.E. sind es Dubletten, z.B.

und

Nein!
abgesehen davon, dass dies schon allein von der geografischen Lage zwei verschiedene Abschnitte sind, haben diese auch noch ein unterschiedliches Tagging.

“Dubletten” wären absolut identisch:

  1. gleiche Lage
  2. gleiche Tags
  3. gleiche Zugehörigkeit zu Relationen

Zwei aufeinanderfolgende Straßenabschnitte, die nur Punkt 2 und 3 erfüllen, kann man vereinigen (muss man aber nicht)

Danke, verstanden!

Aber damit wird das Ziel des OP

Ich möchte jeweils alle Straßen, die innerhalb einer deutschen PLZ vorkommen

leider nicht erreicht. Wir müssten wohl
[out:csv(::id, "name",::count; false; ",")];
so modifizieren, dass nur der “name”, nicht die::id berücksichtogt wird …

Ich habe keine Ahnung, ob man das direkt als Datenbankanfrage hinbekommt.

Wahrscheinlich benötigt es nach der Datenbankabfrage weitere Verarbeitungsschritte, in denen zwei Straßenabschnitte mit identischem Namen, die sich in einem Punkt berühren, zusammengefasst werden, und zwar solange wie sich zwei Straßenabschnitte mit identischem Namen an einem Punkt berühren.
Anmerkung: es müssen nicht unbedingt die Endpunkte sein, wo sie sich berühren. Da funktioniert dann einfaches Verschmelzen auch nicht.

Die Abfrage

[out:csv(cnt,length,name)];
area["ISO3166-1"="DE"];
wr(area)[postal_code="42287"];
map_to_area;
way(area)[name][highway];
for(t["name"])
{
  make stat cnt=count(ways),length=sum(length()),name=_.val;
  out;
}

erzeugt pro Straßenname nur eine Zeile.

Das PLZ-Gebiet in DE habe ich in drei Schritten selektiert:

  • Deutschland als Fläche in Zeile 2
  • ein PLZ-Element (Way oder Relation) in Zeile 3
  • die dazugehörige PLZ–Area in Zeile 4

In Zeile 6 fasst das for jeweils alle Elemente zusammen, für die der Ausdruck t["name"] (der Wert des Tags name) den gleichen Wert hat. Die Anweisung for kommt dem GROUP_BY schon so nahe wie das noch sinnvoll ist.

In Zeile 8 habe ich dann ein paar vermutlich interessante Informationen zusammengefassen lassen.

4 Likes

Lass mal sehen…

… ich bin beeindruckt! Habe es mal eben getestet, es läuft sehr gut, vielen Dank dafür!
=> In der Tat sind die Zusatz-Infos, die ich gar nicht angefordert hatte, ziemlich interessant: Anzahl der zusammengefassten gleichlautenden Straßen und die Gesamtlänge der Straße. :smiley:

Sehr schön!

Viele Grüße,
Christoph

Cool! :+1:

Ich bekomme Ideen… :slight_smile:

Frage. welche Maßeinheit hat hier “length”?

Danke,

Sven

Ich habe in der Kopfzeile noch die Maßeinheiten in [ ] und einen Spaltentrenner “|” hinzugefügt.

[out:csv(cnt, "[Stk]","|",length, "[m]","|",name)];
area["ISO3166-1"="DE"];
...

Kann man den Spaltentrenner auch in die Datenliste einfügen?