2016-04-14 7 views
9

Próbuję obliczyć daną długość/długość z odległością, i tylko zwracając wiersze, które wchodzą w tym dystansie kołowym (Baza danych ma również współrzędne długie/długie). Nie mam pojęcia, jak to zrobiłbym. Obecnie używam Native SQL i mam zwykły tekst z formułą haversine, która to oblicza, a jeśli mam rację, nie jest możliwe wykonanie formuły haversine za pomocą CriteriaBuilder. Jednak chcę mieć te same wyniki przy użyciu CriteriaBuilder. Próbowałem używać zależność hibernacji-przestrzennej, ale nie dostaję go do pracy tak, jak chcę. Podążałem również za tutorialami takimi jak ten.Obliczenie promienia CriteriaBuilder

https://docs.jboss.org/hibernate/search/4.2/reference/en-US/html/spatial.html

Baza używam jest MySQL.
Wersja hibernacji 4.3.10.

Również ten poradnik nie zrozumcie mnie daleko Using JPA Criteria Api and hibernate spatial 4 together

Więc w jaki sposób zbudować kwerendę CriteriaBuilder z MySQL z daną długość/szerokość geograficzna i odległość i pobrać tylko wiersze, które mieszczą się w tym obszarze, porównując je do długie/długie współrzędne przechowywane w bazie danych.

+0

Co jednostka jest odległością w –

+5

Cytat tygodnia (np mil/km): *. Przeszukałem enitre internet bez znalezienia rozwiązania mojego * – shmosel

+0

@SteveChambers To w km –

Odpowiedz

1

CriteriaBuilder nie jest wystarczająco silny dla takich złożonych zapytań. Ale można to robić z tej sztuczki:

  1. Utworzyç MySQL FUNCTION
  2. wywołać tę funkcję za pomocą CriteriaBuilder#function(..)

Należy także przez dość szybko. W związku z tym muszę zauważyć, że mysql nie jest odpowiedni do takich przypadków użycia, jak obliczanie odległości.

+0

Hmm .. nie wiedziałem o tym. Zajrzę do tego dzięki –

+0

To rozwiązanie zadziałało. Dzięki! –

0

Zrobiłem to w przeszłości, wyszukując prostokąt jak sugerowano powyżej, a następnie wykonując obliczenia odległości dla tych wyników. Ponieważ powinieneś już wyeliminować znaczną część danych, wykonanie tych obliczeń jest mniej karane. Ponieważ jest to tylko kwerenda o wartości liczbowe, nie wymaga żadnych dziwnych wtyczek ani integracji, a wyniki powinny być uzyskiwane dość szybko, jeśli indeksowane są długie i długie kolumny.

patrz: Given GPS coordinates, how do I find nearby landmarks or points-of-interest?

Niniejsza strona szczegóły robi formułę Haversine w SQL. Nadal jednak rozważałbym zastosowanie obwiedni jako klauzuli where, aby DB nie wykonywał tych obliczeń dla każdego wiersza w tabeli. http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/

3

Próbowałem następujących i to działa.

@Query(value = "SELECT s FROM Address s WHERE 1 = 1 AND " + 
     "(pow(69.1 * (s.latitude - ?1), 2) + pow(69.1 * (?2 - s.longitude) * cos(s.latitude/57.3), 2)) < pow(?3,2)" 

) 
List<Address> findNearbyAddress(double lat, double lng, double radius); 

radius w milach. ?1, ?2, ?3 są symbolami zastępczymi.
Potrzebne są obliczenia do pomiaru odległości od latitude & longitude. Nie można zadzwonić pod numer database native function z CriteriaBuilder.

+1

Mam podobne rozwiązanie, ale nie jest to możliwe w przypadku konstruktora kryteriów. –

Powiązane problemy