Hibernate Spatial - 在 X 公里半径内查询?
-
21-12-2019 - |
题
我是 Hibernate Spatial 的新手,正在尝试对给定半径内的对象执行简单的查询。我使用 Google 地图和其他来源的数据在数据库中创建了许多条目,其属性对应于纬度和经度。该属性在我的实体类中定义如下:
@Column
@Type(type = "org.hibernate.spatial.GeometryType")
private Point coordinates = null;
我现在试图弄清楚如何搜索坐标落在半径范围内的所有实体对象 X 距给定点的公里数。例如,我想查找落在该点 (12.34567,-76.54321) 50 公里半径范围内的对象。但是,我找不到任何示例或教程来解释如何在 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
然后在您的查询中使用它们。要计算距离,请检查 欧几里得距离公式.
不隶属于 StackOverflow