ポリゴン間のオーバーラップを分割し、PostGISを使用して最も近いポリゴンに割り当てますか?


8

私の質問は、私がを使用していないことを除いて、ポリゴン間の素朴なセットへの未回答の分割オーバーラップにかなり関連していshapelyます。PostgreSQL10でPostGIS 2.4を使用しています。

管理ユニットのマルチポリゴンを含むテーブルがあります。形状は陸域のみをカバーしています。私の目標は、それらを水中に一定距離伸ばすことです。

現在のポリゴンを水中に拡張するために、バッファを実行してから、テーブル内の他のすべてのジオメトリを差し引きます。これにより、ジオメトリに隣接するバッファーがクリップされ、レイヤーに現在何もないバッファーが保持されます。だから、次のようなもの:

SELECT c1.name
     , ST_Difference( ST_Buffer( ST_Union(c1.geom), 250 )
                    , (SELECT ST_Union(c2.geom)
                         FROM foo.county AS c2
                        WHERE c2.name <> c1.name)
                    )
  FROM foo.county AS c1
 GROUP BY c1.name;

ただし、これはもちろん、2つのポリゴンが水の端で互いに出会うオーバーラッピングバッファーと、狭い海峡をまたがって与えます。

地図

(付録のような半島のため、ジオメトリのポイントが赤よりも青に近くないため、左側の小さな紫のスライバーは完全に赤のポリゴンに割り当てられていることに注意してください。)

これは私が行き詰まっているところです。オーバーラップ(紫の部分)を、バッファリングされていないポリゴンと等距離の線に沿って2つのばらばらのポリゴンにカットし、それらのスリーバーをバッファリングされた郡から減算します。

バッファが3つ以上重なるケ​​ースはないと思います。そこに着いたら、私はその橋を渡ります。

ST_VoronoiPolygonsポイントの代わりにポリゴンの周りを使用するのと似ていますが、まったく同じではないような匂いがします。

これは、理想的には、PostGIS関数として、QGISジオプロセシング機能として、または一部のPythonライブラリに存在しますか?


上の画像では、青い海以外の小さな海の斑点はありますか?それとも記入しますか?
エヴァンキャロル

非青は単純にすべてのポリゴンの外側にあります-私は250メートルのバッファを実行しているだけなので、それはまだ国の水域です。私の目的のために、「サーフィン中」の機能を確実にキャッチするための小さなバッファーが必要です。真ん中のリングアイランドの南にある穴を見ると、間違いなく、ExteriorRingのダンプもやりたくなりますが、それはこの質問には関係ありません。:)
kthy

解決策は見つかりましたか?私は同様の問題に直面しており、いくつかの重複するポリゴンを隣人に分割したいと考えています。
DanielK 2018年

残念ながらまだ解決策はありません。私はの組み合わせを使用して進行するアイデアを持っているExteriorRingし、Intersectsしかし、休日の上にそれを仕事に時間がありませんでした。
kthy

あなたの例は部分的に自動化されているかもしれませんが、カット時にst_difference関数がひどく振る舞い、カットの端に「マウスタッチ」を残します。これにより、開発者は回避策を探す必要があり、ポリゴンのマージのケースは単純でも複雑でもかまいません。手動での修正が必要になるのはどれでしょうか。
Cyril Mikhalchenko

回答:


5

この問題の解決策が関連していて、私がそれを正しく理解している場合、その解決策は次のとおりです(元のデータは抽象であり、指定されたメートル数のバッファで交差していることがわかっているため、私の場合は2つのテーブルです。 :exper_list3およびexper_list4図1を参照):

ここに画像の説明を入力してください 1) create table exper_list5 as SELECT st_intersection (exper_list4.geom, exper_list3.geom) AS geom FROM exper_list4, exper_list3 WHERE st_intersects (exper_list4.geom, exper_list3.geom) = true; pgAdminでクエリを実行します: 結果:テーブルexper_list5図2を参照してください。

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

2)pgAdminでクエリを実行します。 create table exper_list6 as SELECT (ST_Dumppoints (geom)). Geom FROM exper_list5; 結果はドットのあるテーブルです。さらにテーブルのプロパティに移動し、gidフィールドを作成して制限を設定します。

3)QGISで、テーブル(ベクターレイヤー)exper_list6に対してボロノイポリゴンツールを実行します。結果を図3に示します。

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

4)pgAdminでクエリを実行します。 create table exper_list8 as SELECT (ST_Dumppoints (geom)).geom FROM exper_list7; 結果を図4に示します。

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

5)exper_list8からポリゴンexper_list5に入る点を選択します。pgAdminでクエリを実行し、 create table exper_list9 as SELECT st_intersection (exper_list8.geom, exper_list5.geom) AS geom FROM exper_list8, exper_list5 WHERE st_intersects (exper_list8.geom, exper_list5.geom) = true; これらの点をexper_list6テーブルの結果の図5にコピーします 。

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

6)QGISの場合テーブルexper_list6でツール「Delaunay triangulation」を実行し、結果を取得しますexper_list10図6を参照してください

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

7)テーブルexper_list10の編集モード「鉛筆」のQGISで、関心のある領域にヒットする三角形を選択し、ツール「ベクター」-「ジオプロセシング」-「機能による統合」を使用します(「選択したオブジェクトのみ」にチェックを入れます) 「分類」-すべての記号による)結果exper_list11図7;

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

8)exper_list6からexper_list11の結果をカットした図8 exper_list12;

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

9)exper_list4からexper_list11をカットし、結果の図9 exper_list13;

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

10)左のポリゴン(私の場合はexper_list4テーブル)でも同様のアクションを実行する必要があります

11)全体的な結果は、2つのテーブルexper_list13とexper_list14です(図10を参照)。

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

頑張ってください、あなたの忠実に


これは純金のように見えます。来週のどこかでテストする時間があれば、承認済みとしてマークします。ありがとう!
kthy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.