sql >> Databasteknik >  >> RDS >> Mysql

Sök efter intervall Latitud/Longitud-koordinater

Någon version av det du gör är rätt men jag tror att du förmodligen vill använda de faktiska geometrityperna, speciellt om du är på MyISAM och kan skapa ett R-Tree spatial index. Du kan ha kolumner med vilken typ som helst (t.ex. point). , polygon ), eller catchall geometry typ:

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

Fråga och uppdatera sedan med WKT-syntax:

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)

Du kan sedan göra din fråga (dvs. närhet), mot den minsta avgränsande rektangeln för en linjesträng med termineringspunkter punkt1 =longitud - inkrement, lon - inkrement, y =longitud + inkretangel, latitud + inkrement, dvs här med ett +- på 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)

Detta kommer att fungera mycket bättre än att göra aritmetik på ett gäng flottörer som representerar longitud och latitud. BTW på ungefär platsen för San Francisco fungerar följande konstanter ganska bra för att konvertera mellan km och grader longitud och latitud (dvs om du vill ha rena kvadratiska kartor över Santa Cruz):

lonf 0.01132221938
latf 0.0090215040

Det vill säga (x +- 2*lonf, y +- 2*latf) ger dig den relevanta $lat_floor etc värden för en 2 km bred pojke runt din intressanta plats.



  1. 2 sätt att få protokollet från ett Datetime-värde i Oracle Database

  2. Fel vid försök att migrera postgresql db till mysql med workbench

  3. kan inte ta bort objekt på grund av en främmande nyckel

  4. Konsekutiv PreparedStatement god praxis