2016-04-14 14 views
9

Sto provando a calcolare dato lat/long con una distanza, e restituendo solo le righe che cadono in quella distanza circolare (Database ha anche coordinate lat/long). Quello di cui non sono a conoscenza è come lo farei. Attualmente sto usando SQL nativo e ho un testo semplice con la formula haversine che lo calcola, e se sono corretto non è possibile fare la formula di haversine con CriteriaBuilder. Comunque voglio avere gli stessi risultati usando il CriteriaBuilder. Ho provato a utilizzare la dipendenza da spazio-letargo, ma non riesco a farlo funzionare come voglio. Ho anche seguito tutorial come questo.Criteria Calcolo del raggio di costruzione

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

Il database che sto usando è MySQL.
Hibernate versione 4.3.10.

Anche questo tutorial non ha ottenuto me lontano Using JPA Criteria Api and hibernate spatial 4 together

Così come vorrei costruire una query CriteriaBuilder con MySQL con una data distanza latitudine/longitudine e e recuperare solo le righe che rientrano in quella zona, confrontandoli con il coordinate lat/long memorizzate nel database.

+0

Che unità è la distanza in –

+5

Citazione della settimana (ad esempio miglia/km?):. * Ho cercato su internet enitre senza trovare la mia soluzione * – shmosel

+0

@SteveChambers E 'in KM –

risposta

1

CriteriaBuilder non è abbastanza potente per query così complesse. Ma si può fare lo stesso con questo trucco:

  1. Creare un MySQL FUNCTION
  2. chiamare questa funzione utilizzando CriteriaBuilder#function(..)

Dovrebbe anche dal piuttosto veloce. Per cui devo notare, che mysql non è veramente adatto per un tale caso d'uso come il calcolo della distanza.

+0

Hmm .. non lo sapevo. Lo esaminerò grazie –

+0

Questa soluzione ha funzionato. Grazie! –

0

Ho fatto questo in passato interrogando il rettangolo come suggerito sopra, e poi facendo il calcolo della distanza su quei risultati. Dato che dovresti aver già eliminato una buona parte dei dati, fare questi calcoli è meno penalizzante. Poiché si tratta solo di query dell'intervallo numerico, non richiede alcun plug-in o integrazione strana e dovrebbe ottenere risultati abbastanza rapidamente se si indicizzano le colonne lat e long.

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

Questa dettagli del sito facendo la formula Haversine in SQL. Continuo a considerare l'applicazione del bounding box come clausola where in modo tale che il DB non esegua tale calcolo per ogni riga della tabella. http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/

3

Ho provato quanto segue e funziona.

@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 in miglia. ?1, ?2, ?3 sono parametri segnaposto.
Ha bisogno di alcuni calcoli per misurare la distanza da latitude & longitude. Non è possibile chiamare database native function da CriteriaBuilder.

+1

Ho una soluzione simile ma questo non è fattibile con il costruttore di criteri. –

Problemi correlati