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!