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

Apa pendekatan terbaik untuk menemukan semua alamat yang berada dalam jarak tertentu ke titik yang dipilih?

Ketika saya telah menerapkan ini di MySQL (untuk menyimpan tempat pada bola oblate, yang pada dasarnya adalah bumi (saya berasumsi Anda sedang berbicara tentang bumi!)), saya telah menyimpan sebanyak mungkin informasi yang telah dihitung sebelumnya dalam database. Jadi, untuk baris yang menyimpan latitude dan longitude , saya juga menghitung pada waktu penyisipan bidang berikut:

  • radiansLongitude (Math.toRadians(longitude) )
  • sinRadiansLatitude (Math.sin(Math.toRadians(latitude) )
  • cosRadiansLatitude (Math.cos(Math.toRadians(latitude) )

Kemudian ketika saya mencari tempat-tempat yang berada dalam X unit latitude /longitude yang dimaksud, pernyataan yang saya siapkan adalah sebagai berikut:

from Location l where
    acos(
        sin(:latitude) * sinRadiansLatitude + 
        cos(:latitude) * cosRadiansLatitude * 
        cos(radiansLongitude - :longitude) 
        ) * YYYY < :distance
    and l.latitude>:minimumSearchLatitude
    and l.latitude<:maximumSearchLatitude 
    and l.longitude>:minimumSearchLongitude 
    and l.longitude<:maximumSearchLongitude 
    order by acos(
                sin(:latitude) * sinRadiansLatitude + 
                cos(:latitude) * cosRadiansLatitude * 
                cos(radiansLongitude - :longitude)  
        ) * YYYY asc

Dimana YYYY =3965 memberi Anda jarak dalam mil atau YYYY =6367 dapat digunakan untuk jarak dalam km.

Akhirnya, saya telah menggunakan maximumSearchLatitude / maximumSearchLongitude / minimumSearchLongitude / maximumSearchLongitude parameter untuk mengecualikan sebagian besar poin dari hasil sebelum database harus melakukan perhitungan apa pun. Anda mungkin atau mungkin tidak membutuhkan ini. Jika Anda menggunakan ini, terserah Anda nilai apa yang Anda pilih untuk parameter ini, karena akan bergantung pada apa yang Anda cari.

Jelas aplikasi indeks yang bijaksana dalam database akan diperlukan.

Manfaat menggunakan pendekatan ini adalah informasi yang tidak pernah berubah tetapi dibutuhkan setiap saat hanya dihitung satu kali, sedangkan menghitung nilai radiansLongitude , sinRadiansLatitude , cosRadiansLatitude untuk setiap baris setiap kali Anda melakukan penelusuran akan menjadi sangat mahal dengan sangat cepat.

Opsi lainnya adalah menggunakan indeks geospasial , yang berarti bahwa semua ini ditangani untuk Anda oleh database. Saya tidak tahu seberapa baik Hibernate terintegrasi dengan itu.

Penafian:sudah lama sejak saya melihat ini, dan saya bukan ahli GIS!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menghubungkan database MySql dengan Firebase?

  2. MySQL - Temukan poin dalam radius dari database

  3. Kinerja MySQL:Pengantar GABUNG dalam SQL

  4. alat pengujian beban mysql

  5. Permintaan untuk menemukan tabel yang dimodifikasi dalam satu jam terakhir