Mysql
 sql >> Base de données >  >> RDS >> Mysql

Le moyen le plus rapide de trouver la distance entre deux points lat/long

  • Créez vos points en utilisant Point valeurs de Geometry types de données dans MyISAM table. Depuis Mysql 5.7.5, InnoDB les tables prennent désormais également en charge SPATIAL indices.

  • Créer un SPATIAL index sur ces points

  • Utilisez MBRContains() pour trouver les valeurs :

      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)
    

, ou, en MySQL 5.1 et plus :

    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
                    )

Cela sélectionnera approximativement tous les points dans la case (@lat +/- 10 km, @lon +/- 10km) .

Ce n'est en fait pas une boîte, mais un rectangle sphérique :segment délimité par la latitude et la longitude de la sphère. Cela peut différer d'un simple rectangle sur la Franz Joseph Land , mais assez proche sur la plupart des lieux habités.

  • Appliquez un filtrage supplémentaire pour sélectionner tout ce qui se trouve à l'intérieur du cercle (pas le carré)

  • Appliquer éventuellement un filtrage fin supplémentaire pour tenir compte de la distance du grand cercle (pour les grandes distances)