2016-04-14 105 views
9

我想用距離計算給定緯度/長度,並且只返回落在那個圓形距離(數據庫有緯度/長度座標)的行。我不知道的是我會怎麼做。我目前正在使用Native SQL,並且使用帶正則表達式的普通文本來計算此值,如果我正確,則不可能使用CriteriaBuilder來執行正則表達式公式。不過,我希望使用CriteriaBuilder獲得相同的結果。我試過使用hibernate-spatial依賴,但我沒有得到它的工作,因爲我想要它。我也跟着這個教程。CriteriaBuilder半徑計算

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

我使用的數據庫是MySQL的。
休眠版本4.3.10。

而且這個教程並沒有讓我遠Using JPA Criteria Api and hibernate spatial 4 together

那麼我將如何建立與MySQL的一個CriteriaBuilder查詢與給定的緯度/經度和距離,只檢索落在在這方面行,比較他們的經緯度座標存儲在數據庫中。

+0

什麼單位是在距離 –

+5

報價本週(例如英里/公里):*我已搜查,沒有發現我的解決方案的enitre互聯網* – shmosel

+0

@SteveChambers它在KM –

回答

1

CriteriaBuilder對於如此複雜的查詢來說功能不夠強大。但是你可以用這一招反正做到這一點:

  1. 使用CriteriaBuilder#function(..)

它應該通過也蠻快的創建MySQL FUNCTION

  • 調用這個函數。因此我必須注意到,mysql並不適合像距離計算這樣的用例。

  • +0

    嗯..不知道這件事。我會研究它,謝謝 –

    +0

    此解決方案工作。謝謝! –

    0

    我已經通過查詢上面建議的矩形,然後對這些結果進行距離計算,完成了這項工作。既然你應該已經消除了大量的數據,那麼做這些計算就不是一種懲罰。由於這只是數字範圍查詢,因此它不需要任何奇怪的插件或集成,並且如果您爲緯度和長度列編制索引,應該可以相當快地獲得結果。

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

    本網站的細節在做SQL haversine公式。我仍然會考慮將邊界框應用爲where子句,以便DB不會爲表中的每一行都執行該計算。 http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/

    3

    我已經嘗試了以下,它的工作原理。

    @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以英里爲單位。 ?1, ?2, ?3是參數佔位符。
    它需要一些計算來測量距離latitude & longitude的距離。您不能從CriteriaBuilder撥打database native function

    +1

    我有類似的解決方案,但這不適用於標準構建器。 –