Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Jarak geolokasi SQL dari tabel kota

Jika Anda dapat membatasi jarak maksimum antara kota Anda dan posisi lokal Anda, manfaatkan fakta bahwa satu menit garis lintang (utara - selatan) adalah satu mil laut.

Letakkan indeks di tabel lintang Anda.

Jadikan diri Anda fungsi tersimpan haversine(lat1, lat2, long1, long2, unit) dari rumus haversine yang ditunjukkan dalam pertanyaan Anda. Lihat di bawah

Kemudian lakukan ini, dengan garis lintang, garis bujur, dan mykm.

SELECT * 
  from cities a
 where :mylatitude >= a.latitude  - :mykm/111.12
   and :mylatitude <= a.latitude  + :mykm/111.12
   and haversine(:mylatitude,a.latitude,:mylongitude,a.longitude, 'KM') <= :mykm
 order by haversine(:mylatitude,a.latitude,:mylongitude,a.longitude, 'KM')

Ini akan menggunakan kotak pembatas garis lintang untuk secara kasar mengesampingkan kota-kota yang terlalu jauh dari titik Anda. DBMS Anda akan menggunakan pemindaian rentang indeks pada indeks lintang Anda untuk dengan cepat memilih baris di tabel kota Anda yang layak dipertimbangkan. Kemudian ia akan menjalankan fungsi haversine Anda, fungsi dengan semua matematika sinus dan kosinus, hanya pada baris tersebut.

Saya menyarankan garis lintang karena jarak garis bujur di lapangan bervariasi dengan garis lintang.

Perhatikan ini mentah. Ini bagus untuk pencari toko, tetapi jangan menggunakannya jika Anda seorang insinyur sipil -- bumi memiliki bentuk elips dan ini menganggapnya melingkar.

(Maaf tentang angka ajaib 111,12. Itu adalah jumlah km dalam derajat lintang, yaitu dalam enam puluh mil laut.)

Lihat di sini untuk fungsi jarak yang bisa diterapkan.

Mengapa fungsi tersimpan MySQL ini memberikan hasil yang berbeda dengan melakukan perhitungan dalam kueri?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. konektor mysql cpp di centos 6 referensi tidak terdefinisi ke

  2. XAMPP/MySQL:tidak dapat membuka file tablespace tabel tunggal .\mysql\innodb_index_stats.ibd setelah restart MySQL

  3. MySQL - cara mengelompokkan jam, diimbangi dengan 30 menit

  4. mySQL regex di klausa where

  5. Bagaimana cara mendapatkan daftar pinggiran kota di sekitar lokasi lalu ulangi untuk lokasi lain menggunakan MySql?