Някаква версия на това, което правите, е правилна, но мисля, че вероятно искате да използвате действителните типове геометрия, особено ако сте на 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 =дължина - приращение, lon - приращение, y =дължина + приращение, ширина + приращение, т.е. тук с +- от 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)
Това ще работи много по-добре, отколкото да правите аритметика върху куп плаващи числа, представляващи дължина и ширина. BTW около местоположението на Сан Франциско следните константи работят доста добре за преобразуване между км и градуси дължина и ширина (т.е., ако искате чисти квадратни карти на Санта Круз):
lonf 0.01132221938
latf 0.0090215040
Тоест (x +- 2*lonf, y +- 2*latf) ви дава съответния $lat_floor
и т.н. стойности за момче с ширина 2 км около вашата точка на интерес.