Frage Wählen Sie innerhalb von 20 Kilometern basierend auf Breite / Länge


Ich habe eine MySQL-Tabelle strukturiert wie im folgenden Beispiel:

POSTAL_CODE_ID|PostalCode|City|Province|ProvinceCode|CityType|Latitude|Longitude
7|A0N 2J0|Ramea|Newfoundland|NL|D|48.625599999999999|-58.9758
8|A0N 2K0|Francois|Newfoundland|NL|D|48.625599999999999|-58.9758
9|A0N 2L0|Grey River|Newfoundland|NL|D|48.625599999999999|-58.9758

Jetzt versuche ich, eine Abfrage zu erstellen, die Ergebnisse innerhalb ausgewählter Kilometer eines gesuchten Ortes auswählt

Also sagen wir, sie suchen nach "Grey River" und wählen "Alle Ergebnisse innerhalb von 20 Kilometern finden"

Es sollte natürlich "grauer Fluss" gewählt werden, aber es sollten auch alle Orte innerhalb von 20 Kilometern des grauen Flusses basierend auf den Breiten- und Längengraden ausgewählt werden.

Ich habe wirklich keine Ahnung, wie ich das machen soll. Ich habe auf der haversine Formel nachgelesen, aber habe keine Ahnung, wie man dies auf eine mysql SELECT anwenden kann.

jede Hilfe würde sehr geschätzt werden.


7
2017-08-02 22:50


Ursprung


Antworten:


SELECT  *
FROM    mytable m
JOIN    mytable mn
ON      ACOS(COS(RADIANS(m.latitude)) * COS(RADIANS(mn.latitude)) * COS(RADIANS(mn.longitude) - RADIANS(m.longitude)) + SIN(RADIANS(m.latitude)) * SIN(radians(mn.latitude))) <= 20 / 6371.0
WHERE   m.name = 'grey river'

Wenn dein Tisch ist MyISAM Vielleicht möchten Sie Ihre Punkte in einem nativen Geometrieformat speichern und ein SPATIAL Index darauf:

ALTER TABLE mytable ADD position POINT;

UPDATE  mytable
SET     position = POINT(latitude, longitude);

ALTER TABLE mytable MODIFY position NOT NULL;

CREATE SPATIAL INDEX sx_mytable_position ON mytable (position);

SELECT  *
FROM    mytable m
JOIN    mytable mn
ON      MBRContains
                (
                LineString
                        (
                        Point
                                (
                                X(m.position) - 0.009 * 20,
                                Y(m.position) - 0.009 * 20 / COS(RADIANS(X(m.position)))
                                ),
                        Point
                                (
                                X(m.position) + 0.009 * 20,
                                Y(m.position) + 0.009 * 20 / COS(RADIANS(X(m.position))
                                )
                        ),
                mn.position
                )
        AND ACOS(COS(RADIANS(m.latitude)) * COS(RADIANS(mn.latitude)) * COS(RADIANS(mn.longitude) - RADIANS(m.longitude)) + SIN(RADIANS(m.latitude)) * SIN(radians(mn.latitude))) <= 20 / 6371.0
WHERE   m.name = 'grey river'

9
2017-08-02 22:59



SELECT `s`.suburb_id,`s`.suburb_name,`s`.lat,`s`.long, (((acos(sin(($lat*pi()/180)) * sin((s.lat*pi()/180))+cos(($lat*pi()/180)) * cos((s.lat*pi()/180)) * cos((($long - s.long)*pi()/180))))*180/pi())*60*1.1515*1.609344) AS distance FROM (`mst_suburbs` as s) HAVING distance <= 20 ORDER BY `s`.suburb_id DESC

Diese Abfrage funktioniert für mich, um alle Lat, lange zwischen 12 km Entfernung zu bekommen. Ich habe mst_suburbs ist Mai Tabelle, die die lat und long Säule.$lat und $long sind meine zwei php Variable. und ich bin die gewünschte lat übergeben, um die nächste 12km lat lange Liste von der mst_suburb. Sie müssen nur den Namen der Spalte entsprechend Ihrer Tabelle ändern und den Lat übergeben, lang, um abzufragen.


1
2017-11-28 10:41



Es ist ein kleiner komplizierter Algorithmus, aber Hier ist ein Link zu einer Lösung


0
2017-08-02 22:54



Sie nehmen einfach Ihre Haversine-Formel und wenden sie so an:

SELECT   *,
         6371 * ACOS(SIN(RADIANS( $lat1 )) * SIN(RADIANS(`Latitude`)) +
         COS(RADIANS( $lat1 )) * COS(RADIANS(`Latitude`)) * COS(RADIANS(`Longitude`) -
         RADIANS( $lon1 ))) AS `distance`
FROM     `table`
WHERE    `distance` <= 20
ORDER BY `distance` ASC

Ersetzen $lat1 und $lon1 mit dem Längen- und Breitengrad, mit dem Sie vergleichen möchten.


0
2017-08-02 22:58