Mysql
 sql >> база данни >  >> RDS >> Mysql

Какъв е най-добрият подход за намиране на всички адреси, които са на определено разстояние до избраната точка

Когато внедрих това в 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 се интегрира с това.

Отказ от отговорност:отдавна не съм гледал това и не съм експерт по ГИС!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете блог в PHP и MySQL база данни - Admin Posts

  2. Разрешаване на не ascii знаци в MySQL база данни

  3. Изберете потребители от една таблица само ако не и от друга

  4. 4 начина за изброяване на всички изгледи в MySQL

  5. Вмъкване на няколко реда с PDO