2016-09-14 3 views
1

私はPostgisを新しくしました。だから、これは間違った質問です。ジオメトリのリストにST_Intersectionを適用する

私はテーブル内にポリゴンのリストを持っており、それらの間のインターセットを見つけたいと思います。 私はそうのような問題もなくにST_Unionを行うことができます。

select ST_Union(t.geom) from mytable t

が、同じことが、彼らは本当に、ST_Intersection

ST_UnionST_Intersectionのドキュメントを見てみると

select ST_Intersection(t.geom) from mytable t` ERROR: function st_intersection(geometry) does not exist

では動作しません。アンライニングST_Union、ST_Intersectionは厳密に2つのジオメトリにしか適用できないことを示唆する異なるシグニチャーを持っています。

解決方法はありますか?あなたがself joinを必要とし、事前

+0

あなたはすべての交差点であるジオメトリを見つけたいですか?それらはすべて共通の領域に重なっていますか? –

+0

?1正確です。 ?2はい、ほとんどの場合です。そうでない場合、交差点は0エリアを持ち、その情報も重要です。 –

答えて

0

感謝。 例:

SELECT ST_intersection(a.geom,b.geom) 
FROM mytable AS a, mytable AS b 
WHERE st_equals(a.geom, b.geom) IS FALSE AND ST_intersects(a.geom, b.geom); 

このようにして、テーブルを自分と比較できます。あなたのテーブルにはID列を持っている場合、あなたは可能性

(そうST_IntersectionsがGEOMETRYCOLLECTION EMPTYを返します)2つのジオメトリが2つのジオメトリが交差

  • 同じではありません

    • :条件があることを保証2使用

      WHERE a.id != b.id 
      

      代わりの

      WHERE st_equals(a.geom, b.geom) IS FALSE 
      
  • +0

    ありがとう!これは私がこのアイデアで必要としていたものが、将来的には役立つかもしれません。 –

    0

    私が見つけたのはthis solutionです。あなたは

    select ST_Intersection(array_agg(distinct t.geom)) from mytable t

    の異なるが重要な操作を行うことができ

    create or replace function ST_IntersectionArray(geoms geometry[]) returns geometry as $$ declare i integer; tmpGeom geometry; begin tmpGeom := geoms[1]; FOR i IN 1..array_length(geoms,1) LOOP tmpGeom:= ST_Intersection(tmpGeom,geoms[i]); END LOOP; return tmpGeom; end; $$ LANGUAGE plpgsql;

    を示唆したように機能ST_IntersectionArrayを作成した後

    。同一のポリゴンがある場合、エラーが発生する可能性があります。

    これは私のために最も効果的でした。

    1

    WITH RECURSIVE common table expressionを使用すると、geometry[]の各要素を実行結果で処理できます。ここで

    は重複し、バッファランダムな位置(図の青いポリゴン)に基づいて、いくつかの例のデータである:

    DROP TABLE IF EXISTS ar; 
    SELECT array_agg(ST_Buffer(ST_MakePoint(random(), random()), 0.5, 3)) AS geoms 
    INTO TEMP ar 
    FROM generate_series(1, 6) AS id; 
    SELECT ST_Collect(geoms) FROM ar; 
    

    そして、ここでは魔法です:

    WITH RECURSIVE inter AS (
        -- First geometry 
        SELECT 1 AS idx, geoms[1] AS geom FROM ar a 
        UNION ALL 
        -- Remaining geometries with the previous result 
        SELECT a.idx + 1, ST_Intersection(a.geom, b.geoms[a.idx + 1]) 
        FROM inter a, ar b 
        WHERE a.idx + 1 <= array_length(geoms, 1) AND NOT ST_IsEmpty(a.geom) 
    ) 
    SELECT * FROM inter 
    ORDER BY idx DESC LIMIT 1; 
    

    「再帰は」上停止します最後の配列インデックス、または結果が空の場合また、最後の行をコメントアウトすることで、各交差ステップを見ることができます。

    img

    関連する問題