-
Crie seus pontos usandoPoint
valores deGeometry
tipos de dados emMyISAM
tabela. A partir do Mysql 5.7.5,InnoDB
tabelas agora também suportamSPATIAL
índices.
-
Crie umSPATIAL
índice nestes pontos
-
UseMBRContains()
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)