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

Pesquisar por coordenadas de alcance Latitude/Longitude


Alguma versão do que você está fazendo está correta, mas acho que você provavelmente deseja usar os tipos de geometria reais, especialmente se estiver no MyISAM e puder criar um índice espacial R-Tree. Você pode ter colunas com qualquer tipo suportado (ie point , polygon ), ou a geometry geral modelo:
mysql> create table spatial_table (id int, my_spots point, my_polygons geometry);
Query OK, 0 rows affected (0.06 sec)

Em seguida, consulte e atualize com a sintaxe WKT:
mysql> insert into spatial_table values (1, GeomFromText('POINT(1 1)'), GeomFromText('POLYGON((1 1, 2 2, 0 2, 1 1))'));
Query OK, 1 row affected (0.00 sec)

mysql> insert into spatial_table values (1, GeomFromText('POINT(10 10)'), GeomFromText('POLYGON((10 10, 20 20, 0 20, 10 10))') );
Query OK, 1 row affected (0.00 sec)

Você pode então fazer sua consulta (ou seja, vizinhança), contra o retângulo delimitador mínimo de uma cadeia de linhas com pontos de terminação point1 =longitude - incremento, lon - incremento, y =longitude + incremento, latitude + incremento, ou seja, aqui com +- de 1 :
mysql> select * from spatial_table where MBRContains(GeomFromText('LINESTRING(9 9, 11 11)'), my_spots);
+------+---------------------------+-----------------------------------------------------------------------------------+
| id   | my_spots                  | my_polygons                                                                       |
+------+---------------------------+-----------------------------------------------------------------------------------+
|    1 |              [email protected]      [email protected] |                    [email protected]      [email protected]      [email protected]      [email protected]              [email protected]      [email protected]      [email protected] |
+------+---------------------------+-----------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Isso terá um desempenho muito melhor do que fazer aritmética em um monte de flutuadores representando longitude e latitude. BTW na localização de São Francisco, as seguintes constantes funcionam muito bem para converter entre km e graus de longitude e latitude (ou seja, se você quiser mapas quadrados limpos de Santa Cruz):
lonf 0.01132221938
latf 0.0090215040

Ou seja, (x +- 2*lonf, y +- 2*latf) fornece o $lat_floor relevante etc valores para um menino de 2 km de largura em torno de seu ponto de interesse.