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

Søg efter rækkevidde Latitude/Længdegrad koordinater

En eller anden version af det, du laver, er rigtig, men jeg tror, ​​du sandsynligvis vil bruge de faktiske geometrityper, især hvis du er på MyISAM og kan oprette et R-Tree rumligt indeks. Du kan have kolonner med enhver understøttet type (f.eks. point , polygon ), eller catchall geometry type:

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

Forespørg derefter og opdater med WKT-syntaks:

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 derefter lave din forespørgsel (dvs. nærhed), mod det mindste afgrænsende rektangel af en linjestreng med afsluttende punkter punkt1 =længdegrad - stigning, lon - stigning, y =længdegrad + stigning, breddegrad + stigning, dvs. her med en +- 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)

Dette vil fungere meget bedre end at lave aritmetik på en flok flydere, der repræsenterer længde- og breddegrad. BTW omkring placeringen af ​​San Francisco fungerer følgende konstanter ret godt til at konvertere mellem km og grader længde- og breddegrad (dvs. hvis du vil have rene kvadratiske kort over Santa Cruz):

lonf 0.01132221938
latf 0.0090215040

Det vil sige, (x +- 2*lonf, y +- 2*latf) giver dig den relevante $lat_floor osv. værdier for en 2 km bred dreng omkring dit interessepunkt.



  1. Smukke blokke af kedelplade

  2. Ugyldigt parameternummer:parameter blev ikke defineret Indsætter data

  3. Hvor fleksible/begrænsende er SQLite-kolonnetyper?

  4. Postgis installation:type geometri eksisterer ikke