Certaines versions de ce que vous faites sont correctes, mais je pense que vous souhaitez probablement utiliser les types de géométrie réels, en particulier si vous êtes sur MyISAM et que vous pouvez créer un index spatial R-Tree. Vous pouvez avoir des colonnes avec n'importe quel type pris en charge (c'est-à-dire point
, polygon
), ou le fourre-tout geometry
saisissez :
mysql> create table spatial_table (id int, my_spots point, my_polygons geometry);
Query OK, 0 rows affected (0.06 sec)
Ensuite, interrogez et mettez à jour avec la syntaxe 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)
Vous pouvez ensuite faire votre requête (c'est-à-dire le voisinage), par rapport au rectangle de délimitation minimum d'une chaîne de lignes avec des points de terminaison point1 =longitude - incrément, lon - incrément, y =longitude + incrément, latitude + incrément, c'est-à-dire ici avec un +- 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)
Cela fonctionnera beaucoup mieux que de faire de l'arithmétique sur un tas de flotteurs représentant la longitude et la latitude. BTW à peu près à l'emplacement de San Francisco, les constantes suivantes fonctionnent assez bien pour la conversion entre les kilomètres et les degrés de longitude et de latitude (c'est-à-dire, si vous voulez des cartes carrées propres de Santa Cruz) :
lonf 0.01132221938
latf 0.0090215040
Autrement dit, (x +- 2*lonf, y +- 2*latf) vous donne le $lat_floor
pertinent etc valeurs pour un garçon de 2 km de large autour de votre point d'intérêt.