【问题标题】:Query all Object within n kilometer Radius with Hibernate Spatial?使用休眠空间查询n公里半径内的所有对象?
【发布时间】:2015-10-18 09:13:15
【问题描述】:

我使用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的时候:

您可以看到,在左上角,仍然绘制了一辆位于圆圈外的汽车。这不应该是这样。在我看来,我用谷歌地图绘制的圆不等于我在代码中为查询绘制的圆几何。

这是我设置radius = 30的时候:

您看到右下角的汽车消失了,这是正确的,但左上角的汽车仍然保留在查询中。

当我绘制用createCircle 创建的圆时,我得到以下信息(使用getCoordinates() 获取圆的坐标):

如何查询40公里范围内的所有汽车?

【问题讨论】:

  • 你有没有找到解决这个问题的可靠方法?

标签: java hibernate geospatial jts hibernate-spatial


【解决方案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 你的假想圆的中心,这样你就不必生成几何图形,只需按距离过滤即可。

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

祝你好运! 化学。

【讨论】:

  • 还是不明白。我可以使用 Hibernate Spatial 来处理地球上的位置吗?如何将距离转换为度数
  • 什么是geom?是我的圈子吗?圆的点不正确不代表地球上的圆的问题吗?我该如何解决?
  • 据我了解,休眠空间(我将它与 MySQL 一起使用)使用平面几何。当我处理地球上的坐标时,您必须将其更改为其他坐标系。我可以使用休眠空间查询器正确处理地球上的坐标吗?我是否必须将我的坐标转换为 WGS84 或其他任何东西才能获得与谷歌地图相同的结果。请帮助我。我迷路了:
  • 另外一个问题是MYSQL没有dwithindistance根据这个:hibernatespatial.org/documentation/03-dialects/01-overview
  • MySQL 空间支持只是为了存储几何图形。对此类数据的操作受到太多限制。我找到了这个食谱(gist.github.com/oschrenk/2787570),它使用了可以帮助你的地理工具(我没有测试它)。祝你好运!
猜你喜欢
  • 2013-11-30
  • 2013-04-26
  • 2013-04-16
  • 2011-03-13
  • 2022-08-15
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
  • 2021-05-05
相关资源
最近更新 更多