sql >> Base de Datos >  >> RDS >> Mysql

Buscar rango de coordenadas de latitud/longitud

Alguna versión de lo que está haciendo es correcta, pero creo que probablemente quiera usar los tipos de geometría reales, especialmente si está en MyISAM y puede crear un índice espacial R-Tree. Puede tener columnas con cualquier tipo compatible (es decir, point , polygon ), o la geometry general tipo:

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

Luego consulta y actualiza con la sintaxis 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)

Luego puede hacer su consulta (es decir, vecindad), contra el rectángulo delimitador mínimo de una cadena lineal con puntos de terminación point1 =longitud - incremento, lon - incremento, y =longitud + incremento, latitud + incremento, es decir, aquí con un +- de 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)

Esto funcionará mucho mejor que hacer aritmética en un grupo de flotadores que representan la longitud y la latitud. Por cierto, aproximadamente en la ubicación de San Francisco, las siguientes constantes funcionan bastante bien para convertir entre kilómetros y grados de longitud y latitud (es decir, si desea mapas cuadrados limpios de Santa Cruz):

lonf 0.01132221938
latf 0.0090215040

Es decir, (x +- 2*lonf, y +- 2*latf) te da el $lat_floor relevante etc valores para un niño de 2 km de ancho alrededor de su punto de interés.