2014-03-01 42 views
1

我使用的是Hibernate,Postgre,PostGIS和Grails。使用Hibernate和PostGIS获取同一查询中的距离和域属性

要搜索给定半径内的所有用户,我正在使用HibernnateSpetial,并且所有用户都正常工作。

def criteria = sessionFactory.currentSession.createCriteria(User) 
criteria.createAlias('location', 'location') 
criteria.add(SpatialRestrictions.within("location.point", boundingPolygon)) 
criteria.list() 

现在,我还希望在相同的标准执行中给定点的所有用户的距离。

def criteria = sessionFactory.currentSession.createCriteria(User) 
criteria.createAlias('location', 'location') 
criteria.add(SpatialRestrictions.within("location.point", boundingPolygon)) 
String[] columnAlias = new String[1] 
columnAlias[0] = "distance" 
org.hibernate.type.Type[] types = new StandardBasicTypes[1] 
types[0] = StandardBasicTypes.DOUBLE 
criteria.setProjection(Projections.sqlProjection("ST_Distance(point, ST_GeomFromText('POINT(-84.3346473 33.9462125)', 4326)) as distance", columnAlias, types)) 
criteria.list() 

它返回存储在数据库中的几何(点)和SQL中提供的点之间的距离,但忽略用户域的属性。标准执行后,我得到了这样的东西 - [0.0,0.20430178027717,0.0]。

我想知道是否可以从给定的经度/纬度得到每个用户的所有用户距离。我可以使用Groovy/Java代码来计算结果的距离,但是我需要执行条件执行的排序结果,以便我也可以应用分页。

+0

嗨manish,我没有回答你的问题,但我试图使用PostGIS与grails没有成功。你能否指出最新的资源来展示如何做到这一点? –

回答

0

如果你想得到的距离回,它似乎更容易直接在你的Groovy代码计算的话,如:

giveMeAllHitsFromGIS().each{ 
    it.distance = it.point1.distanceTo(it.point2) 
} 

您的代码已经是有点低级别的超载休眠/空间的东西,它会得到较少的可读性,如果你增加你的空间查询的复杂性

+0

其实我需要给定半径范围内的域(User)以及它们与给定中心(点)的距离。我可以使用Groovy/Java方法来计算结果的距离,但我需要排序的结果,以便我也可以应用分页。 – manish

相关问题