PLZ Umkreissuche

PCGamer

Mitglied
Hallo,

ich bin grad wieder am verzweifeln.

Habe hier in Forum paar Tutorials gefunden, aber verstehen tu ich sie nicht ganz.

Also ich habe eine Tabelle mit Firmen wo auch die entsprechende PLZ steht (deutsch österreich, schweiz)

Parallel dazu hab ich noch eine Tabelle mit den ganzen x und y Koordinaten der PLZ's.
So seht zum Beispiel ein Datensatz aus:
'01067', 13.7194, 51.0626

Bei mein Formular gibt es ein Auswahlfeld in der Umgebung von 50, 20 oder 10km.

In der Ausgabe soll dann stehen: Ca. ...Km entfernt.

Wie geht sowas am besten?

Eine Frage nebenbei: Wo bekommt man eigentlich die Tabelle hier mit den ganzen Koordinaten (hab die jetzigen nur bekommen)?

Kann mir einer helfen?

Danke im vorraus
PC-Gamer
 
Hi

willst das unbedingt selbst machen oder würdest du Fertiges auch verwenden?
Hätte im Dezember nämlich so was gemacht:
http://www.tutorials.de/content/1314-php-klasse-fuer-ortsbezogene-umkreissuche.html
Geht sicher noch besser, funktioniert aber so auch ganz gut.

Ortstabellen mit allen Angaben:
Entweder von der Post (kostet was) oder Opengeodb (nicht ganz so vollständig, aber dafür gratis)

Wenn die Tabelle vom Stand Dezember 2011 sein darf
findest du alles Benötigte schon bei meinem Link dabei
(paar kleinere Änderungen hats seitdem sicher gegeben).

Gruß
 
Danke für die Antwort :)

Geht das auch mit zwei Tabellen?

Ich hab 2 MySql- Tabellen.

Meine Haupttabelle seht ungefähr so aus:
Name, Straße, Land, Ort, PLZ, Bemerkungen.

Meine 2 Tabelle mit den Koordinaten so (oben ist ein Beispiel Datensatz):
plz, x-cord, y-cord

meine SQL Abfrage prüft zurzeit nur welche Firm zu der jeweiligen PLZ gehört.

Wie kann ich die zweite Tabelle am besten einbinden und wie muss ich prüfen?
 
(Willst du jetzt meins abändern oder selbst was Neues machen?
Ist mir noch immer nicht ganz klar.)

Von der Ausgangsfirma musst du die PLZ sowieso mal per Select rausholen.

Einfachlösung wäre dann nach PLZ zu suchen und dann noch eine "where plz in(...)"-Abfrage
für die Firmen zusammenzubasteln. Ca. sowas:
PHP:
//Zuerst PLZ-Suche

$abfrage = 'select name from firma where plz in(';
foreach($PLZSuchergebnis)
    $abfrage .= $ergebnis->plz . ', ';
$abfrage .= ');';
//Ausführen

Schöner (und etwas schneller bei der Ausführung) wäre das natürlich gleich alles in SQL...
aber auch schwieriger zu programmieren.
Vorhandene Klasse müsste dafür auch größeren Änderungen unterzogen werden.
 
Am einfachsten wäre deins abzuändern das er die zwei Tabellen nutzt. Also du meinst erstmal die PLZ in der Tabelle wo die ganzen Längen unf Breitenkoordinaten abzufragen? Wie komme ich dann aber zu den anderen PLZ in der nähe, sagen wir 30km? und wie bekomme ich ür die Ausgabe dann die Entfernung raus?
 
Jetzt bin ich verwirrt :D

Du willst doch, ausgehend von einer Firma, andere Firmen in xx km Entfernung suchen?
 
Brauchst du nicht sein :D

Also jetzt werde ich mal konkret:

In meiner Haupttabelle befinden sich bestimmte Ärzte auf einen Gebiet. Also werden Datensätze mit Namen, Straße, Ort und der PLZ angelegt.
Der Benutzer hat ein Formular wo er eine PLZ eintragen kann, dazu hat er die Möglichkeit in den Umkreis von 50, 20 und 10Km zu suchen. Als Ausgabe sollen alle Ärzte angezeigt werden, die die PLZ haben oder eben im Umkreis. Zusätzlich soll für jeden gefunden Datensatz die ungefähre Entfernung ausgegeben werden.
Parallel zur Haupttabelle hab ich eine andere Tabelle wo alle PLZ von Deutschland, Österreich und der Schweiz mit den x bzw. y- Koordinaten drinstehen.

Jetzt habe ich in meiner Sql- Abfrage nur ein "where plz = '$plz'" drin, also ohne Berücksichtig des Umkreises.
 
Angenommen, die beiden Tabelle sehen so aus:

Code:
geodb_firmen
+---------+
| id      |
| name    |
| adresse |
| plz     |
+---------+

geodb_koordinaten
+---------+
| loc_id  |
| plz     |
| ort     |
| lat     |
| lon     |
+---------+

sowie
PHP:
$plz  = '12345'; // PLZ als VARCHAR
$dist = 10; // maximale Entfernung in Kilometern

Dann könnte deine Abfrage wie folgt aussehen:
SQL:
SELECT F.*,K.ort,
((ACOS(SIN(K2.lat * PI() /180) * SIN(K.lat * PI() /180) + COS(K2.lat * PI() /180) * COS(K.lat * PI() /180) * COS((K2.lon - K.lon) * PI() /180)) *180 / PI()) *60 * 1.1515 * 1.609344) AS distance
FROM geodb_firmen AS F
JOIN geodb_koordinaten AS K ON K.plz=F.plz
LEFT JOIN geodb_koordinaten AS K2 ON K2.plz='$plz'
HAVING distance <= $dist
ORDER BY distance

Das Ergebnis sieht dann in etwa so aus: (PLZ war 60385, Umkreis maximal 5km)
umkreissuche.png
 
Danke für die Antwort. Fast funktioniert es. Ist diese Abfrage Performance fressend, da er ungefähr 2 Minuten lang läd bis eine Ausgabe kommt oder liegt das an den folgenden Fehle?
Der andere Fehler ist: 9mal gibt er den selben Datensatz aus bis der nächste kommt (dann auch wieder 9mal):(

edit: opps mein Code vergessen:

PHP:
SELECT F.*, ((ACOS(SIN(K2.coordx * PI() /180) * SIN(K.coordx * PI() /180) + COS(K2.coordx * PI() /180) * COS(K.coordx * PI() /180) * COS((K2.coordy - K.coordy) * PI() /180)) *180 / PI()) *60 * 1.1515 * 1.609344) AS distance FROM tx_implantateadressen_adr AS F JOIN tx_implantateadressen_plz AS K ON K.plz=F.plz LEFT JOIN tx_implantateadressen_plz AS K2 ON K2.plz='01324' HAVING distance <= 100 ORDER BY distance
 
Wie du schon sagst ist die direkte Entfernungsberechnung in SQL leider sehr langsam.
Hab deshalb die Nachbearbeitung per PHP drin (in SQL nur linear).
Der Nachteil ist eben, dass du nicht mit einem SQL-Befehl deine Ärzte direkt bekommen kannst...
 
Zurück