您所做的某些版本是正确的,但我认为您可能想要使用实际的几何类型,特别是如果您在 MyISAM 上并且可以创建 R-Tree 空间索引。您可以拥有任何受支持类型的列(即point、polygon),或包罗万象的geometry 类型:
mysql> create table spatial_table (id int, my_spots point, my_polygons geometry);
Query OK, 0 rows affected (0.06 sec)
然后用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)
然后您可以针对具有终止点 point1 = 经度 - 增量,经度 - 增量,y = 经度 + 增量,纬度 + 增量的线串的最小边界矩形进行查询(即附近),即此处带有 + - 1:
mysql> select * from spatial_table where MBRContains(GeomFromText('LINESTRING(9 9, 11 11)'), my_spots);
+------+---------------------------+-----------------------------------------------------------------------------------+
| id | my_spots | my_polygons |
+------+---------------------------+-----------------------------------------------------------------------------------+
| 1 | $@ $@ | $@ $@ 4@ 4@ 4@ $@ $@ |
+------+---------------------------+-----------------------------------------------------------------------------------+
1 row in set (0.00 sec)
这将比在代表经度和纬度的一堆浮点数上执行算术要好得多。顺便说一句,在旧金山的位置,以下常量非常适合在公里和度经度和纬度之间进行转换(即,如果您想要圣克鲁斯的干净方形地图):
lonf 0.01132221938
latf 0.0090215040
也就是说,(x +- 2*lonf, y +- 2*latf) 为您的兴趣点周围 2 公里宽的男孩提供相关的 $lat_floor 等值。