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.