Mysql
 sql >> Database >  >> RDS >> Mysql

Cerca le coordinate di latitudine/longitudine dell'intervallo

Alcune versioni di ciò che stai facendo sono giuste, ma penso che probabilmente vorrai usare i tipi di geometria effettivi, specialmente se sei su MyISAM e puoi creare un indice spaziale R-Tree. Puoi avere colonne con qualsiasi tipo supportato (ad esempio point , polygon ), o il catchall geometry digita:

mysql> create table spatial_table (id int, my_spots point, my_polygons geometry);
Query OK, 0 rows affected (0.06 sec)

Quindi interroga e aggiorna con la sintassi 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)

È quindi possibile eseguire la query (ad es. prossimità), rispetto al rettangolo di delimitazione minimo di una stringa lineare con punti terminali punto1 =longitudine - incremento, lon - incremento, y =longitudine + incremento, latitudine + incremento, cioè qui con un +- di 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)

Questo funzionerà molto meglio che fare aritmetica su un gruppo di float che rappresentano longitudine e latitudine. A proposito della posizione di San Francisco, le seguenti costanti funzionano abbastanza bene per la conversione tra km e gradi di longitudine e latitudine (ad esempio, se vuoi mappe quadrate pulite di Santa Cruz):

lonf 0.01132221938
latf 0.0090215040

Cioè, (x +- 2*lonf, y +- 2*latf) ti dà il relativo $lat_floor ecc valori per un ragazzo largo 2 km intorno al tuo punto di interesse.