2017-03-21 8 views
2

Ich habe die Datenbank wie unten Struktur. Und wie bekomme ich location_id in der Liste innerhalb von 5 Kilometern. Es gibt Längen- und Breitenzahlen, die sich bereits in der Datenbanktabelle befinden. Bitte sehen Sie sich mein Datenbankstrukturbild an.Wie in der Nähe suchen Ort mit Kilometer in MySQL

- school_id 
- location_id 
- school_name 
- lat 
- lng 

Hier ist die Datenbankstruktur Bild:

enter image description here

ich schon von diesem Link How to find nearest location using latitude and longitude from sql database? gesucht und ich verstehe nicht, den Code.

SELECT ID, (3959 * acos (cos (radians (37)) * cos (radians (LAT)) * cos (radians (lng) - radians (-122)) + sin (radians (37)) * sin ( Radiant (lat)))) AS Abstand FROM Marker HAVING Abstand ORDER BY Abstand LIMIT 0, 20;

+0

setzen https://developers.google.com/maps/articles/phpsqlsearch_v3#finding-locations-with-mysql –

+0

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. –

Antwort

3

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.

+0

ich bin die gleiche Frage und benutze es für meine gis Standorte, die ich habe und das funktioniert richtig danke @ spencer7593 –

0

Wenn ich ein ähnliches Problem gelöst habe, anstatt mir Sorgen über die Krümmung der Erde und Winkel. Ich habe nur die pythagoräische Distanz benutzt. Es ist eine nahe genug Annäherung IMHO.

, d. H. Alle Schulen, die sich in ungefähr 5 km Pythagoreischen Entfernungen befinden.

select sqrt(pow(lat - curlat,2) + pow(lng - curlng,2)) as distance from markers having distance < XXXXX 

Sie müssen den ungefähren Wert für XXXX berechnen. Ich Grad ist ungefähr 111km. Wenn Sie keine extremen Breitengrade machen, sollten Sie sich keine Sorgen darüber machen, sie anzupassen. So können Sie XXXX auf 0,045

+0

Da Längenlinien vom Äquator weg konvergieren, wenn Sie diese Technik verwenden, zieht der Pythagoreische Abstand zu viele Punkte ein. –

Verwandte Themen