Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Koordinatenvergleich in Datenbank

Der beste Weg, Näherungssuchen zu handhaben, besteht darin, mit einer Art Begrenzungsrechteck-Annäherung zu beginnen und dann von dort zu einer tatsächlichen Großkreisentfernung zwischen Personen zu gehen.

Solange Ihre Breiten nicht zu nahe an den Polen liegen, ist eine schlampige, aber praktikable Annäherung für die Entfernung zwischen zwei Punkten (in SQL):

GREATEST(ABS(lat1-lat2),ABS(long1-long2))

Wenn Sie genauer sein möchten und wissen, dass Sie sich nur für Personen interessieren, die sich innerhalb von, sagen wir, 10 km voneinander befinden, können Sie eine Suche mit Begrenzungsrechtecken wie dieser verwenden.

WHERE latitude_from_table
    BETWEEN latpoint  - (10.0 / 111.045)
        AND latpoint  + (10.0 / 111.045)
  AND longitude_from_table
    BETWEEN longpoint - (10.0 / (111.045 * COS(RADIANS(latpoint))))
        AND longpoint + (10.0 / (111.045 * COS(RADIANS(latpoint))))

Das funktioniert, weil ein Breitengrad 111,045 km hat. Die Kosinusterme in den Längengradgrenzen berücksichtigen die Tatsache, dass die Breitengrade näher beieinander liegen, wenn Sie sich den Polen nähern. Dadurch können Sie MySQL-Indizes für Ihre latitude_from_table- und longitude_from_table-Spalten ausnutzen.

Sobald Sie die Begrenzungsrahmen-Nähe haben, können Sie eine Großkreis-Entfernungsformel anwenden. Hier ist der Hintergrund dazu. http://www.plumislandmedia.net/mysql/haversine-mysql- nächster-ort/

Für die Art von Anwendung, die Sie in Betracht ziehen, ist 32-Bit-IEEE-488-Gleitkommazahl ausreichend genau für Ihre Koordinaten. Wenn die Punkte, die Sie betrachten, sehr nahe beieinander liegen (weniger als etwa einen Kilometer), können Sie die Vincenty-Formel verwenden (http://www.plumislandmedia.net/mysql/vicenty-great-circle-distance-formula/ ) und nicht die gebräuchlichere sogenannte Haversine-Formel (http://www.plumislandmedia.net/mysql/stored-function-haversine-distance-computation/ ).

Wenn Ihre Anzahl von Personen weit über 300.000 hinausgeht, sollten Sie die Verwendung des Geodaten-Indizierungsschemas von MySQL in Betracht ziehen. Es funktioniert nur mit MyISAM-Tabellen, aber es ist sehr schnell bei der Durchführung von Bounding-Rectangle-Suchen. Siehe hier. http://www.plumislandmedia.net/mysql/haversine-mysql- nächster-ort/