Die Konstante literal stellt eine Approximation des Radius der Erde, in Meilen. Deshalb gibt der Ausdruck "Großkreisabstand" einen Wert in Meilen zurück.
Um Entfernung in Kilometern zu bekommen, nur mit , eine Annäherung der Radius in km der Erde ersetzen.
Referenz: https://en.wikipedia.org/wiki/Great-circle_distance
Was die Abfrage tun, ist eine Entfernung der Berechnung (in Meilen) zwischen zwei Punkten auf der Erde, vertreten durch Breitengrad und Längengrad.
Einer der Punkte wird durch Literalwerte im GCD-Ausdruck (37,000000, -122,000000) dargestellt. Der andere Punkt ist (lat, lng) (Grad Breite und Grad Länge) von der Zeile in der Datenbank.
Die Abfrage durchläuft jede Zeile in der Tabelle und wertet den GCD-Ausdruck aus, um eine Entfernung zu berechnen. (Die Länge der kürzesten Linie entlang der Kugeloberfläche zwischen den beiden Punkten.)
Die Klausel HAVING distance < 25
schließt alle Zeilen aus, deren berechnete Entfernung größer oder gleich 25 oder NULL ist.
Die ORDER BY distance
-Klausel gibt die Zeilen in der Reihenfolge nach aufsteigenden Werten der Entfernung zurück, wobei die nächstgelegenen Punkte zuerst angezeigt werden.
Die Klausel LIMIT 20
beschränkt die Rückkehr zu den ersten zwanzig Zeilen.
Followup
Innerhalb von fünf Kilometern von was? Das Santa Monica Pier Aquarium?
Das ist Breitengrad 34.010396, Längengrad -118.496029.
SET @lat = 34.010396 ;
SET @lng = -118.496029 ;
Unser SQL-Text enthält in der SELECT-Liste die Spalten wir von unserem Tisch zurückkehren wollen:
Wir können benutzerdefinierte Variablen (zur Vermeidung von Literalen in unserem Abfragetext Verbreitung) eingestellt. Wir werden auch einen komplizierten Ausdruck "Großkreisentfernung" einfügen, der eine Entfernung in Kilometern zurückgibt.
etwas ähnliches:
SELECT m.school_id
, m.location_id
, m.school_name
, m.lat
, m.lng
, (ACOS(COS(RADIANS(@lat ))
* COS(RADIANS(m.lat))
* COS(RADIANS(m.lng) - RADIANS(@lng))
+ SIN(RADIANS(@lat ))
* SIN(RADIANS(m.lat))
)
* 6371
) AS distance_in_km
FROM mytable m
ORDER BY distance_in_km ASC
LIMIT 100
Die GCD Formel in der Expression einen Abstand zwischen zwei Punkten zu berechnen.
In dieser Abfrage ist einer der Punkte eine Konstante(@lat,@lng)
, die wir zuvor auf die Koordinaten des Santa Monica Pier Aquarium festgelegt haben.
Der andere Punkt ist (m.lat,m.lng)
, die Breite und Länge von der Zeile in der Tabelle.
In dieser Abfrage gibt distance_in_km
den Abstand zwischen (lat,lng)
der Reihe in der Tabelle und Santa Monica Pier Aquarium.
Da distance_in_km
Wert nicht, die zum Zeitpunkt der Zeilen zugegriffen werden, können wir verweisen nicht, dass in einer WHERE
Klausel.
Aber wir können es in einer HAVING
Klausel verweisen. Das ist ähnlich zu WHERE
in dem es Zeilen ausfiltert, aber es ist viel anders, weil es viel später in der Abfrageausführung ausgewertet wird. Und es kann Ausdrücke referenzieren, die nicht verfügbar sind, wenn auf die Zeilen zugegriffen wird, wenn die WHERE
-Klausel ausgewertet wird.
Wir können unsere Abfrage so modifizieren, dass sie die HAVING-Klausel enthält. In diesem Fall sind wir Begrenzung auf Zeilen, die im Umkreis von 100 Kilometern sind, und wir werden nur die nächsten 12 Zeilen zurück ...
FROM mytable m
HAVING distance_in_km <= 100
ORDER BY distance_in_km ASC
LIMIT 12
Wenn wir den Abstand zu einem gewissen Punkt anders als Santa finden wollen Monica Pier, setzen wir @lat
und @lng
für diesen Punkt, und führen Sie die SQL erneut aus.
setzen https://developers.google.com/maps/articles/phpsqlsearch_v3#finding-locations-with-mysql –
Yeah. Ich habe diesen Post schon gesehen. Aber ich verstehe nicht, was Radianten sind und wie kann ich diese Radianten bekommen. Bitte erläutern Sie mir den Code. –