标准构建器半径计算

9
我正在尝试使用给定的纬度/经度和距离进行计算,并仅返回在该圆形范围内的行(数据库也具有纬度/经度坐标)。我不知道如何实现这一点。我目前正在使用本地SQL,并具有计算此内容的haversine公式的纯文本,如果我正确,使用CriteriaBuilder无法执行haversine公式。但是,我希望使用CriteriaBuilder获得相同的结果。我尝试使用hibernate-spatial依赖项,但我无法按照自己的意愿使其正常工作。我还遵循了诸如此类的教程。https://docs.jboss.org/hibernate/search/4.2/reference/en-US/html/spatial.html
我使用的数据库是MySQL。Hibernate版本为4.3.10。
此外,这个教程并没有让我进展多少Using JPA Criteria Api and hibernate spatial 4 together
那么我该如何构建一个CriteriaBuilder查询与MySQL一起使用,给定纬度/经度和距离,并仅检索落入该区域的行,并将它们与存储在数据库中的纬度/经度坐标进行比较?

距离的单位是什么(例如英里/公里)? - Steve Chambers
5
本周名言:“我在整个互联网上搜索,也没有找到我的解决方案。” - shmosel
@SteveChambers 这是以公里为单位的。 - Mees Kluivers
你使用 MySQLSpatialDialect 吗?你可以在这里找到答案:http://stackoverflow.com/questions/36619855/mysql-spatial-dialect - Ernest Sadykov
使用PostGIS会更容易和高效。 - Jakub Bibro
3个回答

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);  

半径以英里为单位。 ?1,?2,?3是参数占位符。
需要进行一些计算才能测量从纬度经度的距离。您无法从CriteriaBuilder调用数据库本地函数


1
我有一个类似的解决方案,但是这不能使用条件构建器实现。 - Mees Kluivers

2

CriteriaBuilder 对于这样复杂的查询并不足够强大。但是你可以使用以下技巧实现:

  1. 创建一个MySQL FUNCTION
  2. 通过使用CriteriaBuilder#function(..)调用该函数

这应该也相当快。但我必须指出,mysql 并不真正适合用于距离计算等此类用例。


嗯...我不知道这个。谢谢,我会去了解一下的。 - Mees Kluivers

0

我过去曾通过上述建议查询出矩形,然后对这些结果进行距离计算。由于您应该已经消除了大量数据,因此进行这些计算的惩罚较小。由于这只是数字范围查询,因此不需要任何奇怪的插件或集成,如果索引了纬度和经度列,则应该可以快速获得结果。

参见: 给定GPS坐标,如何找到附近的地标或兴趣点?

该网站详细介绍了在SQL中使用Haversine公式的方法。但我仍然建议将边界框作为where子句应用,以便数据库不必为表中的每一行执行该计算。 http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接