使用Hibernate Spatial查询半径n公里内的所有对象?

5

我使用hibernate spatial将地理位置信息附加到汽车上。我的汽车领域类如下:

import com.vividsolutions.jts.geom.Point
class Card {
  String name
  Point location 
}

我的程序是使用Grails编写的,因此我给出的示例是使用Groovy编写的。 我在这里找到了一个类似的帖子(链接),但它并没有真正回答如何正确指定半径以设置n千米半径的最重要问题。

这是我如何计算圆形几何图形:

  private static Geometry createCircle(double x, double y, final double RADIUS) {
    GeometricShapeFactory shapeFactory = new GeometricShapeFactory();
    shapeFactory.setNumPoints(1000);
    shapeFactory.setCentre(new Coordinate(x, y))
    shapeFactory.setSize( (RADIUS * 2)/88.1)

    return shapeFactory.createCircle().getBoundary()
  }

这个圆的大小被88.1分成了若干份,这只是一个粗略的修正方法,可以得到近似的尺寸,但仍然是错误的。

我的查询是这样完成的:

double radius = 40
Geometry filter = createCircle(car.location.x, car.location.y, radius)
Session session = sessionFactory.currentSession
Query q = session.createQuery("select c from Car c where within(c.location, ?) = true")
q.setParameter(0, filter, GeometryUserType.TYPE) 
q.list()

这个查询结果不太准确。有些本应在圆外的汽车也会被返回。

以下是一个例子。我的中心点是汉堡,半径为40公里。我使用谷歌地图进行可视化。

当我设置radius = 40时:

enter image description here

你可以看到左上角仍然画出了一个位置在圆外的汽车。这不应该发生。我觉得我用谷歌地图画的圆和我在代码中画的圆形几何图形不相等。

当我设置radius = 30时:

enter image description here

你可以看到右下角的汽车消失了,这是正确的,但左上角的汽车仍然在查询结果中。

当我画出用createCircle创建的圆时(使用getCoordinates()获取圆的坐标):

enter image description here

我如何查询所有在40公里半径内的汽车?


你是否曾经找到了一个可靠的解决方案? - James111
1个回答

1
尝试计算几何图形之间的距离。您可以使用 dwithin 函数(参见 Hibernate spatial documentation):
select c from Car c where dwithin(c.location, :geom, :dist) = true

或者只是distance
select c from Car c where distance(c.location, :geom) < :dist

此外,不要忘记将距离度量转换为度(对于WGS84 SRS)。
编辑:
使用geom作为您想象中的圆心,这样您就不必生成几何图形,只需按距离过滤即可。
附注:在此post中,您可以找到有关度和米转换问题的描述。
祝你好运! 切马。

还是不太明白。我能用Hibernate Spatial处理地球上的位置吗?如何将距离转换为度数? - Michael
什么是geom?它是我的圆吗?问题不是圆的点没有正确地代表地球上的一个圆吗?我该如何解决这个问题? - Michael
据我所知,Hibernate Spatial(我在MySQL中使用它)使用平面几何。当处理地球上的坐标时,您必须将其转换为其他坐标系统。我可以使用Hibernate Spatial查询器正确处理地球坐标吗?我是否需要将我的坐标转换为WGS84或其他坐标系才能获得与Google Maps相同的结果?请帮助我解决这个问题,我很困惑。 - Michael
另一个问题是MYSQL没有“dwithin”和“distance”,根据这个链接:http://www.hibernatespatial.org/documentation/03-dialects/01-overview/ - Michael
MySQL的空间支持仅用于存储几何图形。对这种类型数据的操作非常有限。 我发现了这个配方(https://gist.github.com/oschrenk/2787570),它使用geotools(我没有测试过),可能会对你有所帮助。祝你好运! - jmvivo
我需要对从谷歌地图获取的纬度和经度坐标进行转换吗?WGS84呢?什么时候需要使用它? - Michael

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