Okay, dann nehme ich alle Grenzen aus OSM mit admin_level=6…10 für das Gebiet BOR, COE, ST, MS und WAF.
Klasse
Ggfs. wie gesagt Hiltrup nochmal extra betrachten, weil dort relativ viele Knoten stehen und man es leicht von Münster isolieren können müsste.
Vielen Dank schon Mal, bin gespannt.
Hier die Zusammenstellung: http://data.jostlemke.de/ffml-regional.csv
Für die Pivot-Tabelle: „id“ als Größe zum Zählen und für die Kategorien die Spalten „name_2“, „name_pre_2“, „name_pre_1“ und „23“ (Kreis, Gemeinde und für MS: Stadtbezirk und Stadtteil).
@jotzt: Wow, vielen Dank für deine Mühe!
Ich werde Mal noch probieren, ein paar Gruppierungen zu erstellen. Müsste ja relativ einfach sein mit den ausführlichen Rohdaten.
FTR, wir lösen das serverbasiert:
function city2locode($cityname, $zipcode, $state) {
$unlocode="xxx";
switch($cityname) {
case "Guetersloh":
$unlocode="gut";
break;
case "Rheda-Wiedenbrueck":
$unlocode="rhw";
break;
case "Rietberg":
$unlocode="gut"; # rig
break;
# case "Harsewinkel":
# $unlocode="gut"; # hsl
# break;
default:
$unlocode="gto";
if($zipcode > 17100 && $zipcode < 17300) {
$unlocode="wrz";
}
if($zipcode == 0 && $state == "Mecklenburg-Vorpommern") {
$unlocode="wrz";
}
if($zipcode > 33300 && $zipcode < 34000) {
$unlocode="gut";
}
if($zipcode == 0 && $state == "Nordrhein-Westfalen") {
$unlocode="gut";
}
break;
}
return($unlocode);
}
Ablauf: Knoten schickt seine Koordinaten und erwartet einen FW-Code zurück (der effektiv ein UN/LOCODE ist).
@MPW: Du kannst den OSM (Nominatim) Reverse Gecoder nutzen, dann kannst du das ondemand für jeden Node entscheiden. Du übergibst einfach lat/lon und erhältst die entsprechende Adresse inklusive aller vorhandenen Verwaltungsebenen. Beispiel eines Nodes von mir: https://nominatim.openstreetmap.org/reverse?lat=52.0210093&lon=7.5620507
Du kannst die Ausgabe auch noch anpassen (z. B: als json, etc.): Nominatim - OpenStreetMap Wiki
Glücklicherweise gibt es in OSM für Münster sehr detaillierte Gebietsgrenzen, die bis admin_level=11 runter gehen (in Nienberge hatte ich mal aus Spaß admin_level=12 gemappt). Hier kannst du dich einfach mal etwas durch die vorhandenen Daten klicken: wno-edv-service.de - Diese Website steht zum Verkauf! - Informationen zum Thema wno edv service.
Dort ist z. B. Hiltrup in drei Teile aufgeteilt: Hiltrup-Mitte, Hiltrup-West und Hiltrup-Ost. Dabei handelt es sich jeweils um die offiziellen Verläufe der jeweiligen Verwaltungsebene.
Die Resultate vom Nominatim Geocoder kannst du dann in das Script von @wusel werfen.
Yepp, site.confs sind unter dem Namen gespeichert und werden entsprechend dann ans Ziel kopiert.
Bei der Google-API ist zu beachten, das es ein Query-Limit gibt.
Das ist IP-basiert, muss man abfangen und ggf über (mehrere) DSL-Anschlüsse laufen lassen.
Das Limit dürfte pro Tag gelten, man kann also vermutlich auch ohne sleep kurz ‚Volldampf‘ geben.
Das ist ziemlich großartig, danke!
Ne, als ich mein Skript oben ohne sleep habe laufen lassen, gab es viele Zurückweisungen. Mit dem sleep läuft es für die ~650 Datensätze ohne Probleme durch.
Ich habe gerade mal ein kleines Python Script geschrieben, was das reverse geocoding macht und habe versucht möglichst viele Level darzustellen. Folgende Resultate (ich habe die nodes.js von ffms verwendet):
Update: Daten zeigen jetzt nur noch Knoten, die online sind. (Stand 23.08., 21:04)
----------
----------
Administrative:
Gesamt: 513
Deutschland: 513
Baden-Württemberg: 2
Regierungsbezirk Stuttgart: 2
Verwaltungsgemeinschaft Schwaigern: 2
Schwaigern: 2
Niedersachsen: 13
Nordrhein-Westfalen: 498
Regierungsbezirk Köln: 1
Köln: 1
Mülheim: 1
Mülheim: 1
Bruder-Klaus-Siedlung: 1
Regierungsbezirk Münster: 497
Kreis Warendorf: 73
Sendenhorst: 4
Drensteinfurt: 2
Telgte: 2
Warendorf: 44
Einen-Müssingen: 2
Ostbevern: 2
Ahlen: 2
Beckum: 1
Sassenberg: 1
Ennigerloh: 15
Kreis Recklinghausen: 1
Castrop-Rauxel: 1
Rauxel-Süd: 1
Münster: 229
Münster-West: 33
Nienberge: 5
Häger: 4
Isolde-Kurz-Straße: 1
Albachten: 7
Sentruper Höhe: 5
Mecklenbeck: 3
Gievenbeck: 9
Roxel: 4
Münster-Mitte: 141
Mitte-Süd: 26
Geist: 11
Düesberg: 5
Aaseestadt: 6
Schützenhof: 4
Erphoviertel: 3
Mauritz-West: 3
Mitte-Nordost: 33
Mauritz-Mitte: 2
Herz-Jesu: 1
Uppenberg: 11
Hafen: 13
Rumphorst: 3
Klein-Muffi: 3
Altstadt: 29
Dom: 1
Überwasser: 3
Buddenturm: 1
Martini: 13
Aegidii: 11
Hansaviertel: 12
Mauritz-West: 6
Hansaplatz: 6
Innenstadtring: 38
Schlachthof: 4
Kreuzviertel: 16
Josef: 7
Schloss: 2
Bahnhof: 5
Pluggendorf: 3
Neutor: 1
Münster-Ost: 5
Handorf: 1
Gelmer-Dyckburg: 2
Mauritz-Ost: 2
Münster-Südost: 9
Wolbeck: 3
Gremmendorf: 6
Gremmendorf-Ost: 5
Münster-Hiltrup: 32
Hiltrup: 26
Hiltrup-West: 25
Berg Fidel: 3
Amelsbüren: 3
Münster-Nord: 9
Coerde: 5
Kinderhaus: 4
Kinderhaus-West: 4
Kreis Steinfurt: 93
Altenberge: 2
Emsdetten: 16
Nordwalde: 5
Westerkappeln: 3
48565: 25
Burgsteinfurt: 16
Borghorst: 9
Laer: 5
Metelen: 2
Greven: 8
Reckenfeld: 3
Gimbte: 5
Recke: 1
Wettringen: 1
Hörstel: 1
Bevergern: 1
Rheine: 4
Eschendorf: 1
Schotthock: 3
Saerbeck: 10
Neuenkirchen: 6
Sankt Arnold: 6
Horstmar: 1
Lienen: 3
Kreis Coesfeld: 85
Dülmen: 42
Hausdülmen: 6
Buldern: 2
Rorup: 30
Lüdinghausen: 31
Coesfeld: 2
Lette: 1
Goxel: 1
Nottuln: 1
Ascheberg: 3
Herbern: 3
Senden: 6
Kreis Borken: 16
Velen: 1
Gescher: 3
Ahaus: 3
Wüllen: 2
Stadtlohn: 2
Reken: 3
Maria Veen: 3
Borken: 2
Schöppingen: 2
----------
----------
Postal:
44577: 1
59387: 3
49536: 6
48624: 4
48565: 25
48629: 4
48465: 9
48356: 10
48231: 44
48153: 8
49082: 1
48151: 30
48157: 8
48155: 28
48734: 6
59348: 32
48159: 11
48291: 2
48683: 3
48485: 6
59227: 1
49509: 1
59320: 15
59229: 1
48341: 4
48366: 10
48301: 1
59269: 1
48249: 42
48268: 10
48308: 6
48324: 4
48369: 24
48477: 1
74193: 2
48317: 2
48432: 6
48653: 2
48346: 4
48612: 1
49504: 1
49076: 1
49219: 4
46325: 3
48167: 12
48165: 28
48163: 13
48161: 23
48145: 10
48147: 22
48712: 3
48143: 35
49846: 1
49492: 3
48493: 2
48282: 16
48429: 1
51063: 1
48703: 4
46342: 2
48336: 1
48149: 14
Ich finde die Aufschlüsselung nach Administrativen Einheiten sehr viel aufschlussreicher als nach PLZ. Ich habe das Script auf gist gepackt: ff_node_geolocation.py · GitHub
Anmerkungen: Ich habe nur quick’n’dirty etwas herumprobiert und u. a. Niedersachsen ist gar nicht weiter aufgeschlüsselt, da dort in OSM wohl eine andere Hierarchie verwendet wird. Außerdem verwende ich geopy (GitHub - geopy/geopy: Geocoding library for Python.) für den api-call.
Alles im allen scheint die Aufschlüsselung über OSM/Nominatim aber detaillierter als über Google Maps zu sein. Manchmal sind halt nicht alle Daten vorhanden. In Dülmen z. B. gibt es 49 Nodes, jedoch sind in Dülmen nicht alle Ortsteile erfasst. Sodass, wenn man die Nodes der Unterkategorien zählt nur auf 43 kommt.
@descilla: Ich probiere gerade dein Skript aus, leider funktioniert es bei mir nicht:
$ ./ff_node_geolocation.py
Traceback (most recent call last):
File "./ff_node_geolocation.py", line 7, in <module>
from geopy.geocoders import Nominatim
ImportError: cannot import name Nominatim
$ python --version
Python 2.7.6
Das Paket python-geopy hab ich installiert. Hast du eine Idee woran es hängt?
Grüße
MPW
Wenn du geopy über apt-get install python-geopy installiert, erhältst du - zumindest als ich es getestet habe - eine älterer Version von geopy, in der OSM respektive Nominatim noch nicht enthalten ist. Daher apt-get remove python-geopy und dann via pip installieren. pip install geopy
grüße
descilla
edit: habe hier mal eine aktuelle Abfrage aller Knoten, die heute (13.09.) um 13:40 online waren gemacht:
----------
----------
Administrative:
Gesamt: 690
Deutschland: 689
Bayern: 2
Mittelfranken: 1
Erlangen: 1
OB: 1
Landkreis Pfaffenhofen an der Ilm: 1
Scheyern: 1
Baden-Württemberg: 1
Regierungsbezirk Stuttgart: 1
Verwaltungsgemeinschaft Schwaigern: 1
Schwaigern: 1
Niedersachsen: 12
Nordrhein-Westfalen: 674
Regierungsbezirk Köln: 1
Köln: 1
Mülheim: 1
Mülheim: 1
Bruder-Klaus-Siedlung: 1
Regierungsbezirk Arnsberg: 1
Dortmund: 1
Regierungsbezirk Düsseldorf: 1
Kreis Wesel: 1
Rheinberg: 1
Borth: 1
Regierungsbezirk Münster: 671
Kreis Warendorf: 81
Warendorf: 46
Einen-Müssingen: 2
Drensteinfurt: 2
Telgte: 4
Ostbevern: 2
Sendenhorst: 4
Ahlen: 3
Beckum: 1
Sassenberg: 1
Ennigerloh: 18
Kreis Recklinghausen: 1
Castrop-Rauxel: 1
Rauxel-Süd: 1
Münster: 234
Münster-West: 33
Nienberge: 5
Häger: 4
Isolde-Kurz-Straße: 1
Albachten: 8
Sentruper Höhe: 3
Mecklenbeck: 3
Gievenbeck: 10
Roxel: 4
Münster-Mitte: 149
Mitte-Süd: 29
Geist: 12
Düesberg: 7
Aaseestadt: 6
Schützenhof: 4
Erphoviertel: 3
Mauritz-West: 3
Mitte-Nordost: 32
Mauritz-Mitte: 2
Herz-Jesu: 1
Uppenberg: 8
Hafen: 12
Rumphorst: 5
Klein-Muffi: 4
Altstadt: 30
Dom: 2
Überwasser: 3
Buddenturm: 2
Martini: 12
Aegidii: 11
Hansaviertel: 13
Mauritz-West: 7
Hansaplatz: 6
Innenstadtring: 42
Schlachthof: 5
Hansaplatz: 1
Kreuzviertel: 15
Josef: 8
Schloss: 3
Bahnhof: 7
Pluggendorf: 2
Neutor: 1
Münster-Ost: 4
Handorf: 1
Gelmer-Dyckburg: 2
Mauritz-Ost: 1
Münster-Südost: 9
Wolbeck: 3
Gremmendorf: 6
Gremmendorf-West: 2
Gremmendorf-Ost: 4
Münster-Hiltrup: 30
Hiltrup: 24
Hiltrup-West: 23
Berg Fidel: 3
Amelsbüren: 3
Münster-Nord: 9
Coerde: 5
Kinderhaus: 4
Kinderhaus-Ost: 1
Kinderhaus-West: 3
Kreis Steinfurt: 195
Wettringen: 18
Emsdetten: 18
Nordwalde: 6
Westerkappeln: 3
48565: 66
Burgsteinfurt: 39
Borghorst: 27
Laer: 2
Greven: 9
Reckenfeld: 4
Gimbte: 5
Hörstel: 3
Bevergern: 2
Rheine: 23
Gellendorf: 2
Eschendorf: 6
Wietesch: 2
Dorenkamp: 2
Rodde: 5
Schotthock: 4
Altenberge: 5
Saerbeck: 16
Neuenkirchen: 22
Sankt Arnold: 22
Horstmar: 1
Lienen: 3
Kreis Coesfeld: 115
Dülmen: 45
Hausdülmen: 8
Buldern: 3
Rorup: 30
Lüdinghausen: 49
Coesfeld: 4
Lette: 2
Goxel: 2
Nottuln: 1
Rosendahl: 3
Olfen: 1
Vinnum: 1
Senden: 6
Ascheberg: 6
Herbern: 6
Kreis Borken: 45
Velen: 2
Gescher: 3
Ahaus: 2
Wüllen: 1
Reken: 3
Maria Veen: 3
Stadtlohn: 21
Vreden: 1
Heiden: 1
Borken: 3
Südlohn: 5
Legden: 4
----------
----------
Postal:
44577: 1
59387: 6
49536: 6
48149: 12
48565: 66
48465: 9
48356: 12
44357: 1
48231: 46
48153: 9
48151: 31
48157: 8
48155: 32
48734: 5
59348: 51
48159: 9
48739: 8
48683: 2
48485: 23
46149: 1
59227: 2
59320: 18
59229: 1
46354: 15
48712: 3
48291: 5
48366: 4
48301: 1
59269: 1
48249: 45
48341: 10
48268: 12
48308: 6
48324: 4
48369: 36
51063: 1
47495: 1
74193: 1
48431: 4
48432: 17
48653: 4
48346: 4
48612: 1
49504: 1
49076: 1
49219: 4
48477: 3
48282: 18
59399: 1
48165: 26
48163: 15
48691: 1
48161: 24
48145: 12
91052: 1
48147: 24
48720: 3
48143: 36
49846: 1
49492: 3
46325: 4
48493: 36
48167: 9
48429: 6
46359: 1
48317: 2
46342: 3
48336: 1
85298: 1
48703: 37
Danke, funktioniert jetzt. Skript läuft, bin auf die Ausgabe gespannt.
Ach ja, Ausgabe ist ja schon da. Noch besser!
Gerade Mal die Daten verglichen, irgendwie schrumpfen Münster und Warendorf.
Das kann daran liegen, dass ich unterschlagen habe, dass ich nun nur noch die Knoten berücksichtige, die online sind. Das habe ich beim ersten Posting nicht gemacht (habe die alte nodes.json noch rumfliegen gehabt und jetzt aktualisiert).
Falls du mein letztes Posting verglichen mit deiner Ausführung meinst: Die Zahl der Nodes, die online sind schwanken ja über den Tag gesehen. Habe schon überlegt, ob ich auch Nodes berücksichtige, die <24h offline sind.
Außerdem wollte ich noch einen Cache einbauen, der sich die Gebietszuordnung zu einmal abgefragten lat/lon Locations merkt. Dann sollte das beim Wiederausführen erheblich schneller sein. Denn man sollte nicht mehr als 1 Request / Sekunde an die API schicken, da man sonst automatisch blockiert werden könnte.
PS: Hast du ne Idee, in welchem Format man das Resultat am Besten ausgeben könnte?
Grüße
Simon
Hallo Simon,
also wir wollen die Aufteilung so machen, wie es hier auf Seite 12 festgelegt wurde: https://github.com/FreiFunkMuenster/media-ffms/blob/master/Vorträge/2015-08-26-WachstumsbedingteProblemeFFML.pdf
Wenn du das entsprechend automatisch gruppieren könntest, wäre das klasse. Dann kann man das wöchentlich aktualisieren und schauen, welche Gruppe am schnellsten wächst. Münster-Süd ist auf der Folie erklärt.
Alle nicht NRW-Knoten könntest du erstmal extern gruppieren und eine Summe der nicht geokodierten Knoten wäre auch super.
Grüße
MPW