Beberapa versi dari apa yang Anda lakukan benar, tetapi saya pikir Anda mungkin ingin menggunakan tipe geometri yang sebenarnya, terutama jika Anda menggunakan MyISAM dan dapat membuat indeks spasial R-Tree. Anda dapat memiliki kolom dengan jenis yang didukung (yaitu point
, polygon
), atau geometry
catch catchall ketik:
mysql> create table spatial_table (id int, my_spots point, my_polygons geometry);
Query OK, 0 rows affected (0.06 sec)
Kemudian kueri dan perbarui dengan sintaks 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)
Anda kemudian dapat melakukan kueri Anda (yaitu sekitar), terhadap persegi panjang pembatas minimum dari linestring dengan titik akhir point1 =bujur - kenaikan, lon - kenaikan, y =bujur + kenaikan, lintang + kenaikan, yaitu di sini dengan +- dari 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)
Ini akan berkinerja jauh lebih baik daripada melakukan aritmatika pada sekelompok pelampung yang mewakili garis bujur dan garis lintang. BTW di sekitar lokasi San Francisco, konstanta berikut bekerja cukup baik untuk mengkonversi antara km dan derajat bujur dan lintang (yaitu, jika Anda ingin peta persegi bersih Santa Cruz):
lonf 0.01132221938
latf 0.0090215040
Artinya, (x +- 2*lonf, y +- 2*latf) memberi Anda $lat_floor
yang relevan dll nilai untuk anak laki-laki selebar 2 km di sekitar tempat tujuan Anda.