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

时间:2015-07-28 00:52:26

标签: java hibernate geospatial jts hibernate-spatial

我使用hibernate spatial将地理定位附加到汽车上。我的卡域类看起来像这样:

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

我的程序是在Grails中,所以我给的样本是在Groovy中。我发现了一个类似的帖子here,它没有真正回答关于如何正确指定半径以设置半径为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公里范围内的所有车辆?

1 个答案:

答案 0 :(得分:0)

尝试计算几何之间的距离。您可以使用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 假想圆圈的中心,这样您就不必生成几何体,只需按距离进行过滤。

P.D。:在这个post中你可以找到关于度和米转换问题的描述

祝你好运! CHEMA。