Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Suche nach Breitengrad-/Längengradkoordinaten

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.