st_union以外にPostGISにディゾルブ関数はありますか?


22

テーブル内のポリゴンフィーチャ間の共有境界を解消する関数を探しています。ST_UNION()は、私が探していることをほぼ実行しますが、共通の境界を共有するかどうかに関係なく、レイヤー内のすべてのポリゴンからマルチポリゴンを作成します。むしろ、互いに接触するポリゴン間の境界のみをディゾルブします。ST_TOUCHES()を使用する方法があるはずですが、ディゾルブ関数の必要性は非常に一般的であるため、これを実現する組み込み関数がない場合は驚くでしょう。

ユースケースは次のようになります。ヨーロッパの大規模な国のCorine Landcoverデータをダウンロードし、異なるフォレストタイプ(1つのテーブルに約75,000ポリゴン)の境界を解消したいと思います。ST_UNIONを試しましたが、「メモリ不足」エラーで失敗します(ただし、30,000ポリゴンは機能しました)。

create table corine00 as 
  select st_union(the_geom) as the_geom, 
         sum(area_ha) as area_ha,
         substr(code_00,1,2) as code_00
  from clc00_c31_forests
  group by substr(code_00,1,2)

注:すべてのフォレストコードは「31」で始まり、PostGIS 1.4、GEOSバージョン:3.2.0-CAPI-1.6.0を使用しています

回答:


21

ST_MemUnion()は、素朴で遅いメモリフレンドリープロセスを実行します。あなたがそれを試すことができます、あなたの問題が十分に小さいならば、それは合理的な時間で終わるかもしれません。また、問題を半分に分割してから、半分を一緒に実行することもできます。結果は入力よりもポイントがはるかに少ないため、問題全体をそのようにメモリに収めることができます。または、半分で高速のメモリを消費するルーチンを使用し、最終マージで低速のルーチンを使用します。


4
ポールにここに来ていただきありがとうございます。比類なき専門知識をもたらしてくれてありがとう。
fmark

1
おかげで、私の問題は十分に小さくないようです。ST_MemUnion()は現在24時間実行されています。問題を分割してみます。
暗闇

5

ST_Dumpはあなたが望むものだと思います:

ST_Dump

ジオメトリg1 ....を構成する一連のgeometry_dump(geom、path)行を返します。たとえば、MULTIPOLYGONSをPOLYGONSに展開するために使用できます。...

あなたの場合:

 SELECT (ST_Dump( ST_Union( the_geom ) )).geom
 FROM clc00_c31_forests
 GROUP BY substr(code_00,1,2)

あなたがやろうとしているテーブル作成とどのように相互作用するかはわかりませんが、ジオメトリを個別のエントリとして提供する必要があります。その後、2つのテーブル間で空間結合(&&およびST_Containsを使用)を実行して、データをジオメトリに収集できます。


2
注:これは、ST_Unionのメモリの問題を処理する場合にのみ役立ちます!:)
yhw42

4

あなたのPostGISはGEOS 3.1.0+に対してコンパイルされていますか?そのバージョンでは、はるかに高速なカスケード式ユニオンが実装されましたが、見つからない場合、桁違いに遅い古いコードが使用されます。

更新:PostGISがカスケードユニオンアプローチを使用しているかのように見えますが、メモリ不足は現実のものです。Postgresインスタンスで使用可能なメモリを増やしてみます。ポールラムジーの2007 FOSS4G PostGISトークからのアドバイスを以下に示します。

  • ディスクアクセスは遅いため、データをキャッシュするためにより多くのメモリを使用することにより、より高いパフォーマンスを得ることができます!
    • 増加する shared_buffers
    • 物理RAM-OSのニーズ* 75%
  • ソートはメモリ内で高速です
    • 増加する work_mem
  • メモリが増えるとディスクのクリーンアップが速くなります
    • 増加する maintenance_work_mem
  • 接続ごとに割り当て
  • また
    • 増加する wal_buffers
    • 増加する checkpoint_segments
    • 減少 random_page_cost

あなたの場合、私は増やすことを試みますshared_buffers、一般的な推奨事項はデータベースサーバーの利用可能なメモリの25%ですが、現在の値の3〜4倍に増やして完了しているかどうかを確認してください。


postgis_geos_version()が返す値:3.2.0-CAPI-1.6.0 ...それでいいと思います。ST_Collectをお試しいただき、ありがとうございます。
暗闇

さて、ST_Collectは境界を解消しないようであり、1つの巨大なマルチポリゴンも作成します。
暗闇

ええ、ST_Collectのページを読み間違えました。Postgresのメモリ使用量を調整するためのより具体的なアドバイスを提供するために、回答を更新しました。
scw
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.