Moin Leute,
seit 2 Tagen google ich mir einen Wolf und finde zwar einige Ansätze oder auch als korrekt betitelte Lösungen, aber wirklich funktionieren tun sie alle nicht und keiner kann mir sagen, wieso.
Es geht darum das ich eine DB habe mit ZIP, City, Lat, Lng
Ergo: Bestimmte Ort mit PLZ, Ort und Koordinaten.
Nun will ich (natürlich) eine Umkreis suche machen.
Man gibt eine PLZ ein und 5, 25 oder 50km, da Script geht ran und dann sollen alle PLZ ausgespuckt werden, die in den Radius passen. Aber: Es gibt Ergebnis = 0 ... nur ich verstehe einfach nicht, wo genau der Fehler liegt.
Das ist jetzt der ca. 10te Ansatz der SQL Query:
die reine, umgerechnete SQL Query sieht dann so aus:
Ich habe nun mehrere Vermutungen:
- Muss ich die Kilometer die den Radius angeben umrechnen?
- Kann es sein das der Erdradius nicht korrekt ist? (Da hab ich viele Verschiedene gesehen und jetzt den von Wikipedia genommen)
- Liegt ein grober Rechenfehler in der Formel vor?
Es wäre super, wenn da jemand Abhilfe schaffen könnte, bzw mir konstruktiv weiterhelfen könnte.
Grüße,
Jon
seit 2 Tagen google ich mir einen Wolf und finde zwar einige Ansätze oder auch als korrekt betitelte Lösungen, aber wirklich funktionieren tun sie alle nicht und keiner kann mir sagen, wieso.
Es geht darum das ich eine DB habe mit ZIP, City, Lat, Lng
Ergo: Bestimmte Ort mit PLZ, Ort und Koordinaten.
Nun will ich (natürlich) eine Umkreis suche machen.
Man gibt eine PLZ ein und 5, 25 oder 50km, da Script geht ran und dann sollen alle PLZ ausgespuckt werden, die in den Radius passen. Aber: Es gibt Ergebnis = 0 ... nur ich verstehe einfach nicht, wo genau der Fehler liegt.
Das ist jetzt der ca. 10te Ansatz der SQL Query:
PHP-Code:
$plz = $_POST['PLZ'];
$umkreis = $_POST['Umkreis'];
$radius = 6378.137;
# Lat und Lng der PLZ abfragen
$sql_rad = 'SELECT `Lng`, `Lat` FROM `geo_datenbank` WHERE `ZIP` = "'.$plz.'" LIMIT 1' ;
$sql_rad = mysql_query($sql_rad);
$erg_rad = mysql_fetch_object($sql_rad);
# Lat und Lng der PLZ umrechnen
$lon = $erg_rad->Lat / 180 * M_PI;
$lat = $erg_rad->Lng / 180 * M_PI;
# Abfrage der in Frage kommenden PLZ im Umkreis
$sql = "SELECT DISTINCT ZIP, (
".$radius." * SQRT(2*(1-cos(RADIANS(Lat)) *
cos(".$lat.") * (sin(RADIANS(Lng)) *
sin(".$lon.") + cos(RADIANS(Lng)) *
cos(".$lon.")) - sin(RADIANS(Lat)) * sin(".$lat.")))) AS Distance
FROM `geo_datenbank`
WHERE
".$radius." * SQRT(2*(1-cos(RADIANS(Lat)) *
cos(".$lat.") * (sin(RADIANS(Lng)) *
sin(".$lon.") + cos(RADIANS(Lng)) *
cos(".$lon.")) - sin(RADIANS(Lat)) * sin(".$lat."))) <= ".$umkreis."
ORDER BY Distance";
# Ausgabe der PLZ
$result = mysql_query($sql);
while($row = mysql_fetch_object($result) ) {
echo '<pre>', print_r($row), '</pre>';
}
PHP-Code:
SELECT DISTINCT ZIP, (
6378.137 * SQRT( 2 * ( 1 - COS( RADIANS( Lat ) ) * COS( 0.14873591165741 ) * (
SIN( RADIANS( Lng ) ) *
SIN( 0.9084227571791 ) +
COS( RADIANS( Lng ) ) * COS( 0.9084227571791 ) ) -
SIN( RADIANS( Lat ) ) * SIN( 0.14873591165741 ) )
)
) AS Distance
FROM `geo_datenbank`
WHERE 6378.137 * SQRT( 2 * ( 1 - COS( RADIANS( Lat ) ) *
COS( 0.14873591165741 ) * ( SIN( RADIANS( Lng ) ) * SIN( 0.9084227571791 ) +
COS( RADIANS( Lng ) ) * COS( 0.9084227571791 ) ) -
SIN( RADIANS( Lat ) ) * SIN( 0.14873591165741 ) ) ) <=5
ORDER BY Distance
- Muss ich die Kilometer die den Radius angeben umrechnen?
- Kann es sein das der Erdradius nicht korrekt ist? (Da hab ich viele Verschiedene gesehen und jetzt den von Wikipedia genommen)
- Liegt ein grober Rechenfehler in der Formel vor?
Es wäre super, wenn da jemand Abhilfe schaffen könnte, bzw mir konstruktiv weiterhelfen könnte.
Grüße,
Jon
Kommentar