Liste Orte, Landkreise, Bundesländer in Deutschland

Hallo zusammen,
ich habe eine Liste mit ca 13000 Ortsnamen, hauptsächlich aus DE, und muss diese Übeprüfen, ob existent, welcher Landkreis, Bundesland. Da es das Problem gibt mit mehrfachen Ortsnamen, wie z.B. Berg, Freiberg… u.ä. war mein Gedanke, das mit OpenRefine Reconciliation Dienst abzugleichen. Mein Problem ist, die Abfrage für die Overpass API zu erstellen. Liste der Orte habe ich hinbekommen, aber die Verbindung Ort+Landkreis+Bundesland+OSM-ID, Lat, Lon, kriege ich einfach nicht hin. Eine Liste als csv/txt würde mir auch schon helfen.
Wäre sehr dankbar für ein guten Tipp oder Hilfe.
Gruß Kcim

Hallo,
Nominatim sollte für die Hierarchie helfen können, aber das einfachste ist m.E. die Zuordnung über die Amtlichen Gemeinde- oder Regionalschlüssel.
Ansonsten in der Art:

[out:json][timeout:25];
{{geocodeArea:Saarland}}->.searchArea;
rel["admin_level"](area.searchArea);
out center;

Dann musst Du noch angrenzende Kreise und admin_level > 8 wegwerfen (oder die Query entsprechend anpassen) und per Schlüssel die Hierarchie bauen.
Fabian.

1 Like

Danke Fabian für die Antwort.
Da mein Wissen leider noch nicht ausreicht zu OSM, komme ich da nicht weiter. Ich habe mir das etwas einfacher vorgestellt. Muss mich noch einarbeiten.
admin_level > 8 wegwerfen ?
per Schlüssel die Hierarchie aufbauen ?

Danke trotzdem.
Gruß
Kcim

Hallo Kcim,
der admin_level gibt die Hierarchiestufe an. Du hattest nach Bundesland, Kreisen und Orten gefragt, interessierst Dich also nicht für Ortsteile. Du kannst Dich also entweder per Overpass herausfinden, dass statt rel["admin_level"] vielleicht ein rel["admin_level"~"4|6|7|8"] die richtigen Werte zurückgibt oder die exportierten Daten mit einem Werkzeug Deiner Wahl weiter filtern.
Zumindest in Deutschland sollten die Gliederungseinheiten einen Gemeindeschlüssel oder Regionalschlüssel tragen. Welche von beiden besser gemappt ist, weiß ich nicht, Laut Taginfo sind sie jedenfalls ähnlich häufig. Da die Information, welcher Ort in welchem Kreis liegt, über diese Schlüssel abgebildet wird, ließe sich für mich die Information, welcher Ort in welchem Kreis liegt, leichter über diesen Schlüssel ermitteln als das ganze per Nominatim oder PostGIS herauszufinden.
Viele Grüße,
Fabian.

@Fabian,
ok, ich habe mit dem befehl
[out:csv(::id, name, place, “is_in:country”, “addr:state”; true; “,”)];
area[“name”=“Saarland”]->.searchArea;
node"place"=“village”;
out;

id,name,place,is_in:country,addr:state
50592898,Herbitzheim,village,
50592905,Gersheim,village,
50598758,Reinheim,village,
50598777,Erfweiler-Ehlingen,village,
60720777,Nonnweiler,village,

jetzt eine Liste der Orte. Ist diese soweit überhaupt richtig ?
Wie bekomme ich die restliche Infos ?
Also ich brauche:
, Ortsname, Landkreis, Bundesland, Land, lon, lat Koordinaten.
Ob jetzt über Bundesland> Ort, oder ort > bundesland, ist eigentlich egal.
Wie soll ich jetzt weitermachen ?

Inwieweit das richtig ist, kann ich nicht einschätzen. Ich bin von selbständigen Gemeinden ausgegangen. Deine Abfrage findet auch eingemeindete Dörfer, aber keine Städte. Es gibt wohl 10.751 Gemeinden in Deutschland, in Deiner Liste sind auch welche in anderen Ländern. Eingemeindete Dörfer dürfte es deutlich mehr geben, siehe Gemeinde (Deutschland) – Wikipedia
Wenn Du Herbitzheim finden willst, funktioniert mein Ansatz nicht, da es keinen (eingetragenen) Amtlichen Gemeindeschlüssel hat.

Hi,

das Beispiel

https://wiki.openstreetmap.org/wiki/DE:Overpass_API/Beispielsammlung#Georeference_details_zu_village_nodes_hinzufügen_(seit_0.7.54)

ans Saarland und CSV-Ausgabe angepasst sowie den Timeout soweit hochgeschraubt, dass die Ausgabe vollständig ist:

[out:csv(::id, name, place, is_in)][timeout:120];
{{geocodeArea:Saarland}}->.searchArea;

node(area.searchArea)[place~"^(city|town|suburb|village|hamlet)$"];
	foreach(
      	is_in->.a;
      	area.a[name][boundary=administrative][admin_level~"[2-8]"]->.a;
      	convert node ::=::,
      				::id = id(),
      				is_in=a.set("{" + t["admin_level"] + ":" + t["name"] + "}");
      	out;
    );

Die Liste sieht soweit gut aus, ich hab’ vor ein paar Jahren alles, was ich als Ortsteile angesehen habe, mit dem Fahrrad durchquert.

Aber selbst dann kann es Grenzfälle geben, im Saarland wäre das der place-node Mangelhausen,

hier

939956815 Mangelhausen village {2:Deutschland};{4:Saarland};{6:Landkreis Neunkirchen};{8:Eppelborn}

siehe dazu auch Zwei Ortsschilder - eine Straße - #7 by Vinzenz_Mai

Edit:
Für Rheinland-Pfalz habe ich timeout=480 bei folgender Abfrage benötigt:

[out:csv(::id, lat, lon, name, place, kreis)][timeout:480];
{{geocodeArea:Rheinland-Pfalz}}->.searchArea;

node(area.searchArea)[place~"^(city|town|village|suburb)$"];
foreach(
  is_in->.a;
  area.a[name][boundary=administrative][admin_level~"[6]"]->.b;
  convert node ::=::,
  	::id = id(),
  	lat = lat(),
  	lon = lon(),
 	kreis=b.set(t["name"]);

  out;
);

Ausgabe:

@id lat lon name place kreis
240082315 49.9014098 6.2357926 Gentingen village Eifelkreis Bitburg-Prüm
240055379 49.9235299 6.2232179 Roth an der Our village Eifelkreis Bitburg-Prüm

inklusive hamlet und neighbourhood sogar 720 (600 haben nicht gereicht).
Die Ausgabe von Bundesland und Land als eigene Spalten ist zwar prinzipiell möglich, kostet jedoch viel Zeit. Dann besser aus dem Beispiel fürs Saarland anschließend ermitteln - oder einfach die Abfrage auf Bundeslandebene bzw. auf Regierungsbezirksebene durchführen.

Eine deutschlandweite Abfrage wäre vermutlich keine gute Idee.