PLZ Koordinaten und Umkreissuche
Beim Aufbau der Umkreissuche für Radtourenfahrten in Eurer Nähe musste ich mich ein bisschen mit Geodaten und Berechnungen für Entfernungen zwischen zwei Postleitzahlen in php beschäftigen.
Dabei bin ich auf eine Menge offener Fragen und Probleme zu dem Thema gestoßen. Inzwischen habe ich für alle meine Fragen eine Lösung gefunden und teile sie gerne mit Euch.
- Wenn wir nicht immer nett bei Google Maps nach den Koordinaten fragen wollen, brauchen wir eine Liste/ Tabelle mit allen Postleitzahlen (PLZ) und den dazugehörigen Koordinaten in Längen- und Breitengraden.
Ich habe eine entsprechende Tabelle erstellt, die ihr Euch hier runterladen könnt.
Das RAR-File enthält einen DUMP für MYSQL und zusätzlich noch die Tabelle im CSV-Format.Download der Datei hier: PLZ2Koordinaten
- Wenn wir das haben, geht es an die Entfernungsberechnung per php script. Dabei kann natürlich nur die Luftlinie zwischen zwei Koordinaten berechnet werden. Die tatsächliche Strecke per Auto oder zu Fuß mit einem Routenplaner kann also erheblich abweichen.
Hinweis: Bei dem hier dargestellten Code handelt es sich um Code für ein Wordpress-Addon. Unterschiedlich sind aber eigentlich nur die Funktionen für den MySQL-Connect und dass das Resultat ein Objekt und kein Array ist. Ich denke das kriegt ihr aber hin ;)
// Koordinaten der PLZ – Feldname im Formular = plz
$plz_koord = $wpdb->;get_row(“Select * from plz_koord where plz = ‘$_POST[plz]‘;”);
$ursprungsbreite = $plz_koord->koord_breite;
$ursprungslaenge = $plz_koord->koord_laenge;// max. Km-Entfernung von Startort
$entf = $_POST[entf]; // Formularfeld in dem die Entfernung abgefragt wurde$alpha = 180*$entf/(6378137/1000*3.14159);
$geo1 = $ursprungsbreite-$alpha;
$geo2 = $ursprungsbreite+$alpha;
$geo3 = $ursprungslaenge-$alpha;
$geo4 = $ursprungslaenge+$alpha;$abfrage = $wpdb->get_results(“SELECT * FROM plz_koord WHERE (koord_breite >= ‘$geo1′) AND (koord_breite <= ‘$geo2′) AND (koord_laenge >= ‘$geo3′) AND (koord_laenge <= ‘$geo4′)”);
$a = $ursprungsbreite/180*3.14159;
$b = $ursprungslaenge/180*3.14159;$z = 1;
// Für jede Zeile wird jetzt die genaue Entfernung geprüft
foreach($abfrage as $ko) {$c = $ko->koord_breite;
$d = $ko->koord_laenge;
$c = $c/180*3.14159;
$d = $d/180*3.14159;$e = sin($a)*sin($c);
$f = cos($a)*cos($c)*cos($d-$b);
$g = acos($e + $f);
$h = $g * 6378.137;
$ausgabe = sprintf(“%01.2f”, $h);// Ist die Entfernung zu groß, wird fortgefahren
if($ausgabe > $entf) {
continue;
}
// Entfernung ist im Rahmen, daher geht es hier weiter
// Ich packe die relevanten Ergebnisse in ein Array, dass ich dann wieder nach der Entfernung sortiere
$index = $ausgabe.$z;
$treffer[$index][entf] = str_replace(‘.’,',’,$ausgabe);
$treffer[$index][ort] = $ko->ort;
$z++;
}// Sortiern nach aufsteigender Entfernung
if (count($treffer) > 0) {
ksort ($treffer);
}
So, ich denke das sollte so passen. Ihr habt jetzt ein Array mit dem Namen treffer in dem nach Entfernung geordnet die Ortsnamen stehen.
Bei Fragen oder Hinweisen kommentiert oder mailt einfach ;)
Wer das Script oder die Daten benutzt ist herzlich eingeladen einen Backlink auf diese Seite zu setzen. Ebenso freue ich mich über Links zur eigenen Seite in den Kommentaren ;)
Diese Seite als Bookmark/Lesezeichen speichern bei:
Ähnliche Artikel:
Keine ähnlichen Artikel bisher.




September 21st, 2008 at 02:39
Ich bedanke mich für das Script. Dies wird von mir in einsatz kommen! Sehr schön, nochmal Danke! Habs ein bisschen verändert ;) Aber die PLZ Liste mit Geodaten ist schonmal ein Superteil und dann noch der Script :)
November 12th, 2008 at 16:44
Servus, dieses PLZ2Koordinaten-File ist eine sehr nette Idee, jedoch sind die meinsten Koordinaten gleich und diese Koordinate “50.087″;”14.3979″ verweisen immer auf die Stadt Prag. Es wäre sehr nett, wenn Sie das korrekte File nocheinmal einstellen könnten, danke.
April 9th, 2009 at 23:16
Hi,
was wird denn hier berechnet?
$alpha = 180*$entf/(6378137/1000*3.14159);
was sind das für Koordinaten?
ebenso hier:
$a = $ursprungsbreite/180*3.14159;
$b = $ursprungslaenge/180*3.14159;
Grüße
der Denis
September 17th, 2009 at 03:56
[...] in php Der Beitrag lies mich jetzt auch nicht ganz ruhig.. und ich bin bei auf das gestosen http://www.desmen.de/seitensachen/pl…reissuche.html evtl. hilft Dir das ja weiter mfg [...]
September 22nd, 2009 at 14:16
hi,
ich möhte gerne das auf eine wordpress webseite einbinden aber ich weiss nicht wie?
gibt es irgendwo eine genauere anleitung?
oder ein widget / plugin für wordpress?
Grüße
Chris
September 3rd, 2010 at 13:01
Hi Sebastian,
mir fällt gerade auf, das unendlich viele Einträge in der Tabelle den gleichen Längen- und Breitengrad haben, genau über 16000 stehen auf
Breite 50.087 und Länge 14.3979.
Hast du eine vollständig richtige Tabelle?
Gruß
Rainer