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

Der schnellste Weg, um die Entfernung zwischen zwei Lat/Long-Punkten zu ermitteln

  • Erstellen Sie Ihre Punkte mit Point Werte von Geometry Datentypen in MyISAM Tisch. Ab MySQL 5.7.5, InnoDB Tabellen unterstützen jetzt auch SPATIAL Indizes.

  • Erstellen Sie einen SPATIAL Index zu diesen Punkten

  • Verwenden Sie MBRContains() um die Werte zu finden:

      SELECT  *
      FROM    table
      WHERE   MBRContains(LineFromText(CONCAT(
              '('
              , @lon + 10 / ( 111.1 / cos(RADIANS(@lat)))
              , ' '
              , @lat + 10 / 111.1
              , ','
              , @lon - 10 / ( 111.1 / cos(RADIANS(@lat)))
              , ' '
              , @lat - 10 / 111.1 
              , ')' )
              ,mypoint)
    

, oder in MySQL 5.1 und höher:

    SELECT  *
    FROM    table
    WHERE   MBRContains
                    (
                    LineString
                            (
                            Point (
                                    @lon + 10 / ( 111.1 / COS(RADIANS(@lat))),
                                    @lat + 10 / 111.1
                                  ),
                            Point (
                                    @lon - 10 / ( 111.1 / COS(RADIANS(@lat))),
                                    @lat - 10 / 111.1
                                  ) 
                            ),
                    mypoint
                    )

Dadurch werden alle Punkte ungefähr innerhalb des Felds (@lat +/- 10 km, @lon +/- 10km) ausgewählt .

Dies ist eigentlich kein Kasten, sondern ein kugelförmiges Rechteck:Breiten- und Längengrad gebundenes Segment der Kugel. Diese kann auf dem Franz-Joseph-Land von einem einfachen Rechteck abweichen , aber ziemlich nahe an den meisten bewohnten Orten.

  • Wenden Sie eine zusätzliche Filterung an, um alles innerhalb des Kreises auszuwählen (nicht das Quadrat)

  • Wenden Sie möglicherweise eine zusätzliche Feinfilterung an, um die Entfernung des großen Kreises zu berücksichtigen (für große Entfernungen)