2016-06-13 21 views
0

Ich teste verschiedene Formeln aus, um bestimmte Punkte auf der Erde innerhalb eines gegebenen Radius von einer gegebenen Breite/Länge zu finden. Ich habe das 'sphärische Kosinusgesetz' benutzt und was ich für eine Implementierung von Haversine halte.hairsine/sphärisches Gesetz von cosines/vincenty in sql query

Für die folgenden Formeln sind dies die Variablen:

[$ lat/$ lon] = Entstehungsort

[Breite/Länge] = zweiter Punkt

[$ radius] = Radius

Spherical Kosinussatz

3959 * acos(cos(radians('.$lat.')) * cos(radians(latitude)) * cos(radians(longitude) - radians('.$lon.')) + sin(radians('.$lat.')) * sin(radians(latitude)))) <= '.$radius.'; 

Haversine (zumindest ich denke, es ist!)

3959*3.1415926*sqrt((latitude-'.$lat.')*(latitude-'.$lat.') + cos(latitude/57.29578)*cos('.$lat.'/57.29578)*(longitude-'.$lon.')*(longitude-'.$lon.'))/180) <= '.$radius.';'; 

ich auf einer Vielzahl von Informationen zunächst kam sagen, dass Haversine der Goldstandard soweit Genauigkeit ist. Es scheint jedoch auch die Meinung zu bestehen, dass das sphärische Kosinussatz genauer ist als das von Haversine, solange die gemessene Entfernung mehr als 5 Meter beträgt. Außerdem sagen manche, dass Vincenty sowohl in Genauigkeit als auch in Trumpf übertrumpfen soll.

Drei Fragen:

Ist mein Haversine Formel tatsächlich Haversine oder es etwas anderes?

Irgendwelche Gedanken, die für genaueste gewinnt?

Kann mir jemand eine Formulierung für Vincenty entlang der Linien der oben genannten forumlas zur Verfügung stellen?

danke!

Antwort

-1

Meine Antwort wird seine spezifische für Ihre erste und zweite Antwort

Q1: Ist meine Haversine Formel tatsächlich Haversine oder es etwas anderes?

I Don nicht Ihre Haversine Formel verstehen Sie haben es geschafft Der Schreib eine oder genau die SQL-Abfrage für Haversine Formel ist, dass Von Google Developer-Site Click Here For Details

SELECT id, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20; 

Diese SQL-Anweisung, die am nächsten finden 20 Orte innerhalb eines Radius von 25 Meilen zur 37, -122-Koordinate. Er berechnet die Entfernung basierend auf dem Breiten-/Längengrad dieser Zeile und der Zielbreite/-länge und fragt dann nur nach Zeilen, bei denen der Abstandswert kleiner als 25 ist, sortiert die gesamte Abfrage nach Entfernung und begrenzt sie auf 20 Ergebnisse. Um nach Kilometern anstelle von Meilen zu suchen, ersetzen Sie 3959 durch 6371.

Sie können Ihre Änderungen für diese SQL-Abfrage vornehmen, um genau das zu sein, was Sie möchten.

Q2: Irgendwelche Gedanken, die für am genauesten gewinnt?

Es gibt keine endgültige Antwort für wer kann gewinnen ?!Aber wir können damit umgehen:

1.Haversine ist schneller.

2.Sphärisches Kosinusgesetz ist für kleine Entfernungen genauer.

Und über Q3 weiß ich, dass die Vincenty Formel die genaueste ist, aber es ist die langsamste

+0

Q1: Ihre empfohlene Formel mit 'SELECT id beginnt, (3959 * acos (' ... die 'acos' Marken es als sphärische Kosinussatz Formel, auf jeden Fall nicht die Haversine Formel Q2.1 hairsine ist NICHT schneller Q2.2 sphärisches Gesetz der Kosinus ist weniger genau über kleine Unterschiede. –

0

Ihre so genannte Haversine Formel ist völlig falsch.

Erstens enthält es 7 linke Klammern und 8 rechte Klammern.

Zweitens Umwandlung von Grad zu Radianten wird in einigen Fällen durch dividiert durch 57.29578 dann gibt es eine Konstante Pi auf der Vorderseite und eine Konstante 180 auf der Rückseite.

Drittens haversine(x) = sin(x/2) ** 2 und ich sehe die / 2 nirgendwo.

Viertens sollte ein Funktionsaufruf asin in der Nähe der Front sein.

Richtige Formel here