Niektóre wersje tego, co robisz, są prawidłowe, ale myślę, że prawdopodobnie chcesz użyć rzeczywistych typów geometrii, zwłaszcza jeśli korzystasz z MyISAM i możesz utworzyć indeks przestrzenny R-Tree. Możesz mieć kolumny z dowolnym obsługiwanym typem (np. point
, polygon
) lub catchall geometry
typ:
mysql> create table spatial_table (id int, my_spots point, my_polygons geometry);
Query OK, 0 rows affected (0.06 sec)
Następnie zapytaj i zaktualizuj składnię 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)
Następnie możesz wykonać zapytanie (tj. sąsiedztwo) względem minimalnego prostokąta ograniczającego ciągu linii z punktami końcowymi point1 =długość geograficzna - przyrost, lon - przyrost, y =długość geograficzna + przyrost, szerokość geograficzna + przyrost, czyli tutaj z +- 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)
Będzie to działać znacznie lepiej niż wykonywanie arytmetyki na kilku pływakach reprezentujących długość i szerokość geograficzną. BTW w okolicach San Francisco następujące stałe działają całkiem dobrze przy przeliczaniu km na stopnie długości i szerokości geograficznej (tj. jeśli chcesz mieć czyste kwadratowe mapy Santa Cruz):
lonf 0.01132221938
latf 0.0090215040
Oznacza to, że (x +- 2*lonf, y +- 2*latf) daje odpowiednie $lat_floor
itp. wartości dla chłopca o szerokości 2 km wokół twojego punktu zainteresowania.