バラバラのポリゴンからボロノイ図のようなモザイクを作成する


12

次の図は問題を示しています

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

以下のように(a)は私が持っているジオメトリとして、ばらばらのポリゴンの集合を PostGISのインチ (b)のようなものが必要です。このセットのポリゴンの 「モザイク」は、「影響領域」基準によって構築されます...ボロノイ構造のようなものです((c)で示されています):実際、ポリゴンがポイント、影響領域はボロノイです。

要約:互いに素なポリゴンのセットの「モザイク」を生成するSQLアルゴリズム(またはPostGIS固有のアルゴリズム)が必要です。 (おそらく、小さなST_BufferおよびST_Difference操作のループ)

PS:ボロノイのように、スペースの区切り((b)の四角い枠)を無視する必要があります。


この問題は、回線に関するこれと似ています

編集(@FelixIPコメントの後)

私はに滞在するpreffer ベクトル(例:使用して精度を失っていないし、宇宙ST_DelaunayTrianglesを彼らが適応さ、オリジナルのポリゴンで内装をし、加減算デュアルグラフソリューションをのような)...いくつかの簡単な自動パッケージpprepairよう支援(QGISトポロジカルツール自動ではありません)。ただし、ラスターはおそらくよりシンプルであり、CPUの消費量は少ないでしょう。

この「GRIDプロセス」の図は、同じ精度と「ユークリッド影響領域の成長」を可能にすることを前提として、ソリューションとしても有効です。

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

ARCGISにはEuclidean Allocationとして知られる空間解析ツールが存在するため、おそらく、ポリゴンのセット(ポリゴンの分類、ラスタライズ、および折り返し)から始まるPostGIS同様のソリューションがあります。


@Nirに感謝します。ポイントの混乱を申し訳ありません。私はポイントを使用していません。イラストの項目(a)および(b)としてポリゴンのみを使用しています。
ピータークラウス

arcgisには、eucledeanの割り当てまたは近接と呼ばれるラスターソリューションがあります
-FelixIP

@FelixIPに感謝します。「ラスターソリューション」に編集しました;-)
ピータークラウス

extent.aspolygonからポリゴンを消去すると、ポリゴンが残ります。それのスケルトンgis.stackexchange.com/questions/177/…は、あなたが推測する必要があるものです。実装は、しかしとても重要である
FelixIP

1
@Cyril、スクリプトを確認できます...来週。最新のPostGIS機能を備えたソリューションと思われるものを投稿することは、良い第一歩です。
ピータークラウス

回答:


1

それで、私はあなたのためにケーキを準備します-あなたが要求したように、PostGisツールを使用してフルーツプラッター、質問を正しく理解した場合、そして前述したように、PostGISオーブンの操作の責任は彼女の創造的なチームが負担します。

私はユーモラスなスタイルで誰にも怒られず、ゲームとしてそれを理解するようお願いします!

元のファイルは、スライスされたフルーツと単純な形状(以下、フルーツと呼びます)です。以下の図1を参照してください。

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

ここに私のレシピがあります、そして、私はあなたが後で学ぶ親愛なるプログラマーによってこれで助けられます。始めましょう。このために、果物を置く生地を作成し、その生地でスクリプトを実行します。

create table poly_extent as SELECT ST_SetSRID(ST_Buffer(ST_Envelope(ST_Extent(geom)),0.05),4326) as geom FROM poly;

下の図2の結果を参照してください

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

さて、私の写真のように果物が少ない場合は果物の外部バッファーの境界線を作成し、果物が多い場合はスクリプトを実行する負のバッファーの境界線を作成します。

create table poly_buff_dump as SELECT ((ST_Dump(ST_Boundary(ST_Union(ST_Buffer((geom),0.01, 'join=mitre mitre_limit=5.0'))))).geom) geom FROM poly;

そして、各果物の周りにバッファラインをスライスします

UPDATE poly_buff_dump SET geom=ST_RemovePoint(geom, ST_NPoints(geom)-1) WHERE ST_IsClosed(geom)=true; 下の図3の結果を参照してください

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

(実際には、結果として破線(円など)が表示されると思っていましたが、数字が難しい場合は、折れが発生することがあります(たとえば、長方形の片側が落ちたなど)。 )

次に、取得した行を便利な方法で均等なセグメントに分割し、それらからポイントを抽出する必要があります

create table poly_buff_dump_pt as SELECT (ST_DumpPoints((geom))).geom geom FROM poly_buff_segm;

結果、下の図4を参照

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

ここでVoronoiツールを実行します。この場所では、リンクMickyT:https ://gis.stackexchange.com/a/172246/120129によって提案されたツールを使用し ました。その結果、「voronoi」という名前のテーブルが作成されます。 「私の最初のアシスタント」はシェフとは別のシェフだからです!:-)。

このステップの2番目の方法は、ST_VoronoiPolygons関数を実行することです。

結果、下の図5を参照

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

次に、スクリプトを実行して余分な部分を切り取ります。

create table poly_voronoi_cut as SELECT ST_Intersection(a.geom, b.geom) geom FROM voronoi a INNER JOIN poly_extent b ON ST_Intersects(a.geom, b.geom); 結果、以下の図6を参照してください。

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

次に、LineStringのジオデータタイプを揃えるためにスクリプトを実行します。

create table poly_voronoi_dump as SELECT (ST_Dump(geom)).geom as geom FROM poly_voronoi_cut; そして今、私は「二人目の仲間」に任務を任せ、ケーキウェル(Jeff- https: //gis.stackexchange.com/a/785/120129)を混ぜて、それを単一の層に平準化するよう依頼します。、私に感謝します!

CREATE TABLE poly_overlay_cut AS SELECT geom FROM ST_Dump(( SELECT ST_Polygonize(geom) AS geom FROM ( SELECT ST_Union(geom) AS geom FROM ( SELECT ST_ExteriorRing(geom) AS geom FROM poly_voronoi_dump) AS lines ) AS noded_lines ) ); さあ、仕事に取り掛かる時間です。そのためにスクリプトを実行します。

create table poly_voronoi_union as SELECT b.id, (ST_ConvexHull(ST_Union(a.geom, b.geom))) geom FROM poly_overlay_cut a INNER JOIN poly_buff_dump b ON ST_Intersects(a.geom, b.geom) GROUP BY b.id, a.geom, b.geom; および別のスクリプト:

create table poly_voronoi_union_area as SELECT ST_Union(ST_ConvexHull(ST_BuildArea(geom))) as geom FROM poly_voronoi_union GROUP BY id; 下の図7を参照してください

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

図からわかるように、カットには小さなレイヤーがあり、ST_SnapToGridを使用する(または別の方法で)オプションとして削除できます:

そして最後に、パイから焼いたフルーツを切り取ります。オーブンのそばに立って少し疲れさえしました:-)

create table polygon_voronoi_result as SELECT (ST_Dump(ST_Difference(a.geom, b.geom))).geom as geom FROM poly_voronoi_union_area_snap as a JOIN poly b ON ST_Intersects(a.geom, b.geom); 結果は図8を参照 ここに画像の説明を入力してください

この日からのすべて、今では誰もがおいしいパイを焼く方法を学びます-フルーツの盛り合わせ。すべて自分自身を助けて、みんなのために十分なように、あなたが作品を選択してください。

(電子ケーキではなく、実際のケーキではすべての人に食べ物を与えることができないのは残念ですが、おそらく飢は地球で終わるでしょう...)

編集:パイの桜は次のようになります:-):

WITH
tbla AS (SELECT (ST_DumpPoints(geom)).geom geom FROM poly),
tblb AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tbla),
tblc AS (SELECT ST_Intersection(a.geom, b.geom) geom FROM tblb a JOIN poly_extent b ON ST_Intersects(a.geom,b.geom)),
tbld AS (SELECT id, ((ST_Dump(geom)).geom) geom FROM poly GROUP BY id, geom)
SELECT id, ST_Union(a.geom) as geom FROM tblc a JOIN tbld b ON ST_Intersects(a.geom, b.geom) GROUP BY id;

または

WITH
tbla AS (SELECT (ST_DumpPoints(geom)).geom geom FROM polygons),
tblb AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tbla),
tblc AS (SELECT id, ((ST_Dump(geom)).geom) geom FROM polygons GROUP BY id, geom)
SELECT id, ST_Union(a.geom) geom FROM tblb a JOIN tblc b ON ST_Intersects(a.geom, b.geom) GROUP BY id;

君は良かったし、Mr.Baker、ありがとう、そして幸運をありがとう、:-)...

オリジナルのソリューション。

このスクリプトは、ST_VoronoiDiagramsFromPolygonsと呼ばれます。


1
こんにちは、良いイラスト、そして良い結果のようです(!)。簡潔な議論への提案は、@geogeekソリューションを参照してください、QGISの手順は、ここでのPostGISの主要なステップだ...なぜ電子の必要性 ST_BufferST_ConvexHull?代替アルゴリズムはありますか?
ピータークラウス

1)ボロノイ関数の適用中に元の図形間の分離線を減らすために、ST_Bufferおよびonポリゴンが作成されます。したがって、指定できるバッファーサイズが大きいほど、分離線はよりスムーズに構築されます。ボロノイ関数... 2)各ポリゴンの多数の図形からのST_ConvexHull、必要なポリゴン... 3)今日、これはあなたの質問を解決するという私のビジョンです、私たち全員に何が起こるかわかりませんそして将来的には私たちの決断...
シリルM

バッファラインのもう一つの重要な価値が...彼らは私たちがそれぞれの形状を合わせたポリゴンを作成するために、ボロノイの関数の結果から断片を選択するのに役立ちますということです
シリル・M

ところで、結果を悪化させないように、コードとアプローチの改善を歓迎します...
Cyril M

1
こんにちはCyril、ST_Bufferは等高線を完全に正規化するのに最適なオプションであることに同意します(!)。についてST_ConvexHullは、好奇心にすぎず、図6の後poly_voronoi_unionにST_ConvexHullなしでどのような結果を得ることができますか。
ピータークラウス

8

Postgisにはvoronoi専用の機能はありませんが、Qgisにはポイントからボロノイポリゴンを作成できるvornoi関数が含まれているため、qgisを使用してこれらの結果を得るには次の手順に従いました。

- extract nodes関数を使用してポリゴンからポイントを作成します。

-Qgisでvoroi関数を使用してvornoiポリゴンを作成します。

-Qgisで空間結合を作成します。

-結果を解決します。

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


1
素敵な解決策(!)、イラストに感謝します。強化できますか?やって可能である強化おそらく...(lostingが三角形にされている)、それはボロノイで4ポイントであった、と長方形の中心は何representantionを持っていない、その地域を歪める、下の左の四角形を参照してください各ポリゴンの定期的なサンプリングを ...とおそらくいくつかの内部ポイント。
ピータークラウス

ArcGISで高密度化ツールを使用します。これにより、近接ポリゴンが大幅に改善されます。+1
FelixIP 16

3

OK-これについて少し考えてみたところ、最近見たもののようでした。

開始ポリを取ります:

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

数値(私の場合は100)で新しい属性を生成しますVector-> Research tools-> Random points inside polygonsツールを使用して、各ポリゴン内に(100)ポイントを生成します: ここに画像の説明を入力してください

次に、ベクター->ジオメトリツール-> Voronoiを使用して、そのポイントレイヤーに基づいてポリゴンを生成します。

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

これで、ベクター->空間クエリツールを使用できます。1つのポリゴン(またはポリゴンの1つ)に属するポイントを選択します。空間クエリツールを使用して、そのポリゴンに適用するボロノイポリゴンの選択を生成します。対象のポリゴンに対応する属性をvoroniポリゴンに追加します。(1、2、3、4を使用しました)

これで、新しい属性に基づいて[ベクター]-> [ジオプロセシングツール]-> [ディゾルブ]を実行できます。

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


ありがとう@AAmes(!)、イラストが良好で、かつ方法が良い代替である...しかし、質問は約ある「SQLアルゴリズム(またはPostGISのためのいくつかの具体的な)」と今、およそ恵みの使用機能ST_VoronoiPolygons()、おそらくすべての問題をワンクリックで解決します;-)
ピータークラウス

@AAmesクイック検索で、このメソッドがPostGISでも実際に使用できることが明らかになりました。postgisで多角形にランダムなポイントを作成する方法は、多角形からのポイント作成を説明しており、そこからはかなり簡単です。
フィルG

私の恵みは、(!ここでは歓迎)が、インセンティブとして、あなたにしたTHIS IS ANSEWER WORNG質問や報奨金の要件について。
ピータークラウス

ピーターに感謝します。私はあなたのメモを見ましたが、残念ながら私は戻ってそれに対処する機会がありませんでした。私はまだPostGISの経験がなく、あらゆる種類の良い応答を提供するために利用できる時間よりも多くの時間がかかりました。この空間の調査が将来の人々に役立つことを願っています。もしPostGISにひびが入ったら、すぐに戻って練習のためにもう一度やってみましょう!
AA

2

ランダムポイントは、ポリゴンからボロノイポリゴンを生成するための優れたアイデアです。かなりうまく機能しますが、ポリゴンが互いに近接している場合はかなり悪いです。 ここに画像の説明を入力してください ここに画像の説明を入力してください

ST_ApproximateMedialAxisは、PostGISを使用する場合のもう1つの優れた代替手段です。 ポリゴンのボロノイ図の計算

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.