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

Comparação de coordenadas no banco de dados


A melhor maneira de lidar com pesquisas de proximidade é começar com algum tipo de aproximação de retângulo delimitador e, a partir daí, ir até uma distância real de grande círculo entre as pessoas.

Contanto que suas latitudes não estejam muito próximas dos pólos, uma aproximação desleixada, mas viável, para a distância entre dois pontos é esta (em SQL):
GREATEST(ABS(lat1-lat2),ABS(long1-long2))

Se você quer ser mais preciso e sabe que só se importa com as pessoas que estão dentro, digamos, 10 km uma da outra, você pode usar uma pesquisa de retângulo delimitador como esta.
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))))

Isso funciona porque existem 111,045 km em um grau de latitude. Os termos de cosseno nos limites de longitude explicam o fato de que as linhas de latitude estão mais próximas à medida que você se aproxima dos pólos. Isso permite explorar índices MySQL em suas colunas latitude_from_table e longitude_from_table.

Depois de ter a proximidade da caixa delimitadora, você pode aplicar uma fórmula de distância do grande círculo. Aqui está o fundo sobre isso. http://www.plumislandmedia.net/mysql/haversine-mysql- local-proximo/

Para o tipo de aplicação que você está considerando, o ponto flutuante IEEE-488 de 32 bits é bastante preciso para suas coordenadas. Se os pontos que você está olhando estão muito próximos (menos de um km ou mais), você quer usar a fórmula de Vincenty (http://www.plumislandmedia.net/mysql/vicenty-great-circle-distance-formula/ ) em vez da chamada fórmula haversine mais comum (http://www.plumislandmedia.net/mysql/stored-function-haversine-distance-computation/ ).

Se o seu número de pessoas for muito acima de 300K, você pode considerar usar o esquema de indexação geoespacial do MySQL. Ele só funciona com tabelas MyISAM, mas é muito rápido em fazer pesquisas de retângulo delimitador. Veja aqui. http://www.plumislandmedia.net/mysql/haversine-mysql- local-proximo/