2016-04-14 142 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

    我有类似的解决方案,但这不适用于标准构建器。 –