4

我使用休眠空间将地理位置附加到汽车。我的卡域类如下所示:

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公里范围内的所有车辆?

4

1 回答 1

0

尝试计算几何之间的距离。您可以使用dwithin函数(请参阅Hibernate 空间文档):

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你的假想圆的中心,所以你不必生成几何,只需按距离过滤。

PD:在这篇文章中,您可以找到关于度数和米数转换问题的描述

祝你好运!。化学。

于 2015-07-28T06:23:19.560 回答