2013-05-02 4 views
4

친애 유래 리더,최대 절전 모드 - 공간 쿼리

나는 현재의 좌표에 따라 특정 항목을로드하기위한 요구 사항이있는 응용 프로그램에서 일하고 있어요. 예 : 모든 상점을 x 좌표 또는 15km 이내에 위치해야합니다.

저는 Java EE 6에서이 웹 응용 프로그램을 빌드하고 Postgres 데이터베이스에 데이터 지속성을 위해 Hibernate 3.3을 사용했습니다. 일부 reseach 후 나는 Hibernate-Spatial이 나의 목표를 달성 할 수있는 가능성을 발견했다. Postgis를 설치하고 Hibernate-Spatial을 실행 시켰습니다.

나는 Hibernate 3.3, Hibernate-Spatial 1.0, PostgreSQL 9.2 및 postgis-jdbc 1.3.3을 사용하고 있습니다.

@Column(columnDefinition = "Geometry", nullable = true) 
@Type(type = "org.hibernatespatial.GeometryUserType") 
private Point location; 

가 처음에 내가 원을 생성하고 기본적으로 원 위치한 모든 지점에서 조회 할 수 있다고 생각 :

나는 위치 필드가 엔티티를 만들었습니다. 그러나 이것은 내가 생각했던 것보다 더 어려워 보인다. 그래서 나는 Hibernate-Spatial을 잘못 선택했다고 생각하기 시작했다.

내 질문은 Hibernate-Spatial을 사용하여 특정 경계 (해당 지점에서 x와 y km의 좌표) 내의 모든 Point를 쿼리 할 수 ​​있는지 의문입니다.

다른 요구 사항도 해결하고 싶습니다. 나는 다음과 같은 가능성에 대해 생각을 해 봤는데 :

  • 다만, PostgreSQL을에 기본 쿼리를 사용 기관에 그 결과를지도하고 응용 프로그램의 다른 부분에서 사람들을 사용 (기본적으로 최대 절전 모드 - 공간 제거하고 기본 쿼리를 사용) .
  • 최대 절전 모드로 전환하고 Lucene을 사용하여 작업을 수행하십시오. 완전히 다른

  • 뭔가 아무도 내가 최대 절전 모드 - 공간에서 내 소원을 달성 할 수 아니면 다른 방법으로 내 요구 사항을 달성 할 수있는 방법을 방법의 예를 제공하십시오 수 있습니다.

  • 답변

    2

    위의 대답이 잘못되었습니다. 해당 인수로 설명 된 거리가 킬로미터가 아닙니다. 충분하지 않은 위도에서 작업하는 경우 어떤 정확도로도 미터 또는 킬로미터로 변환 할 수 있습니까?). 위도 - 경도 좌표에서 공간 함수 중 하나를 사용한다면 실제로는지도를 equirectangle projection으로 축약 한 다음 거기에서 계산을 수행하는 것입니다.

    DWITHIN은 구에 대한 계산을 수행 할 수 있지만 지리 데이터를 제공 한 경우에만 미터를 측정 단위로 사용할 수 있습니다.

    최대 절전 모드 공간 지원되지 않는 지역 (this bug은 3 년 동안 해결되지 않았으므로 숨을 멈추지 마십시오).

    다각형 영역을 사용하는 경우, 위치에 따라 (적도에 가까울수록 좋음) 확인하고있는 영역의 크기에 따라 좌표 계산 방식이 왜곡 될 수 있습니다 기하학적 좌표와 함께 최소한으로.

    그래서 다각형 영역은 다소 왜곡되어 다소 잘 작동합니다.

    간단히 말해, Hibernate Spatial은 지리적 데이터를 저장하고 작업을 수행하는 쉬운 방법을 지원하지 않습니다. 그것은 데이터를 투영법으로 저장하는보다 진보 된 어려운 방법을 지원하고 그것에 대한 기본적인 데카르트 수학을 수행합니다.

    편집 : @ lreeder의 답변이 명확 해졌습니다.

    +0

    이것은 더 많은 코멘트입니다 - 그렇지 않습니까? 그것은 실제로 대답으로 홀로 서 있지 않습니다. –

    +1

    네 말이 맞아! 그러나 나는 논평 할 명성이 없기 때문에 답변에 투표하거나 의견이 일치하지 않는다. 하지만 그 대답은 미묘하게 잘못된 것입니다. 그래서 저는 무언가를해야했습니다! – Ghoughpteighbteau

    +0

    OP가 lat-lng와 같은 비 계획 CRS를 사용하는 경우 모두가 말하는 내용이 사실입니다. 그러나 dwithin은 예상 CRS를 사용하고 있거나 일정 수준의 오류를 기꺼이 받아들이면 기꺼이 잘 작동합니다. 나는 원래의 대답에서 그 복잡성을 무시했지만 현재의 대답에 더 많은 세부 사항을 추가했다. 내 대답은 같은 문제가 OP와 다른 사람을위한 하나의 잠재적 인 솔루션을 제공한다고 생각하지 .. 귀하의 답변은 OP의 문제를 해결 무언가보다 내 대답의 비판이기 때문에 대체 솔루션을 추가하려면 업데이 트를 고려하십시오. – lreeder

    6

    PostgreSQL/PostGIS 언어의 경우, Hibernate Spatial은 dwithin 기능을 지원합니다.

    boolean dwithin(Geometry, Geometry, double)이 - 형상이 Hibernate Spatial tutorial을 의역 서로

    의 지정된 거리 내에있는 경우에 true를 돌려줍니다 쿼리는 다음과 같이 보일 것입니다 :

    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 Km이 작음), 저위도에있는 경우 Km을 0.009로 근사 할 수 있습니다.이것은 당신에게 적도에서 완벽한 서클을 줄 것입니다, 그러나 당신이 북쪽이나 남쪽으로 움직일 때,이 원은 타원으로 바뀔 것입니다. 위도가 +/- 60 도인 타원은 너비가 두 배가됩니다. 분명히 이상적이지는 않지만 귀하의 상황에서 효과가있을 수 있습니다.

    또 다른 대안은 데이터 단위를 재 투영하여 미터 단위의 투영 된 데이터 세트로 PostgreSQL에 저장하는 것입니다. 이렇게하면지도에 대규모로 표시되는 경우 데이터가 왜곡되지만 검색 결과가 예상대로 작동합니다.

    +0

    dwithin MYSQL에서 작동하지 않는 이유가 있습니까? – confile

    +1

    이것이 제가 보통 공간 사용을 위해 사람들을 MySQL에서 멀어지게하는 이유 중 하나입니다. 최선의 방법은 다음과 같은 방법을 사용하여 자신과의 거리를 계산하는 것입니다. http://gis.stackexchange.com/questions/31628/find-points-within-a-distance-using-mysql – lreeder

    +0

    감사합니다. 좋은 생각. – confile