2016-08-24 2 views
1

두 개의 포스트그레스 테이블, 하나의 다각형 피처 및 두 번째 포인트 피처가 동일한 투영법을 사용합니다. 내가하고 싶은 것은 공간적 쿼리를 사용하여 아래 그림에서 강조 표시된 것처럼 큰 폴리곤에 포함 된 작은 폴리곤에 포함되지 않은 점만 선택하는 것입니다. 나는 아래의 쿼리를 수행하려고공간 쿼리를 사용하여 포인트 피처 선택

enter image description here

후 작은 다각형 (kind=1)를 포함/교차하지 않고 select 모든 점에 들어있는 선택 기능에서 해당 포인트를 반환하는 것입니다 큰 다각형 (kind=2). 쿼리 결과는 0 rows입니다.

select 
     * 
from 
    (
    select p.geom as point_geom,sp.geom as polygon_geom 
    from polygons sp, points p 
    where st_disjoint(sp.polygon_geom,p.point_geom) and sp.kind = 1 
    ) as subquery 
where st_contains(subquery.scale_geom,subquery.pois_geom) and subquery.kind = 2; 

상기 쿼리의 kind 컬럼 kind = 1가 작은 다각형 kind = 2 큰 다각형을 나타냄이 다각형을 구별하기 위해 사용된다. 또한 두 폴리곤 오버랩은 작은 폴리곤에 포함 된 포인트가 큰 폴리곤에도 포함된다는 것을 의미합니다.

업데이트

이 쿼리를 실행 한 후 :

SELECT DISTINCT p.geom as point_geom FROM points p JOIN polygons poly1 ON ST_Disjoint(p.geom, poly1.geom) JOIN polygons poly2 ON ST_Intersects(p.geom, poly2.geom) WHERE poly1.kind = 1 AND poly2.kind = 2 ;

일부 결과는 같은 허용되지 않은 :

enter image description here

에워 싼 점해야에서만 종류 (1) 그러나 그들은 선택된다.

+0

하위 쿼리는 'kind = 1'인 폴리곤 만 반환합니다. 그리고 외부 질의에서'kind = 2'를 요구합니다. 결과는 자연스럽게 비어 있습니다. – dhke

+1

더 자세히 설명 할 수 있습니까?우선 모든 종류 ('kind = 2')의 다각형 안에 작은 ('kind = 1') 다각형을 선택해야합니까, 아니면 좀 더 편한 조건입니다. 즉 적어도 하나의 kind = 2 안에있는 모든 점을 원합니다. 다각형,하지만 어떤 kind = 1 다각형 안쪽에? – dhke

+0

@dhke 예 'kind = 2'폴리곤 안에 적어도 하나의 'kind = 1'폴리곤 안에있는 모든 포인트를 선택하고 싶습니다. –

답변

2

내가 제대로 이해하는 경우가있어 두 개의 직교 조건 : kind = 1 다각형 kind = 2 다각형

당신과 함께 교차

  • 모든 점 해체 있습니다

    1. 모든 점 그것의 교차점이 필요하다. 이중 조인을 수행해야합니다 :

      SELECT DISTINCT p.geom as point_geom 
      FROM points p 
          JOIN polygons poly1 ON ST_Disjoint(p.geom, poly1.geom) 
          JOIN polygons poly2 ON ST_Intersects(p.geom, poly2.geom) 
      WHERE 
          poly1.kind = 1 AND poly2.kind = 2 
      ; 
      

      예상되는 결과를 얻을합니다. DISTINCT은 점이 잠재적으로 여러 다각형에 포함되어있는 경우에만 필요합니다. polygons.geom, points.geompolygons.kind에 인덱스를 넣는 것을 잊지 마십시오. 그렇지 않으면 몹시 느려질 것이므로 (EXPLAIN은 두 개의 중첩 루프를 보여줍니다).

  • +0

    업데이트 된 질문보기 적어도 당신의 쿼리는 나에게 몇 가지 결과를주었습니다. 감사합니다.하지만 여전히 문제가 있습니다. –

    +0

    흥미 롭습니다. 영향을받은 점이 교차하는 모든 종류 = 2 폴리곤을 쿼리 해 보았습니까? – dhke

    +0

    내 데이터에 따르면'kind 1'은'1289' 포인트와 교차하고'kind 2'는'174485' 포인트와 교차합니다. 위의 쿼리는 약 '173196' 포인트가되어야하지만'161898' 포인트가 있습니다. –

    2
    SELECT p.geom AS point_geom, big.geom AS polygon_geom 
    FROM points p 
    JOIN polygons big ON ST_Intersects(big.geom, p.geom) AND big.kind = 1 
    JOIN polygons small ON (NOT ST_Intersects(small.geom, p.geom)) AND small.kind = 2; 
    

    이 쿼리는 "큰 다각형을 교차하지만 작은 폴리곤과 교차하는 점은 제외합니다"와 같은 내용을 읽습니다.

    ST_Disjoint()은 인덱스를 사용하지 않으므로 사용하지 마십시오.

    관련 문제