首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate-区域内点的空间查询

Hibernate-区域内点的空间查询
EN

Stack Overflow用户
提问于 2013-05-02 08:47:07
回答 2查看 7.9K关注 0票数 5

亲爱的堆叠式读者,

我目前正在开发一个应用程序,该应用程序需要根据其坐标加载特定项。例句:我要所有的商店从坐标x或15公里以内。

我在Java 6中构建了这个web应用程序,并使用Hibernate 3.3对Postgres数据库进行数据持久性。经过一番研究,我发现Hibernate- some是实现我的目标的一种可能性。我安装了Postgis并运行了Hibernate-Spatial。

我使用Hibernate 3.3,Hibernate-space1.0,PostgreSQL 9.2和postgis-jdbc 1.3.3。

我创建了一个具有location字段的实体:

代码语言:javascript
复制
@Column(columnDefinition = "Geometry", nullable = true) 
@Type(type = "org.hibernatespatial.GeometryUserType")
private Point location;

一开始,我想我可以创建一个圆圈,基本上可以查询位于圆圈中的每一个点。但这似乎比我想象的要难。我开始认为我选择了使用Hibernate-Spatial是错误的。

我的问题是,是否可以使用Hibernate-there来查询特定边界内的每个点(坐标x和y公里)。

我还对解决我的需求的其他可能性感兴趣。我一直在考虑以下几种可能性:

  • 只需在PostgreSQL上使用原生查询,将这些结果映射到实体,并使用应用程序其他部分中的结果(基本上删除Hibernate- those并使用本机查询)。
  • 切换到Hibernate-搜索并使用Lucene来完成我的任务。
  • 完全不同的东西

请任何人提供一个例子,说明我如何在Hibernate-Spatial中实现我的愿望,或者如何以另一种方式实现我的需求。

EN

回答 2

Stack Overflow用户

发布于 2013-05-18 16:14:22

对于PostgreSQL/PostGIS方言,Hibernate空间支持dwithin函数。

如果几何形状在指定的距离内,则boolean dwithin(Geometry, Geometry, double) -返回true。

引用Hibernate空间教程时,查询将如下所示:

代码语言:javascript
复制
String wktCenterPoint = "POINT(10 15)"
Geometry centerPoint = wktToGeometry(wktCenterPoint);    
...
Query query = em.createQuery("select e from Event e where dwithin(e.location, :centerPoint, 15) = true", Event.class);
...

这将返回距中心点15个单元内的所有事件。

然而,在dwithin 中给出的距离将与底层数据集具有相同的单位,而不一定是公里。如果数据集单位为米,则将该距离视为米。

如果数据集位于lat-lng中,则距离为度.如果是这样,而且你的搜索距离很小(15公里是小的),而你是在低纬度,你可以大约0.009公里。这将给你一个完美的搜索圈在赤道,但当你移动北或南,这个圆将变成一个椭圆与长轴指向南北。在+/- 60度纬度上,椭圆的高度将是宽的两倍。显然不理想,但它可能在你的情况下起作用。

另一种选择是重新设计数据集并将其存储在PostgreSQL中,将其作为带有米单位的投影数据集。这将扭曲您的数据,如果显示在地图上的大规模,但您的搜索将按照预期的工作。

票数 7
EN

Stack Overflow用户

发布于 2020-11-29 19:39:56

通过下面提到的代码,您可以获得在50至110米范围内的所有位置,因为我使用0.001,您可以根据您的要求使用距离。

代码语言:javascript
复制
GeometryFactory factory = new GeometryFactory(new PrecisionModel(), 4326);
        factory.createPoint(new Coordinate(longitude,latitude));
        Point comparisonPoint = factory.createPoint(new Coordinate(longitude,latitude));
        predicates.add(SpatialPredicates.distanceWithin(cb, geom from db), comparisonPoint, 0.001));

distanceWithin()函数在程度上取距离,您必须将其转换为地志,但hibernate不支持,因此还有另一种方法可以通过根据您的requirement.link提供小数点的距离来实现这一点,下面是小数点的例子。

用于十进制转换,链接学位

用于在数据库链接https://www.compose.com/articles/geofile-everything-in-the-radius-with-postgis/中创建geom和添加扩展

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16333811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档