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

Selecione todos os pontos geoespaciais dentro de uma caixa delimitadora


Presumivelmente, os itens x e y em seus dados POINT em sua geometry coluna está em graus de latitude e longitude.

Para fazer essa pesquisa com eficiência no MySQL, você precisará de algumas coisas.
  • Uma tabela MyISAM (ou MySQL versão 5.7 e posterior e InnoDB ou MyISAM)
  • Uma qualificação NOT NULL em sua coluna de geometria
  • Um índice espacial ALTER TABLE flags ADD SPATIAL INDEX (coordinates)
  • Código para criar uma representação textual do retângulo que você deseja pesquisar
  • Uso das funções GeomFromText e MBRContains/MBRWithin em sua instrução SELECT.

Suponha que sua caixa lat/long seja um retângulo de um grau de extensão centrado em Catedral de Winchester (51.0606, -1.3131) . Você precisa de uma caixa delimitadora em torno desse ponto. Esta consulta MySQL irá gerar uma LINESTRING (texto) para uma linha que passa diagonalmente pela caixa delimitadora.
SELECT 
       CONCAT('LINESTRING(',
              latitude-0.5,' ',longitude-0.5,
              ',', 
              latitude+0.5 ,' ',longitude +0.5,
              ')') AS box
   FROM (
      SELECT 51.0606 AS latitude, -1.3131 AS longitude
   ) AS coord

A consulta te dá isso:
LINESTRING(50.5606 -1.8131,51.5606 -0.8131)

Você também pode usar o processamento de string em um idioma de host para criar um tipo semelhante de string de texto. O formato que você precisa é este.
 LINESTRING(lat1 long1, lat2 long2) 

Então você pode usá-lo para pesquisar sua tabela espacial da seguinte forma:
SELECT whatever, whatever 
  FROM flags
 WHERE MBRContains(
        GeomFromText( 'LINESTRING(50.5606 -1.8131,51.5606 -0.8131)' ),
        flags.coordinates)     

Isso irá explorar o índice espacial e encontrar cada linha de flags cujas coordenadas estão dentro da caixa delimitadora dessa linha diagonal.

Aqui está alguma documentação .

Se seus flags table contiver menos de algumas centenas de milhares de linhas, você poderá descobrir que uma tabela comum (não uma tabela espacial) com colunas de latitude e longitude (tipos de dados FLOAT, indexados) funciona bem e é mais fácil de desenvolver e depurar.

Eu escrevi um tutorial sobre essa técnica. http://www.plumislandmedia.net/mysql/haversine-mysql- local-proximo/