一尘不染

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

hibernate

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

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

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

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


阅读 222

收藏
2020-06-20

共1个答案

一尘不染

看到 这个资源
的“空间查询”教程,其中包含特殊的方言和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,然后在查询中使用它们。要计算距离,请检查欧几里德距离公式

2020-06-20