2014-03-01 2 views
1

최대 절전 모드, 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() 

이제 동일한 기준 실행에서 지정된 지점의 모든 사용자의 거리를 원합니다. 그것은 나에게 데이터베이스와 SQL에 공급되는 시점에 저장 기하 (포인트) 사이의 거리를 반환하지만 사용자 도메인의 속성을 무시

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() 

. 기준 실행 후 [- 0.0, 0.20430178027717, 0.0]과 같은 것을 얻었습니다.

주어진 Lat/lng에서 모든 사용자 + 거리를 얻을 수 있는지 궁금합니다. Groovy/Java 코드를 사용하여 결과의 ​​거리를 계산할 수 있지만 기준 실행에서 정렬 된 결과가 필요하므로 페이지 매김도 적용 할 수 있습니다. 다시 거리를 얻기 위해 단지을 원하는 경우에

+0

안녕하세요 manish, 귀하의 질문에 아무런 대답이 없지만 나는 성공 grails와 postGIS를 사용하려고합니다. 이 작업을 수행하는 방법을 보여주는 최신 리소스를 참조 할 수 있습니까? –

답변

0

,처럼, 당신의 그루비 코드에서 직접 계산하기 쉬울 것 같다 : 귀하의 코드는 이미

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

낮은 수준의 오버로드 조금 당신이 공간 쿼리의 복잡성을 증가 시키면 최대/절전/공간 물건을 덜 읽을 것입니다

+0

사실 주어진 반경 내에서 도메인 (사용자)과 주어진 중심점 (지점)으로부터의 거리가 필요합니다. Groovy/Java 메서드를 사용하여 결과의 ​​거리를 계산할 수 있지만 정렬 된 결과가 필요하므로 페이지 매김도 적용 할 수 있습니다. – manish