2016-08-24 73 views
1

我有兩個postgres表,一個多邊形要素和第二個點要素,具有相同的投影。 我想要做的是僅使用空間查詢選擇僅包含在大多邊形中且不包含在小多邊形中的點,如下圖中突出顯示的那樣。使用空間查詢選擇點要素

enter image description here

我想用下面的查詢做的是,select所有這些不相交/包含在小多邊形(kind=1),然後點從包含在所選擇的功能,返回這些點大的多邊形(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

如果我理解正確的話,你有兩個正交條件:

  1. 不相交與kind = 1多邊形
  2. 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 
; 

應該產生預期的結果。 DISTINCT只有在一個點可能包含在多個多邊形中時纔是必需的。不要忘記把索引放在polygons.geom,points.geompolygons.kind,否則這將會非常慢(EXPLAIN顯示兩個嵌套循環)。

+0

查看更新後的問題。至少你的查詢給了我一些結果,感謝你,但仍然有一些問題 –

+0

有趣的是,你有沒有嘗試查詢受影響的點相交的所有'kind = 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(),因爲它不使用索引。