Eine Version dessen, was Sie tun, ist richtig, aber ich denke, Sie möchten wahrscheinlich die tatsächlichen Geometrietypen verwenden, insbesondere wenn Sie auf MyISAM sind und einen R-Tree-Raumindex erstellen können. Sie können Spalten mit jedem unterstützten Typ haben (z. B. point
, polygon
) oder die allgemeine geometry
Typ:
mysql> create table spatial_table (id int, my_spots point, my_polygons geometry);
Query OK, 0 rows affected (0.06 sec)
Dann mit WKT-Syntax abfragen und aktualisieren:
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)
Sie können dann Ihre Abfrage (d. h. Umgebung) gegen das minimale Begrenzungsrechteck einer Linienfolge mit Endpunkten Punkt1 =Länge - Schrittweite, Länge - Schrittweite, y =Länge + Schrittweite, Breite + Schrittweite, dh hier mit einem +- von 1, durchführen :
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)
Dies funktioniert viel besser als das Rechnen mit einer Reihe von Floats, die Längen- und Breitengrade darstellen. Übrigens, ungefähr am Ort von San Francisco funktionieren die folgenden Konstanten ziemlich gut zum Umwandeln zwischen km und Grad Längen- und Breitengrad (dh, wenn Sie saubere quadratische Karten von Santa Cruz wollen):
lonf 0.01132221938
latf 0.0090215040
Das heißt, (x +- 2*lonf, y +- 2*latf) gibt Ihnen den relevanten $lat_floor
usw. Werte für einen 2 km breiten Jungen um Ihren Point of Interest herum.