2016-08-24 5 views
1

私は2つのポストグルテーブル、1つのポリゴンフィーチャ、2つ目のポイントフィーチャを持ち、同じ投影を持ちます。 私がしたいのは、大きなポリゴンに含まれ、小さなポリゴンに含まれていないポイントだけを選択することです(下の図で強調表示されているように、空間クエリを使用します)。私は以下のクエリをどうしようとしています空間クエリを使用したポイントフィーチャの選択

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大きいポリゴンを表し、これらの多角形、区別するために使用されます。また、両方のポリゴンオーバーラップは、小さなポリゴンに含まれるポイントに大きなポリゴンも含まれていることを意味します。

更新

このクエリを実行した後:囲まれたポイントは唯一の種類1にする必要があります

enter image description here

:一部の結果は次のように許容なかった

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 ;

しかしそれらは選択されます。

+0

サブクエリは、「kind = 1」のポリゴンのみを返します。そして外側のクエリで、あなたは 'kind = 2'を求めます。結果は自然に空です。 – dhke

+1

もっと詳しく説明できますか?あなたは最初にすべての大きな( 'kind = 2')ポリゴンの中に小さい(' kind = 1')ポリゴンを選択する必要がありますか、それとももっとリラックスした条件ですか、つまり少なくとも1つの 'kind = 2'任意の 'kind = 1'ポリゴンの内部にはありませんか? – dhke

+0

@dhkeはい「kind = 2」ポリゴンの中で少なくとも1つのポイントを選択したいのですが、「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.geompoints.geom、およびpolygons.kindにインデックスを付けることを忘れないでください。そうしないと、ひどく遅くなる(EXPLAINは2つのネストされたループを示します)。 「大きなポリゴンと交差するすべてのポイントを選択するが、小さなポリゴンと交差するすべてのポイントを除外」:

  • +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()を使用しないでください。

    関連する問題