交差するすべてのポリゴンを結合して、PostGISを変更せずに他のポリゴンを残す方法は?


8

私が必要なのは、交差するポリゴンを単一のジオメトリに統合し、変更せずに他のポリゴンを残すことです。

ここに画像の説明を入力してください

次のクエリを使用してこれを行うことができます。これは、すべてのポリゴンを単一のジオメトリに統合し、それを個別のジオメトリにダンプします。

INSERT INTO unioned(geom)
SELECT ST_MULTI((ST_Dump(ST_Union(geom))).geom) from footprints;

ここに画像の説明を入力してください

問題は、データベースに100万行を超える行があり、ST_Union操作が終了しないことです。すべてのジオメトリを結合せずに同じことを達成する方法はありますか?

回答:


6

上に示したタイプのデータに対して、私がはるかに速くなると期待する別のアプローチを以下に示します。

ST_UnaryUnion(unnest(ST_ClusterIntersecting(geom))) FROM footprints;

このクエリ:

  1. を使用ST_ClusterIntersectingして、「交差のチェーン」を形成する建物のフットプリントのグループを検索し、各グループをに貼り付けますGeometryCollection。配列を返します。
  2. unnestジオメトリコレクションの配列を使用して、各ジオメトリコレクションの行を作成します。
  3. を使用ST_UnaryUnionして、各ジオメトリコレクション内のアイテムを結合します。

返信@dbastonに感謝します。ST_ClusterIntersectingSRID = 0でジオメトリを返す理由を知っていますか?これをどのように解決できますか?次のクエリを実行しようとしている:INSERT INTO fixed_footprints(geom) SELECT ST_UnaryUnion(unnest(ST_ClusterIntersecting(geom))) as geom FROM footprints;私は、次のエラーを得た:[22023] ERROR: Geometry SRID (0) does not match column SRID (4326)
Serhey Ladonya

私はこれを解決したと思います:INSERT INTO fixed_footprints(geom) SELECT ST_Multi(st_setsrid(ST_UnaryUnion(unnest(ST_ClusterIntersecting(geom))), 4326)) as geom FROM footprints;より大きなセットでこれを試してみます
Serhey Ladonya 2018年

@SerheyLadonyaはSRIDの問題がのバグのようST_ClusterIntersectingです。指摘してくれてありがとう、直します。
dbaston 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.