PostGISのラインからポリゴンを作成する


13

ポリゴンをラインから小さなポリゴンに分割しようとしていますが、st_split関数を使用できないと思います。必要なのは、ラインストリンググリッドを使用して、大きなポリゴン内に小さなポリゴンを作成することです。

いくつかの方法を試しましたが、結果を得ることができません。私が試したもの:

st_split()を使用してLineStringから1つのポリゴンを分割します

境界ポリゴンから。

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

そして、線ストリング表:

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

次のポリゴンが必要です。

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

問題:複数のラインからポリゴンを分割することはできません。マルチラインストリングからポリゴンを分割することもできません。

私が試みているもう1つの方法は、st_polygonize()でラインからポリゴン作成することです

SELECT 
   g.path[1] as gid, 
   g.geom::geometry(polygon, 22033) as geom 
FROM
   (SELECT 
     (ST_Dump(ST_Polygonize(geom))).* 
   FROM linestable
) as g;

PostgreSQLおよびPostGISを使用してラインセグメントからポリゴン作成することから抽出

問題:ポリゴン(境界)を1つしか取得できません。

誰かがラインストリングからポリゴンを取得する最善の方法だと教えてもらえますか、または何かが足りない場合は?

注:テーブルは同じSRIDにあり、ジオメトリはグリッドにスナップされます。QGISでは、ラインからポリゴンへのポリゴン化プロセスを完全に実行できます。

ジョンの要求として、ここにラインストリングテーブルがあります。 https://drive.google.com/file/d/0B603y_m735jfS014S0EyVnpMUEU/view?usp=sharing


1
線ストリングのジオメトリをどこかに投稿できますか?ST_DumpとともにST_Polygonizeが機能するはずです。
ジョンパウエル

承知しました。表へのリンクを使用して投稿を編集しました。
パブロ・パルド

@JohnPowellakaBarçaはこれを見ることができます。この質問は素晴らしいです。サンプルセットのST_Polygonizeは、単一のポリゴンを返します。本質的に、開いているLINESTRINGSの混乱を分解し、長方形を作成できるものをすべて見つける必要がありますか?
エヴァンキャロル

1
@EvanCarroll。承知しました。私は非常に忙しいATMなので、おそらく数日間はそうではありません。
ジョンパウエル

1
@ppardoz。Espero que esto te ayude。テーブルの定義がすべてスペイン語であることに気付きました:
ジョンパウエル

回答:


4

最初にST_NodeST_Collectと組み合わせて使用して、MultiLinestring内のノード化された一連のラインストリングにラインを変換することで、これを機能させました

ST_Nodeのドキュメントで述べているように:

すべての入力ノードを保持しながら、可能な限り少ない数のノードを使用して一連のラインストリングを完全にノード化します。

これが意味することは、ポリゴンの外部リングに相当するものを構成するために、すべての可能性のある組み合わせですべての線ストリングが結合されるということです。一方、LineStringのセットをST_Polygonizeしようとすると、それ自体はポリゴンを記述しませんが、単にLineStringを取得します。したがって、これは機能します:

WITH multi(geom) AS (
  SELECT ST_Node(ST_Collect(geom))
  FROM leyenda_digitalizar00
)
SELECT ST_AsText( (ST_Dump(ST_Polygonize(geom))).geom )
FROM multi;

この最初の部分、つまりCTE multiを実行すると、出力は次のようになります。

MULTILINESTRING((204.5 69.9000000000004,204.5 69.9000000000004)、(204.5 68.9,205.4 68.9)、(204.5 68.9,204.5 69,204.5 69.1,204.5 69.2,204.5 69.3,204.5 69.4,204.5 69.5,204.5 69.6,204.5 69.7,204.5 69.8,204.5 69.9、 204.5 69.9000000000004)、(209.5 68.9,209.5 68.8,209.5 68.7,209.5 68.6,209.5 68.5,209.5 68.4,209.5 68.3,209.5 68.2,209.5 68.1,209.5 68,209.5 67.9,209.5 67.8,209.5 67.7,209.5 67.6,209.5 67.5,209.5 67.4 、209.5 .......

これで、このMultiLinestringをST_Polygonizeにフィードすると、期待どおりに機能します。たとえば、

ポリゴン((205.4 68.9,204.5 68.9,204.5 69,204.5 69.1,204.5 69.2,204.5 69.3,204.5 69.4,204.5 69.5,204.5 69.6,204.5 69.7,204.5 69.8,204.5 69.9,204.5 69.9000000000004,205.4 69.9,205.4 69.3,205.4 68.9))

POLYGON((204.5 69.9000000000004,204.5 70,204.5 70.1,204.5 70.2,204.5 70.3,204.5 70.4,206.8 70.4,209.5 70.4,209.5 70.3,209.5 70.2,209.5 70.1,209.5 70,209.5 69.9,205.4 69.9,204.5 69.9000000000004))

ポリゴン((206.8 70.4,204.5 70.4,204.5 70.5,204.5 70.6,204.5 70.7,204.5 70.8,204.5 70.9,204.5 71,204.5 71.1,204.5 71.2,204.5 71.3,204.5 71.4,206.8 71.4,206.8 70.4))

明らかに、ST_AsTextは単に説明のためのものであり、パスIDも必要な場合は調整する必要があります。

重要な点は、ST_Polygonizeは、ポリゴンのアウトラインを既に記述しているラインストリングを想定していることです。これは、上記でST_Node(ST_Collect(....が行うことです)。


これは本当にクールです。このソリューションが機能することを確認できます。なぜフリップ側では、私は疑問に思うST_Polygonize()それが行の文字列、またはどのようなユースケースを呼び出すことなく、そのためであるかかると言うST_Node()最初の
エヴァンキャロル

1
@EvanCarroll。答えは、ST_Polygonizeはすでにポリゴンを表すセットにあるラインストリングを取得するのに対して、この質問のラインストリングは複数の可能なポリゴンを構成するものだと思います。私の理解では、これはST_Nodeが行うことです。さらに調査して、回答を更新しようとします。
ジョンパウエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.