Saya punya skrip PHP yang berfungsi yang mendapatkan nilai Bujur dan Latitude lalu memasukkannya ke dalam kueri MySQL. Saya ingin membuatnya hanya MySQL. Inilah kode PHP saya saat ini:
if ($distance != "Any" && $customer_zip != "") { //get the great circle distance
//get the origin zip code info
$zip_sql = "SELECT * FROM zip_code WHERE zip_code = '$customer_zip'";
$result = mysql_query($zip_sql);
$row = mysql_fetch_array($result);
$origin_lat = $row['lat'];
$origin_lon = $row['lon'];
//get the range
$lat_range = $distance/69.172;
$lon_range = abs($distance/(cos($details[0]) * 69.172));
$min_lat = number_format($origin_lat - $lat_range, "4", ".", "");
$max_lat = number_format($origin_lat + $lat_range, "4", ".", "");
$min_lon = number_format($origin_lon - $lon_range, "4", ".", "");
$max_lon = number_format($origin_lon + $lon_range, "4", ".", "");
$sql .= "lat BETWEEN '$min_lat' AND '$max_lat' AND lon BETWEEN '$min_lon' AND '$max_lon' AND ";
}
Adakah yang tahu cara membuat ini sepenuhnya MySQL? Saya sudah menjelajah internet sedikit, tetapi sebagian besar literatur tentangnya cukup membingungkan.
php
mysql
great-circle
Nick Woodham
sumber
sumber
Jawaban:
Dari Google Code FAQ - Membuat Pencari Lokasi Toko dengan PHP, MySQL & Google Maps :
sumber
markers
tabel dengan bidang id, lan dan lng.$greatCircleDistance = acos( cos($latitude0) * cos($latitude1) * cos($longitude0 - $longitude1) + sin($latitude0) * sin($latitude1));
dengan lintang dan bujur di radian.
begitu
adalah permintaan SQL Anda
untuk mendapatkan hasil Anda dalam Km atau mil, kalikan hasilnya dengan radius rata-rata Bumi (
3959
mil,6371
Km atau3440
mil laut)Hal yang Anda hitung dalam contoh Anda adalah kotak pembatas. Jika Anda memasukkan data koordinat Anda dalam kolom MySQL yang diaktifkan secara spasial , Anda dapat menggunakan fungsionalitas build in MySQL untuk meminta data.
sumber
Jika Anda menambahkan bidang pembantu ke tabel koordinat, Anda dapat meningkatkan waktu respons kueri.
Seperti ini:
Jika Anda menggunakan TokuDB, Anda akan mendapatkan kinerja yang lebih baik jika Anda menambahkan indeks pengelompokan pada salah satu predikat, misalnya, seperti ini:
Anda membutuhkan lat dasar dan lon dalam derajat dan juga dosa (lat) dalam radian, cos (lat) * cos (lon) dalam radian dan cos (lat) * sin (lon) dalam radian untuk setiap titik. Kemudian Anda membuat fungsi mysql, seperti ini:
Ini memberi Anda jarak.
Jangan lupa untuk menambahkan indeks pada lat / lon sehingga tinju pembatas dapat membantu pencarian alih-alih memperlambatnya (indeks sudah ditambahkan dalam kueri CREATE TABLE di atas).
Diberikan tabel lama dengan hanya koordinat lat / lon, Anda dapat mengatur skrip untuk memperbaruinya seperti ini: (php menggunakan meekrodb)
Kemudian Anda mengoptimalkan kueri yang sebenarnya untuk hanya melakukan perhitungan jarak ketika benar-benar diperlukan, misalnya dengan membatasi lingkaran (baik, oval) dari dalam dan luar. Untuk itu, Anda harus menghitung ulang beberapa metrik untuk kueri itu sendiri:
Mengingat persiapan itu, kueri berlangsung seperti ini (php):
JELASKAN pada kueri di atas mungkin mengatakan bahwa itu tidak menggunakan indeks kecuali ada cukup hasil untuk memicu seperti itu. Indeks akan digunakan ketika ada cukup data dalam tabel koordinat. Anda dapat menambahkan FORCE INDEX (lat_lon_idx) ke SELECT untuk membuatnya menggunakan indeks tanpa memperhatikan ukuran tabel, sehingga Anda dapat memverifikasi dengan EXPLAIN bahwa itu berfungsi dengan benar.
Dengan contoh kode di atas Anda harus memiliki implementasi pencarian objek yang berjalan dan dapat diukur berdasarkan jarak dengan kesalahan minimal.
sumber
Saya harus menyelesaikan ini secara terperinci, jadi saya akan membagikan hasilnya. Ini menggunakan
zip
tabel denganlatitude
danlongitude
tabel. Itu tidak tergantung pada Google Maps; Anda bisa mengadaptasinya ke tabel mana saja yang berisi lat / long.Lihat baris ini di tengah permintaan itu:
Ini mencari 30 entri terdekat di
zip
tabel dalam jarak 50.0 mil dari titik lat / long 42.81 / -70.81. Ketika Anda membuat ini menjadi sebuah aplikasi, di situlah Anda meletakkan titik Anda sendiri dan radius pencarian.Jika Anda ingin bekerja dalam kilometer daripada mil, ganti
69
ke111.045
dan ubah3963.17
ke6378.10
dalam kueri.Ini langganan lengkap. Saya harap ini membantu seseorang. http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/
sumber
Saya telah menulis prosedur yang dapat menghitung hal yang sama, tetapi Anda harus memasukkan garis lintang dan bujur di tabel masing-masing.
sumber
Saya tidak dapat mengomentari jawaban di atas, tetapi berhati-hatilah dengan jawaban @Pavel Chuchuva. Rumus itu tidak akan mengembalikan hasil jika kedua koordinat sama. Dalam hal ini, jarak adalah nol, dan sehingga baris itu tidak akan dikembalikan dengan rumus itu apa adanya.
Saya bukan ahli MySQL, tetapi ini sepertinya bekerja untuk saya:
sumber
ACOS(1)
0). Anda mungkin melihat masalah pembulatan dengan xaxis * xaxis + yaxis * yaxis + zaxis * zaxis keluar dari jangkauan untuk ACOS tetapi Anda tampaknya tidak menjaga hal itu?untuk jarak 25 km
sumber
Saya pikir implementasi javascript saya akan menjadi referensi yang bagus untuk:
sumber
menghitung jarak dalam Mysql
dengan demikian nilai jarak akan dihitung dan siapa pun dapat menerapkan seperti yang disyaratkan.
sumber