Khi tôi đã triển khai điều này trong MySQL (để lưu trữ các địa điểm trên một khối cầu, về cơ bản là trái đất (tôi cho rằng bạn đang nói về trái đất!)), Tôi đã lưu trữ càng nhiều thông tin được tính toán trước càng tốt trong cơ sở dữ liệu. Vì vậy, đối với một hàng lưu trữ latitude
và longitude
, Tôi cũng tính toán tại thời điểm chèn các trường sau:
-
radiansLongitude
(Math.toRadians(longitude)
) -
sinRadiansLatitude
(Math.sin(Math.toRadians(latitude)
) -
cosRadiansLatitude
(Math.cos(Math.toRadians(latitude)
)
Sau đó, khi tôi tìm kiếm các địa điểm nằm trong đơn vị X của latitude
/ longitude
trong câu hỏi, tuyên bố đã chuẩn bị của tôi như sau:
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
Nơi YYYY
=3965 cung cấp cho bạn khoảng cách tính bằng dặm hoặc YYYY
=6367 có thể được sử dụng cho khoảng cách tính bằng km.
Cuối cùng, tôi đã sử dụng maximumSearchLatitude
/ maximumSearchLongitude
/ minimumSearchLongitude
/ maximumSearchLongitude
các tham số để loại trừ phần lớn các điểm khỏi tập kết quả trước khi cơ sở dữ liệu phải thực hiện bất kỳ phép tính nào. Bạn có thể cần hoặc không. Nếu bạn sử dụng điều này, bạn sẽ tùy thuộc vào giá trị nào mà bạn chọn cho các thông số này, vì nó sẽ phụ thuộc vào những gì bạn đang tìm kiếm.
Rõ ràng là các ứng dụng hợp lý của các chỉ mục trong cơ sở dữ liệu sẽ là cần thiết.
Lợi ích của việc sử dụng phương pháp này là thông tin không bao giờ thay đổi nhưng cần thiết mỗi lần chỉ được tính một lần, trong khi tính toán các giá trị của radiansLongitude
, sinRadiansLatitude
, cosRadiansLatitude
cho mọi hàng mỗi khi bạn thực hiện tìm kiếm sẽ rất tốn kém rất nhanh.
Tùy chọn khác là sử dụng chỉ mục không gian địa lý , có nghĩa là tất cả những điều này sẽ được cơ sở dữ liệu xử lý cho bạn. Tôi không biết Hibernate tích hợp tốt như thế nào với điều đó.
Tuyên bố từ chối trách nhiệm:đã lâu rồi tôi không xem xét vấn đề này và tôi không phải là chuyên gia GIS!