2009-06-12 7 views
1

SELECT Postleitzahl, lat, lng, truncate ( (Grad (acos (sin (Radiant (lat)) * sin (Radiant ('$ Breite.')) + cos (Radiant ('. $ Breite 'Radiant() (lat)) * cos) * cos (Radiant (lng - ('. $ Länge.'))) ) ) * 69,172), 2) als Entfernung VON myData
Diese Abfrage berechnet die Entfernung (in Meilen). Aber wenn ich bei Google Maps die Entfernung für den gleichen Längen- und Breitengrad überprüfe, stimmt mein Ergebnis nicht überein. Wenn die Entfernung etwa 10 Meilen ist, ist mein Ergebnis ein wenig genau, aber darüber wird es falsch (zum Beispiel zeigte mein Ergebnis 13 Meilen und Google zeigte 22 Meilen für die gleichen PLZ-Werte)Wie bekomme ich genaue oder (fast genaue) Entfernung zwischen zwei Orten? Mysql/PHP

Ich habe diese Abfrage von http://forums.mysql.com/read.php?23,3868,3868#msg-3868

Wie kann ich es genau bekommen? Irgendwelche Ideen? Danke für Hilfe.

UPDATE

versuchte ich @Blixt Code in PHP. Abgeholt 2 Probe Postleitzahlen und ihre Lats sehnt

//B28 9ET 
$lat1 = 52.418819; 
$long1 = -1.8481053; 

//CV5 8BX 
$lat2 = 52.4125573; 
$long2 = -1.5407743; 

$dtr = M_PI/180; 
$latA = $lat1 * $dtr; 
$lonA = $long1 * $dtr; 
$latB = $lat2 * $dtr; 
$lonB = $long2 * $dtr; 
$EarthRadius = 3958.76; //miles 
echo $distance = $EarthRadius * acos(cos($latA) * cos($latB) * cos($lonB - $lonA) + sin($latA) * sin($latB)); 

Ergebnisse:

Meine app - 12,95 Meilen

Google - 17,8 Meilen

Irgendwelche Ideen, wie man es richtig machen?

+0

Sind Sie sicher, dass Google bei der Berechnung von Entfernungen keine Straßen wie Straßen berücksichtigt? – 0scar

+0

hmm .. kann deswegen sein. Ich habe die Route in Google Maps überprüft. Gibt es irgendeine Formel, um Google etwas Ähnliches zu geben? – TigerTiger

+1

Es gibt keine Formel, um Straßen zu berücksichtigen, abgesehen von einer Art durchschnittlichem Abstand zwischen Vogel und Strecke, die in 99% der Fälle falsch ist. Sie müssen eine API verwenden, mit der Sie in diesem Fall die Straßenentfernung erhalten. Sehen Sie sich die Google Maps-API an: http://code.google.com/apis/maps/ – Blixt

Antwort

1

Werfen Sie einen Blick auf this source code. Als ich es mit verschiedenen anderen Messdiensten testete, schien es die gleichen Ergebnisse zu erzielen. Es ist C#, aber die Mathematik sollte leicht genug zu konvertieren sein.

Hier sind die relevanten Teile:

public const double EarthRadius = 6371.0072; // Kilometers 
//public const double EarthRadius = 3958.76; // Miles 

/* ... */ 

const double dtr = Math.PI/180; 
double latA = this.Latitude * dtr; 
double lonA = this.Longitude * dtr; 
double latB = other.Latitude * dtr; 
double lonB = other.Longitude * dtr; 

return GpsLocation.EarthRadius * Math.Acos(Math.Cos(latA) * Math.Cos(latB) * Math.Cos(lonB - lonA) + Math.Sin(latA) * Math.Sin(latB)); 

Hinweis: Die Erde nicht perfekt sphärisch ist, so verwendet die Konstanten unterscheiden. Es gibt keinen einfachen Weg, die Messungen wirklich exakt zu machen. Siehe Wikipedia.

+0

Vielen Dank für Ihre Antwort, Blixt. // B28 9ET $ lat1 = 52,418819; $ long1 = -1.8481053; // CV5 8BX $ lat2 = 52.4125573; $ long2 = -1.5407743; $ dtr = M_PI/180; $ latA = $ lat1 * $ dtr; $ lonA = $ long1 * $ dtr; $ latB = $ lat2 * $ dtr; $ lonB = $ long2 * $ dtr; $ EarthRadius = 3958,76; // Meilen echo $ distance = $ EarthRadius * acos (cos ($ latA) * cos ($ latB) * cos ($ lonB - $ lonA) + sin ($ latA) * sin ($ latB)); Ergebnis: meine app = 12.95 ~ Meilen Google = 17,8 Meilen - :-(- – TigerTiger

+0

oh tut Code zeigen .. Ich werde einfach meine Frage aktualisieren – TigerTiger

+0

@Blixt - für Sie möglich ist. um die obigen Werte in Ihrer Anwendung zu überprüfen Wenn ja, können Sie mir bitte mitteilen, welche Werte Sie erhalten – TigerTiger