我使用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
时:
你可以看到左上角仍然画出了一个位置在圆外的汽车。这不应该发生。我觉得我用谷歌地图画的圆和我在代码中画的圆形几何图形不相等。
当我设置radius = 30
时:
你可以看到右下角的汽车消失了,这是正确的,但左上角的汽车仍然在查询结果中。
当我画出用createCircle
创建的圆时(使用getCoordinates()
获取圆的坐标):
我如何查询所有在40公里半径内的汽车?