Algorithmus gesucht - Domänsplit

Hallo,

in Vorbereitung auf einen Domänsplit möchte ich überlegen, was für Grenzen sinnvoll wären. Einfach um Mal eine Vorstellung davon zu bekommen, wie viele Router in welchem Postleitzahlenbereich stehen oder ähnliches.

Dazu suche ich ein Tool, in das ich die JSON der Karte schmeißen kann, und dann in irgendeiner Form eine Gruppierung vornehmen kann.

Hat jemand sowas schon Mal gebaut? Ich dachte, ich frage einfach Mal, ob es sowas schon gibt.

Gerüchteweise soll @thomasDOTwtf da schon Mal was gebastelt haben? Gerüchteweise soll das auch mit der OpenStreetMap gehen.

Letztendlich muss man ja nur die GPS-Koordinaten einer Adresse zuordnen und dann hat man es…

Grüße
MPW

1 Like

Folgendes Shell Script ergibt bei Aufruf mit den Lat Long Koordinaten die Strassenadresse inkl. Postleitzahl.

Beispiel:

./QueryLatLong 50.769681 6.080055

gibt folgendes aus:

Stephanstraße 42-44, 52064 Aachen, Germany

So kriegst da also die PLZ zu einer Geokoordinate raus…

Falls du jetzt ne Massenabfrage starten willst, würde ich zwischen die Einzelnen Aufrufe aber schon ein Sleep reinpacken, ich denke, deren Server macht bei zu vielen Aufrufen per Zeitfenster zu.

Hier der Code:

tmpfilex=”/tmp/tempLatLong.$$.tmp”
tmpfiley=”/tmp/tempLatLong2.$$.tmp”

Lat=”$1"
Long=”$2"

wget -o $tmpfilex -O $tmpfiley “http://maps.googleapis.com/maps/api/geocode/json?latlng=$Lat,$Long&sensor=true”
StreetAddress=$(cat $tmpfiley | awk {‘if (index($0, “address”)>0) {printf($0)}’} | awk -F”street_address” {‘print $1′} | awk -F”formatted_address” {‘print $2′} | awk -F\” {‘print $3′})

echo “$StreetAddress”

rm $tmpfilex
rm $tmpfiley

(Sicherlich kann man die AWK-Anweisung auch “schöner” hinbekommen, aber es funktioniert!)

1 Like

Ich hab da Mal was gebastelt.

#!/bin/bash

cplzs=-1

function wegsortieren {
    if [[ $plz == "" ]]; then
        return 1
    fi
    echo $plz
    for i in `seq 0 $cplzs`; do
        if [[ "${speicher[$i]}" == "$plz" ]]; then
            ((zaehler[$i]++))
            return 0
        fi
    done
    cplzs=$((cplzs+1))
    speicher[$cplzs]=$plz
    zaehler[$cplzs]=1
    return 0
}

if [ "$1" == "" ]; then
    echo 'Du hast vergessen den Link zur json-Datei anzugeben. Beim Meshviewer ist dieser <Link-zur-Karte>/data/nodes.json.'
    exit 1
fi

mode=0
for i in `wget -qO - $1|grep -i 'latitude' -A1`; do
    if [ $mode -eq 0 ]; then
        mode=1
        continue
    elif [ $mode -eq 1 ]; then
        lat=`echo $i|tr -d ','`
        mode=2
        continue
    elif [ $mode -eq 2 ]; then
        mode=3
        continue
    elif [ $mode -eq 3 ]; then
        lng=`echo $i|tr -d ','`
        mode=4
        continue
    else
        mode=0
        #echo "Lat $lat Long $lng"
        plz=`wget -qO - "http://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lng&sensor=true"|grep '"[0-9][0-9][0-9][0-9][0-9]"'|head -n1`
        plz=${plz##*\ :\ \"}
        plz=${plz%%\"*}
        #echo $plz
        wegsortieren $plz
    fi
    sleep 0.5s
done

echo '========================'
echo '========================'
echo
for i in `seq 0 $cplzs`; do
    echo "${speicher[$i]}: ${zaehler[$i]}" >> ausgabe.txt
done

Das bringt mich persönlich aber nicht weiter, da die Einteilung gerade in Ballungsgebieten wie hier in Münster, doch sehr grob ist und teilweise mitten durch Stadtteile hindurch geht.

Man müsste besser auf der Karte Polygone setzen können und dann prüfen, wie viele Knoten darin sind.

Postleitzahl 48159 ist ein gutes Beispiel, dass so eine Einteilung leider nicht geht:

Von relativ zentral inklusive eines der größten Einkaufszentren in Münster bis ganz raus in die Wallachei.

Naja, aber falls dich ein Neu-Interessent fragt, in welche Domäne er denn nu gehört, ist die Frage „Welche PLZ hast du“ sicherlich einfacher zu klären als „in welchem Polygon ist dein Standort“…

Ja, die Idee hatte ich auch, aber siehe oben, das macht definitiv keinen Sinn :smiley: .

Der Stadt-/Ortsteil wäre insofern brauchbar, als er dem Nutzer bekannt sein sollte und die Daten via OSM verfügbar sind.

Brauchen wir das „einmalig“ als Entscheidungsgrundlage oder als „online“-Lösung? Im ersten Fall kann ich gerne den Münsterländer Routerkoordinaten einmal alle verfügbaren Gebietsaufteilungen (Kommune, Stadtteil, PLZ) zuordnen, damit man eine Datenbasis hat.

Hallo @jotzt,

danke für das Angebot. darauf würde ich gerne zurück kommen.

Also Postleitzahlen kannst du dir sparen, das hab ich schon gemacht. Das ist, wie oben geschrieben, hier leider nicht sehr aussagekräftig. Hier übrigens die Übersicht, falls es jemanden interessiert:

44357: 1
44532: 1
44577: 1
45711: 1
46325: 5
48143: 42
48145: 18
48147: 27
48149: 22
48151: 35
48153: 8
48155: 38
48157: 10
48159: 14
48161: 28
48163: 14
48165: 31
48167: 10
48231: 47
48249: 45
48268: 9
48282: 16
48291: 3
48308: 7
48317: 3
48324: 4
48336: 1
48341: 4
48346: 3
48356: 5
48366: 6
48369: 15
48429: 1
48432: 3
48465: 7
48477: 2
48485: 6
48565: 31
48612: 1
48624: 2
48629: 1
48653: 10
48683: 1
48703: 2
48712: 3
48720: 1
48727: 1
48734: 2
49076: 1
49082: 1
49219: 4
49492: 3
49504: 2
49509: 1
49525: 1
49536: 3
49846: 1
51063: 1
59227: 1
59229: 1
59269: 1
59320: 20
59348: 34
59379: 1
59387: 3
74193: 2

Was mich mehr interessiert ist, wäre die Aufteilung in die Kreise (Steinfurt, Warendorf, Coesfeld) und Münster.

Und dann ggfs. nochmal versuchen das jetzt schon ziemlich große Münster noch sinnvoll aufzuteilen. Also ich denke da vorallem an Hiltrup, dass man das evtl. Warendorf oder Coesfeld zuschlägt.

Grüße
MPW

Okay, dann nehme ich alle Grenzen aus OSM mit admin_level=6…10 für das Gebiet BOR, COE, ST, MS und WAF.

Klasse :smile:

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).

3 Likes

@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).

1 Like

@MPW gern geschehen. Ist aber auch kein großer Aufwand. :blush:

@wusel: Der Code wird dann vom site-select verarbeitet?

@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.

3 Likes

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.