PostGISで「細長い」ポリゴンを特定する


10

私は、都市の近所など、広いエリアを表す一連のポリゴンを持っています。それらの間の大きな重なり合う領域を識別したいと思います。

しかし、問題があります。これらのポリゴンは、周囲に沿ってオーバーラップすることがあります(精度がほとんどないために描画されたため)。これは、私が気にしない長くて狭いオーバーラップを生成します。

ただし、ロバストポリゴンの大きなオーバーラップが発生する場合もあります。これは、近隣のポリゴンが別のポリゴンとオーバーラップする大きな領域を意味します。これらだけを選択したい。

オーバーラップのみの以下の図を参照してください。左下隅の青いポリゴンだけを選択したいと想像してください。

重なる

エリアを確認することもできますが、狭いエリアが非常に長く、青いポリゴンと同じ大きさのエリアになることがあります。面積/周長の比率を計算しようとしましたが、それでも結果はまちまちです。

私もを使用してみましST_MinimumClearanceたが、広い領域に狭いパーツがアタッチされていたり、2つの非常に近い頂点がある場合があります。

他のアプローチのアイデアはありますか?


最後に、@ Cyrilと@FGregで提案されているように、ネガティブバッファーを使用するのが最も効果的でした。

私は次のようなものを使用しました:

ST_Area(ST_Buffer(geom, -10)) as neg_buffer_area

私の場合、単位はメートルなので、10 mのネガティブバッファーです。

狭いポリゴンの場合、この領域はゼロを返しました(また、ジオメトリは空になります)。次に、この列を使用して狭いポリゴンを除外しました。


4
確かに、面積/周長比をこれに使用できます。
Vince

個別のポリゴンが画像からどこにあるのかを見分けるのは難しいですが、このようなgis.stackexchange.com/a/265233/64838のようなことはうまくいくかもしれませんか?最小回転バウンディングボックスを計算してから、幅または高さが小さいバウンディングボックスを破棄します。
FGreg

ここで説明するように、ネガティブバッファーを使用してみることもできます。シェープファイルで本当に薄いポリゴンを特定するにはどうすればよいですか?
FGreg

回答:


5

私はそれが薄いポリゴンを食べるなら負のバッファを作成しようとします、それからそれが良いです、それがポリゴンを食べないならそれは私のものです... :-)

以前に線形ポリゴンの幅の2/3を設定して、このスクリプトを実行します...

create table name_table as
SELECT ST_Buffer(
(ST_Dump(
(ST_Union(
ST_Buffer(
(geom),-0.0001))))).geom,
0.0001)) as geom from source_table

OS:-)...


結局、あなたの提案が私にとって最も効果的でした。私は次のようなものを使用して終了ST_Area(ST_Buffer(geom, -10))-10は、私の場合は-10メートルです。その式から何かが0を返した場合、それを除外できます。
bplmp

9

面積/周長の代わりに、周長の2乗で割った面積(またはその逆)を使用することをお勧めします。

これは「形状インデックス」とも呼ばれます。面積で割った外周の2乗の最小値は4 * Pi()(ディスクの場合、これは最もコンパクトな2Dジオメトリです)なので、簡単に4 * Pi()で正規化できます。解釈(1に近い正規化された値は、非常にコンパクトなオブジェクトがあり、正方形の値が約1.27であることを意味します)。

編集:エリアのしきい値は、非常に小さいアーティファクトを削除するのに役立ちます。次に、形状インデックスはより良いコントラストを示します。編集:この回答に加えて、ST_Snapを使用すると、問題が発生する前に問題を解決できます。


ありがとう!しかし、この場合、ST_Snapがどのように役立つかわかりません...うまくいけば、あなたは次のようなことを提案してい(o.overlap_perimeter^2 / o.overlap_area) / (4 * Pi()) as overlap_ratioますか?これは私にとって、面積/周囲よりも悪い結果をもたらしています。
bplmp

現在o.overlap_perimeter / (4 * sqrt(o.overlap_area)) as overlap_ratio、この論文に従って使用していますが、さらに悪い結果です(これは、私が何を意味するかを定量化するのは難しいですが)isprs-ann-photogramm-remote-sens-spatial-inf-sci.net/I-7/135/…、ページ183.
bplmp

2
おかげさまで「形状指標」を聞いたことがありませんでした。この種の質問に答えるには、最小外接長方形を使用するのが最良の方法であると常に考えていました。これを見つけました、repository.asu.edu / attachments / 111230 / content / …、興味深いです。
John Powell

@JohnPowell興味深い論文、ありがとう。論文では、形状指標として知っているものを真円度指標と呼んでいます。最小外接長方形の私の問題は、非常に凹型のオブジェクト(U字型など)では機能しないことです
radouxju

@bplmp ST_Snapは、「ほぼ」隣接するポリゴンの頂点をスナップして、重複しないようにします。フィギュアにはスケールはありませんが、アーティファクトは線のように見えるので、アーティファクトを回避するのに十分な許容値を使用できますが、大きなポリゴンには影響しません。
radouxju

5

1つのオプションは、ポリゴンの面積と、その端を使用して描画できる最長の線の比率を使用することです。細長いポリゴンの識別。

select * from polygons where ST_Length(ST_LongestLine(geom, geom)) < ST_Area(geom) * 4

これは、細長いポリゴンではかなりうまく機能します。ニーズと投影に合わせて、比率(面積を掛ける比率)を調整できます。


1

これはあなたのユースケースと一致するようです:選択したポリゴンを削除します

入力レイヤーの選択されたポリゴンを、それらの共通の境界を消去することにより、特定の隣接するポリゴンと結合します。隣接するポリゴンは、面積が最大または最小のポリゴンか、削除するポリゴンと最大の共通境界を共有するポリゴンのいずれかです。

エリミネイトは通常、細長いポリゴン、つまり、入力の境界が類似しているが同一ではないポリゴン交差プロセスの結果である小さなポリゴンを取り除くために使用されます。

「最大の共通境界」オプションを試してみたいと思います。


今、あなたはqgisソリューションではなくpostgisソリューションを求めていたと思います。申し訳ありませんが、postgisには同等の機能はないと思いますが、後世のために残しておきます。
FGreg

0

これは、PostGISトポロジ拡張の完璧な使用例のように見えます。トポロジの許容差パラメーターは、頂点が他の既存のポリゴンにスナップすることを許可する距離を決定し、ソースデータの低精度に対処し、それをクリーンアップします。

つまり、戦略は次のとおりです。

1.トポロジー拡張を有効にする

CREATE EXTENSION postgis_topology;

2.新しい空のトポロジを作成します

SELECT topology.CreateTopology('neighborhoods_topo', 4326, 1e-7);

3番目のパラメーターは、CRSの単位での許容誤差です。賢く選択してください。理想的には、単位がメートルのCRSが必要です。WGS 84別名4326のように、CRS単位がメートルでない場合は、を使用ST_Transformしてポリゴンを再投影します。

3.ポリゴンテーブルにTopoGeometry列を追加します

SELECT topology.AddTopoGeometryColumn('neighborhoods_topo', 'public', 'neighborhoods', 'topogeom', 'POLYGON');

これは新しいを返しますlayer_id。保存してください。後で必要になります。1ゼロから始めるとレイヤーになり、新しい呼び出しごとに増加します。

4.すべてのポリゴンをトポロジに追加します

UPDATE public.neighborhoods
SET topogeom = topology.toTopoGeom(geom, 'neighborhoods_topo', 1, 1e-7);

大規模なデータセットの場合、これには数時間かかることがあります。1以前に返されたlayer_idです。

5.いくつかの近所に現れる顔を見つける

2つ以上のトポロジに存在するトポロジからすべての面を検索します。クエリは演習のままにしておきます。最も簡単なのはおそらくGetTopoGeomElements関数で、次にフェイスIDでグループ化し、カウントが2以上のものを調べます。または、topogeom列からクリーンアップされたジオメトリを使用して新しいテーブルを作成し、それを標準のジオメトリにキャストするだけでtopogeom::geometry、すでにあるものを繰り返すことができますが、スライバーの重複のないクリーンなデータセットを使用できます。

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