我使用休眠空间将地理位置附加到汽车。我的卡域类如下所示:
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公里范围内的所有车辆?