Cara tercepat untuk melakukannya adalah dengan menggunakan ekstensi geospasial untuk MySQL, yang seharusnya cukup mudah karena Anda sudah menggunakan tabel MyISAM. Dokumentasi untuk ekstensi ini dapat ditemukan di sini:http:/ /dev.mysql.com/doc/refman/5.6/en/spatial-extensions.html
Tambahkan kolom baru dengan tipe data POINT:
ALTER TABLE `adverts`
ADD COLUMN `geopoint` POINT NOT NULL AFTER `longitude`
ADD SPATIAL KEY `geopoint` (`geopoint`)
Anda kemudian dapat mengisi kolom ini dari bidang lintang dan bujur yang ada:
UPDATE `adverts`
SET `geopoint` = GeomFromText(CONCAT('POINT(',`latitude`,' ',`longitude`,')'));
Langkah selanjutnya adalah membuat bounding box berdasarkan input latitude dan longitude yang akan digunakan pada WHERE
Anda klausa sebagai CONTAINS
paksaan. Anda perlu menentukan satu set X,Y POINT
koordinat yang sesuai dengan kebutuhan Anda berdasarkan area pencarian yang diinginkan dan titik awal yang diberikan.
Permintaan terakhir Anda akan mencari semua POINT
data yang ada dalam pencarian Anda POLYGON
, dan Anda kemudian dapat menggunakan penghitungan jarak untuk menyaring dan mengurutkan data lebih lanjut:
SELECT a.*,
ROUND( SQRT( ( ( (adverts.latitude - '53.410778') * (adverts.latitude - '53.410778') ) * 69.1 * 69.1 ) + ( (adverts.longitude - '-2.97784') * (adverts.longitude - '-2.97784') * 53 * 53 ) ), 1 ) AS distance
FROM adverts a
WHERE a.type_id = 3
AND CONTAINS(a.geopoint, GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'))
HAVING distance < 25
ORDER BY distance DESC
LIMIT 0, 30
Perhatikan bahwa GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))')
di atas akan tidak berfungsi , Anda harus mengganti koordinat dengan titik yang valid di sekitar awal pencarian Anda. Jika Anda memperkirakan lintang/bujur akan berubah, Anda harus mempertimbangkan untuk menggunakan pemicu untuk mempertahankan POINT
data dan SPATIAL KEY
yang terkait terkini. Dengan kumpulan data yang besar, Anda akan melihat peningkatan kinerja yang jauh lebih baik daripada menghitung jarak untuk setiap catatan dan memfilter menggunakan HAVING
ayat. Saya secara pribadi mendefinisikan fungsi untuk digunakan dalam menentukan jarak dan membuat POLYGON
bound pembatas .