Когато внедрих това в MySQL (за съхраняване на места върху сплесната сфера, което по същество е това, което е земята (предполагам, че говорите за земя!)), съхраних възможно най-много предварително изчислена информация в базата данни. И така, за ред, който съхранява latitude
и longitude
, също така изчислявам по време на вмъкване следните полета:
radiansLongitude
(Math.toRadians(longitude)
)sinRadiansLatitude
(Math.sin(Math.toRadians(latitude)
)cosRadiansLatitude
(Math.cos(Math.toRadians(latitude)
)
След това, когато търся местата, които са в рамките на X единици от latitude
/longitude
въпросното подготвено изявление е следното:
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
Където YYYY
=3965 ви дава разстояния в мили или YYYY
=6367 може да се използва за разстояния в км.
И накрая, използвах maximumSearchLatitude
/ maximumSearchLongitude
/ minimumSearchLongitude
/ maximumSearchLongitude
параметри за изключване на по-голямата част от точките от набора от резултати, преди базата данни да извърши каквито и да е изчисления. Може да имате нужда от това или да не. Ако все пак използвате това, от вас зависи какви стойности ще изберете за тези параметри, тъй като това ще зависи от това, което търсите.
Очевидно ще са необходими разумни приложения на индекси в базата данни.
Ползата от използването на този подход е, че информацията, която никога не се променя, но е необходима всеки път, се изчислява само веднъж, докато изчисляването на стойностите на radiansLongitude
, sinRadiansLatitude
, cosRadiansLatitude
за всеки ред всеки път, когато извършвате търсене, ще стане много скъпо и много бързо.
Другата опция е да използвате геопространствен индекс , което означава, че всичко това се обработва вместо вас от базата данни. Не знам обаче колко добре Hibernate се интегрира с това.
Отказ от отговорност:отдавна не съм гледал това и не съм експерт по ГИС!