分岐した多角形の形状を検出しますか?


13

何百万ものポリゴンが連続したカバレッジを持つベクターレイヤーがあります。形状に応じて分類する必要があります。私はすでにコンパクト(のような景観生態学からいくつかの形状インデックスを使用しています4piA / P ^ 2)、平均幅(2A / P)、形状番号(P / SQRT(A) )、私も見ました、この答えをするの丸み/コンパクトさを計算しますポリゴン?

私の問題は、これらすべてのメトリックが面積と境界のある比率のみを使用していることです。フラクタル次元インデックスでさえ、面積と周囲長(2ln(0.25P)/ ln(A))のみを使用しています。しかし、面積と周囲長が同じで形状がまったく異なる2つのポリゴンをどのように区別できますか?この分岐ポリゴンAのように:

分岐ポリゴンと曲線ストリップ

曲線ストリップBと同じ面積と周囲で描画しようとしました。既知のインデックスはすべて同じです。しかし、私にとっては、単純なストリップ(新月のような曲線を含む)と複雑な分岐形状を区別することが非常に重要です。

多角形Bを意図的に直線ストリップではなく曲線ストリップとして表示します。これは、直線の細長い形状を検出する関連インデックスを知っているためですが、私の多角形も同じ外接円を持っている可能性があります。凸包を構築し、面積Apolygon / Aconvexの比率を計算しても、ここでは非常に似ているかもしれません。

それでは、ベクターデータで分岐ポリゴンAとポリゴンBを自動的に明確に区別するにどうすればよいですか?(ラスターに変換するには、非常に小さいセルサイズ、膨大なデータセット、メモリ不足が必要になるため、不可能です)。他のパラメーターを含む他の形状インデックスはありますか?理想的には、この方法は明確に分岐したポリゴンだけでなく、CとDを区別するでしょう:

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

私の唯一のアイデアは、凸包を構築し、その凸包からポリゴンを消去し、残された(大きな)ピースの数をカウントすることです(レイヤー全体ではなくポリゴンごとにポリゴンを消去します)。これは、ボーダーの複雑さを示している可能性があります。

後でPythonで実装する数学的な解決策/アルゴリズムを歓迎します。


1
多くのPythonは必要ありません。やってみて!形状!。convexHull()。symmetricDifference(!shape!)フィールド計算機。最初に小さなサブセットのコピーを試してください。正しい構文については、arcpy geometryヘルプを参照してください。
FelixIP

これは素晴らしい質問かもしれませんが、現時点では、QGISとArcGIS Desktopのどちらを尋ねているのか、Pythonを投げているのかを特定せずに、複数の質問をしています。試行した内容を正確に指定すると、潜在的な回答者があなたが行き詰まった場所を支援するのが簡単になります。あなたの最初の答えを取り残さないように、QGISに焦点を当てることをお勧めします。
PolyGeo

1
シェープファイルがすでに2 GBを超えていたため、Esriジオデータベースにデータがあります。QGISまたはどこかに実用的なソリューションがある場合、これについて何かを行うことができます。しかし、私は特定のソフトウェアの内部を求めていません。複雑な境界(分岐)を持つ形状を数学的に検出する方法であるメトリックについて質問しています。1つの質問。数式を含む科学記事も大丈夫です。自分でそれを実装する方法を考えます。
ナディア

1
私の最初の考えはあなたのものと同じで、元の凸型(または凹型)ハルから減算した後に残ったポリゴンの数とサイズの違いを調べました(アルファ形状も参照)。
user2856

1
スケルトンだけが計算に十分な速さだったら、4A / PL、面積、周囲、スケルトンの最も遠いノード間の長さを計算してコンパクトにするために使用します。同じことが最大の内接円にも当てはまります。
FelixIP

回答:


11

次の方法を見ることができます。ポリゴンをスケルトン化し、オリジナルのポリゴンに関連するラインタイプフィーチャを一意のソースポリゴンIDで処理します。推測すべきことがいくつかあると思います(たとえば、ポリラインを実際の中心線と見なす場合:ポリラインが中心線の状態に適格であるための最小の長さ)。単一のソースポリゴンの中心線の数が1を超える場合、分岐します。

分岐したポリゴンは、中心線までクリーンアップすると複数の線になりますが、直線のポリゴンには中心に1本の大きな線しかありません(実際には人間の解釈と同じです)。

例:

  • Y字を描くときは、少なくとも2つの連続したストローク(= 2ポリライン)を使用します。したがって、ストロークの最小数が1を超えるため、分岐します。
  • L字を描くときは、少なくとも1つの連続したストロークを使用します。分岐していません。

このロジックのその他の例:

  • Aを描くとき:2ストローク=分岐します
  • あなたがBを目撃したとき:3ストローク=それは分岐している
  • Cを描くとき:1ストローク=分岐しません

私は何も試していませんが、ロジックを試しているだけですが、うまくいくと思います。

参照:QGIS / Pythonまたはhttp://postgis.net/docs/ST_StraightSkeleton.htmlでベクトルをスケルトン化する

または

例

ソース:PostGIS / Pythonでの複合ポリゴンの中心線の抽出

編集:ケースCおよびDの場合、フィルター処理されたB形状(分岐なし)が既に必要です。

  • 一意のIDが中心線とソースポリゴンをリンクしていることを確認してください。
  • ポリゴンをポリラインに変換する
  • 中心線のポリラインと境界線のポリラインを通常のポイントで高密度化します(後でメモリの問題を回避するために多すぎず、不規則なビットを「キャッチ」するのに十分です)。
  • 中心線の点と境界線の点の間の距離行列を作成します
  • ID_centerline = ID_borderlineの行のみを行列の行に保持します
  • 標準偏差値を持つ統計を作成します
  • バインドされた値を設定して、SD値が高い場合に、それが非規則的な輪郭であることを示し、一意のIDごとに必要なインジケーターを作成します
  • 一意のIDに基づいてフィールドを結合することにより、インジケーターを元のポリゴンに戻します。

アイデアをありがとう、私は中心線を作成しようとします
ナディア

ちょうど、私のポリゴンCとDを区別する問題は残ります
ナディア

ケースごとに異なる方法が必要な場合があり、作業を分割します。分岐していないポリゴン(B)ができたら、Bを絞り込んでCとDを見つけます。問題は、CとDを区別するために使用するロジックが表示されないことです。基準。
gisnside

1
CとDの違いは、Cでは多角形の辺が中心線からほぼ一定の距離にあるのに対し、Dでは辺が中心線から不均一な距離にあるようです。
csk

1
@cskなるほど。それをコードに変換すると、中心線と境界線の間の距離に関する統計が計算されると思います。より多くのポイントでボーダーポリラインを高密度化してから、このボーダーをポイントに変換し、中心線上の同等のジョブから距離を置くと、この動作に関する統計が得られます。標準偏差が高い場合、形状はおそらく不規則になります。ハードもののポリゴンのtousandsにそれを行う方法を確認してください...素敵な挑戦が
gisnside
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.