Saya memiliki garis lintang dan bujur dan saya ingin menarik catatan dari basis data, yang memiliki garis lintang dan bujur terdekat dari jarak, jika jarak itu lebih panjang dari yang ditentukan, maka jangan mengambilnya.
Struktur meja:
id
latitude
longitude
place name
city
country
state
zip
sealevel
mysql
sql
coordinates
geospatial
Basit
sumber
sumber
Jawaban:
di mana [starlat] dan [startlng] adalah posisi untuk mulai mengukur jarak.
sumber
Solusi Google:
Menciptakan Tabel
Saat Anda membuat tabel MySQL, Anda ingin memberi perhatian khusus pada atribut lat dan lng. Dengan kemampuan zoom Google Maps saat ini, Anda seharusnya hanya membutuhkan 6 digit presisi setelah desimal. Untuk menjaga ruang penyimpanan yang diperlukan untuk meja Anda minimum, Anda dapat menentukan bahwa atribut lat dan lng mengapung ukuran (10,6). Itu akan membiarkan bidang menyimpan 6 digit setelah desimal, ditambah hingga 4 digit sebelum desimal, misalnya -123.456789 derajat. Tabel Anda juga harus memiliki atribut id untuk dijadikan sebagai kunci utama.
Mengisi Tabel
Setelah membuat tabel, saatnya mengisinya dengan data. Data sampel yang disediakan di bawah ini adalah untuk sekitar 180 pizza yang tersebar di seluruh Amerika Serikat. Di phpMyAdmin, Anda dapat menggunakan tab IMPORT untuk mengimpor berbagai format file, termasuk CSV (nilai yang dipisahkan koma). Microsoft Excel dan Google Spreadsheets sama-sama mengekspor ke format CSV, sehingga Anda dapat dengan mudah mentransfer data dari spreadsheet ke tabel MySQL melalui mengekspor / mengimpor file CSV.
Menemukan Lokasi dengan MySQL
Untuk menemukan lokasi dalam tabel marker Anda yang berada dalam jarak radius tertentu dari garis lintang / bujur, Anda dapat menggunakan pernyataan SELECT berdasarkan rumus Haversine. Formula Haversine digunakan secara umum untuk menghitung jarak lingkaran besar antara dua pasang koordinat pada sebuah bola. Penjelasan matematis yang mendalam diberikan oleh Wikipedia dan diskusi yang baik tentang rumus yang berkaitan dengan pemrograman ada di situs Movable Type.
Inilah pernyataan SQL yang akan menemukan 20 lokasi terdekat yang berada dalam radius 25 mil ke 37, -122 koordinat. Ini menghitung jarak berdasarkan garis lintang / garis bujur dari baris itu dan garis lintang / garis bujur target, dan kemudian meminta hanya baris di mana nilai jaraknya kurang dari 25, memesan seluruh kueri berdasarkan jarak, dan membatasinya hingga 20 hasil. Untuk mencari menurut kilometer bukannya mil, ganti 3959 dengan 6371.
Yang ini adalah untuk menemukan garis lintang dan bujur dalam jarak kurang dari 28 mil.
Satu lagi adalah menemukan mereka dalam jarak antara 28 dan 29 mil:
https://developers.google.com/maps/articles/phpsqlsearch_v3#creating-the-map
sumber
HAVING distance < 25
kita menanyakan lokasi dalam radius 25 mil?Inilah solusi lengkap saya yang diterapkan dalam PHP.
Solusi ini menggunakan rumus Haversine seperti yang disajikan di http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL .
Perlu dicatat bahwa formula Haversine mengalami kelemahan di sekitar kutub. Jawaban ini menunjukkan bagaimana menerapkan formula Great Circle Distance untuk mengatasi ini, namun saya memilih untuk menggunakan Haversine karena itu cukup baik untuk tujuan saya.
Saya menyimpan lintang sebagai DECIMAL (10,8) dan bujur sebagai DECIMAL (11,8). Semoga ini bisa membantu!
showClosest.php
./assets/db/db.php
./assets/db/dbSettings.php
Dimungkinkan untuk meningkatkan kinerja dengan menggunakan prosedur tersimpan MySQL seperti yang disarankan oleh artikel "Geo-Distance-Search-with-MySQL" yang diposting di atas.
Saya memiliki database ~ 17.000 tempat dan waktu pelaksanaan kueri adalah 0,054 detik.
sumber
abs
harus dihapus. Tidak perlu mengambil nilai abs saat mengkonversi dari derajat ke radian, dan, bahkan jika Anda melakukannya, Anda melakukannya hanya pada salah satu lintang. Harap edit sehingga memperbaiki bug.69
dengan111,044736
(lupa bahwa dalam komentar di atas)Kalau-kalau Anda malas seperti saya, inilah solusi yang digabungkan dari ini dan jawaban lain pada SO.
sumber
bounding_distance
mewakili apa sebenarnya ? apakah nilai ini membatasi hasil hingga satu mil? jadi dalam hal ini akan mengembalikan hasil dalam 1 mil?Mudah;)
Cukup ganti koordinat dengan yang Anda butuhkan. Nilai harus disimpan sebagai ganda. Ini adalah contoh MySQL 5.x yang berfungsi.
Bersulang
sumber
dx+dy
Coba ini, ini menunjukkan titik terdekat ke koordinat yang disediakan (dalam jarak 50 km). Ini bekerja dengan sempurna:
Ubah saja
<table_name>
.<userLat>
dan<userLon>
Anda dapat membaca lebih lanjut tentang solusi ini di sini: http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/
sumber
Jawaban asli untuk pertanyaan itu bagus, tetapi versi yang lebih baru dari mysql (MySQL 5.7.6 on) mendukung kueri geo, jadi sekarang Anda dapat menggunakan fungsionalitas bawaan daripada melakukan kueri yang rumit.
Anda sekarang dapat melakukan sesuatu seperti:
Hasilnya dikembalikan dalam
meters
. Jadi, jika Anda inginKM
hanya menggunakan.001
bukan.000621371192
(yang untuk mil).Dokumen MySql ada di sini
sumber
ST_Distance_Sphere
tidak ada di instal host saya (mysql Ver 15.1 Distrib 10.2.23-MariaDB
). Saya membaca di suatu tempat untuk menggantikanST_Distance
tetapi jaraknya jauh.ST_Distance_Sphere
Anda sedang mencari hal-hal seperti formula haversine . Lihat di sini juga.
Ada yang lain tapi ini yang paling sering dikutip.
Jika Anda mencari sesuatu yang lebih kuat, Anda mungkin ingin melihat kemampuan GIS database Anda. Mereka mampu melakukan beberapa hal keren seperti memberi tahu Anda apakah suatu titik (Kota) muncul dalam poligon tertentu (Wilayah, Negara, Benua).
sumber
Periksa kode ini berdasarkan artikel Geo-Distance-Search-with-MySQL :
Contoh: cari 10 hotel terdekat ke lokasi saya saat ini dalam radius 10 mil:
sumber
sumber
Sepertinya Anda ingin melakukan pencarian tetangga terdekat dengan beberapa terikat pada jarak. SQL tidak mendukung hal seperti ini sejauh yang saya ketahui dan Anda perlu menggunakan struktur data alternatif seperti R-tree atau kd-tree .
sumber
Temukan Pengguna terdekat ke saya:
Jarak dalam meter
Berbasis di rumus Vincenty
saya punya tabel pengguna:
sql:
jari-jari bumi: 6371000 (dalam meter)
sumber
MS SQL Edition di sini:
sumber
Kedengarannya seperti Anda harus menggunakan PostGIS, SpatialLite, SQLServer2008, atau Oracle Spatial. Mereka semua dapat menjawab pertanyaan ini untuk Anda dengan SQL spasial.
sumber
Dalam kasus ekstrim pendekatan ini gagal, tetapi untuk kinerja, saya telah melewatkan trigonometri dan hanya menghitung kuadrat diagonal.
sumber
Masalah ini sama sekali tidak sulit, tetapi semakin rumit jika Anda perlu mengoptimalkannya.
Maksud saya adalah, apakah Anda memiliki 100 lokasi di basis data atau 100 juta? Itu membuat perbedaan besar.
Jika jumlah lokasi kecil, keluarkan mereka dari SQL dan ke dalam kode hanya dengan melakukan ->
Setelah Anda memasukkannya ke dalam kode, hitung jarak antara setiap lat / lon dan sumber asli Anda dengan rumus Haversine dan urutkan.
sumber