当前位置: 首页 > 面试题库 >

休眠空间-在X公里半径内查询?

翟缪文
2023-03-14
问题内容

我是Hibernate Spatial的新手,正在尝试对给定半径内的对象执行简单查询。我已经使用来自Google
Maps和其他来源的数据在数据库中创建了许多条目,这些条目的属性分别对应于经度和纬度。此属性在我的Entity类中定义如下:

@Column
@Type(type = "org.hibernate.spatial.GeometryType")
private Point coordinates = null;

我现在正在尝试找出如何搜索所有坐标位于距给定点 x
公里半径内的实体对象的方法。例如,我想找到落在该点半径50公里以内的对象(12.34567,-76.54321)。但是,我找不到任何示例或教程来解释如何在Hibernate
Spatial中执行此操作。

谁能给我有关如何构建这样的查询的任何信息?


问题答案:

看到 这个资源
的“空间查询”教程,其中包含特殊的方言和JTS库(开放源代码)。

基本上,您可以执行以下操作(从引用的页面复制/粘贴):

import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader;
import util.JPAUtil;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.Date;
import java.util.List;

.......

private List find(String wktFilter) {
    Geometry filter = wktToGeometry(wktFilter);
    EntityManager em = JPAUtil.createEntityManager();
    em.getTransaction().begin();
    Query query = em.createQuery("select e from Event e where within(e.location, :filter) = true", Event.class);
    query.setParameter("filter", filter);
    return query.getResultList();
}

private Geometry wktToGeometry(String wktPoint) {
    WKTReader fromText = new WKTReader();
    Geometry geom = null;
    try {
        geom = fromText.read(wktPoint);
    } catch (ParseException e) {
        throw new RuntimeException("Not a WKT string:" + wktPoint);
    }
    return geom;
}

有关生成圆的信息,请参见此资源(搜索“弧,圆和曲线”)。再次从那里复制/粘贴:

//this method replaces the above wktToGeometry() method
private static Geometry createCircle(double x, double y, final double RADIUS) {
  GeometricShapeFactory shapeFactory = new GeometricShapeFactory();
  shapeFactory.setNumPoints(32);
  shapeFactory.setCentre(new Coordinate(x, y));//there are your coordinates
  shapeFactory.setSize(RADIUS * 2);//this is how you set the radius
  return shapeFactory.createCircle();
}

此外,您始终拥有一种解决方法,其中可以添加一些其他字段(使用映射insertable=false, updatable=false)以映射到所使用的相同列org.hibernate.spatial.GeometryType,然后在查询中使用它们。要计算距离,请检查欧几里德距离公式。



 类似资料:
  • 问题内容: 将Hibernate-spatial升级到5.0.0.CR2版本后,以下声明不再起作用: 与: 如我所见,该类不再存在于Jar文件中。GeometryType发生了什么以及如何替换?还是要包含另一个jar文件? 编辑:为澄清。我正在结合使用Hibernate-Spatial和PostgreSQL-Postgis数据库。 问题答案: 那么解决方案太容易看到了。只需删除@Type批注,则声

  • 问题内容: 我得到这个例外: 在此代码: 我连续2次查询。如果我评论其中之一,其他工作正常。 如果我删除交易,那么事物异常便消失了。这是怎么回事?这是内存泄漏之类的吗?提前致谢。 问题答案: 我从这种事情的多年痛苦中得到了一个提示:答案通常会仔细地隐藏在堆栈跟踪的前10行中的某个位置。始终多次读取堆栈跟踪,如果没有提供足够的帮助,请读取发生故障的方法的源代码。 在这种情况下,问题出在Hiberna

  • 问题内容: 这可能不清楚,也可能不清楚,如果我不在基地或您需要更多信息,请给我评论。也许对于我想要的PHP已经有了解决方案。 我正在寻找一个函数,该函数将从经度或纬度值中增加或减去一个距离。 原因:我有一个包含所有纬度和经度的数据库,并且想要形成一个查询以提取X公里(或英里)内的所有城市。我的查询看起来像这样… 我正在使用MySql数据库使用PHP。 也欢迎任何建议!:) 问题答案: 这是一个My

  • 我试图使用Hibernate Spatial中的谓词在X英里(用户定义)的半径范围内进行搜索。 虽然这类问题以前被问过,但在谓词中只问过一次,而且可能不是最新的,因为它不起作用。我必须能够使用谓词,而不是HQL。 我通过另一个答案找到了如何为PostGIS的WITHIN关键字设置谓词,但无法运行查询。 安装结束后,我声明错误输出和包版本。 以下是我的模式中的内容: 在我的模型中: 其中更新位置在l

  • 问题内容: 我有一个目前约有1万行的数据库。它们都基于邮政编码的中心具有经度/纬度。我发现了一个我正在尝试扩展的查询,但是总的来说它在某种程度上运行良好。但是,在下面的示例中,我试图找到半径25英里以内的事物,这似乎在大多数情况下都是可行的。我的大部分结果都在25英里标准范围内,但是我得到的结果很少,偏离了86英里到800英里。 示例:这是我的中心经度:37.2790669,-121.874722

  • 问题内容: 休眠注释应该放在哪里? 它是我的实例变量上方的线吗?还是在吸气剂之前?还是在二传手之前?还是真的不重要吗? 非常感谢 问题答案: 您可以将它们放在 野外 或 吸气剂上 。从《 Hibernate注释参考指南》中: 2.2.1。将POJO标记为持久实体 (…) 根据您是否注释字段或方法,Hibernate使用的访问类型将是字段或属性。EJB3规范要求您在将要访问的元素类型上声明注释,即,