Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Maneira mais rápida de encontrar a distância entre dois pontos de latitude/longitude


  • Crie seus pontos usando Point valores de Geometry tipos de dados em MyISAM tabela. A partir do Mysql 5.7.5, InnoDB tabelas agora também suportam SPATIAL índices.

  • Crie um SPATIAL índice nestes pontos

  • Use MBRContains() para encontrar os 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)
    

, ou, em MySQL 5.1 e acima:
    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
                    )

Isso selecionará todos os pontos aproximadamente dentro da caixa (@lat +/- 10 km, @lon +/- 10km) .

Na verdade, isso não é uma caixa, mas um retângulo esférico:segmento de latitude e longitude da esfera. Isso pode ser diferente de um retângulo simples na Terra de Franz Joseph , mas bem próximo disso na maioria dos lugares habitados.

  • Aplique filtragem adicional para selecionar tudo dentro do círculo (não o quadrado)

  • Possivelmente aplique filtragem fina adicional para levar em conta a distância do círculo grande (para grandes distâncias)