sql >> Base de Datos >  >> RDS >> Mysql

La forma más rápida de encontrar la distancia entre dos puntos de latitud/longitud

  • Crea tus puntos usando Point valores de Geometry tipos de datos en MyISAM mesa. A partir de Mysql 5.7.5, InnoDB las tablas ahora también son compatibles con SPATIAL índices.

  • Crear un SPATIAL índice sobre estos puntos

  • Usa MBRContains() para encontrar los valores:

      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)
    

o, en MySQL 5.1 y superiores:

    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
                    )

Esto seleccionará todos los puntos aproximadamente dentro del cuadro (@lat +/- 10 km, @lon +/- 10km) .

En realidad, esto no es una caja, sino un rectángulo esférico:segmento de la esfera con límites de latitud y longitud. Esto puede diferir de un rectángulo simple en Franz Joseph Land , pero bastante cerca de él en la mayoría de los lugares habitados.

  • Aplicar filtrado adicional para seleccionar todo lo que está dentro del círculo (no el cuadrado)

  • Posiblemente, aplique un filtrado fino adicional para tener en cuenta la distancia del círculo grande (para distancias grandes)