web-dev-qa-db-ja.com

2D凹型ハルを生成する効率的なアルゴリズムはありますか?

GISファイル(市街地図)からの(2D)ポイントのセットがあるので、その地図(その境界)の「輪郭」を定義するポリゴンを生成する必要があります。その入力パラメーターは、ポイントセットと「最大エッジ長」になります。次に、対応する(おそらく非凸)ポリゴンを出力します。

これまでに見つけた最良の解決策は、ドローネ三角形を生成し、最大エッジ長よりも長い外部エッジを削除することでした。すべての外部エッジがそれよりも短い後、内部エッジを削除して、必要なポリゴンを取得します。問題は、これは非常に時間がかかり、より良い方法があるかどうか疑問に思っています。

59
Fabio Ceconello

This 論文では、平面内の点のセットの形状を特徴付けるための効率的な単純なポリゴンの生成について説明し、アルゴリズムを提供しています。 Java同じアルゴリズムを利用するアプレット here もあります。

2
Amirali

私たちの研究室の元学生の1人は、博士論文のためにいくつかの適用可能な技術を使用しました。それらの1つは「アルファシェイプ」と呼ばれ、次の論文で参照されていると思います。

http://www.cis.rit.edu/people/faculty/kerekes/pdfs/AIPR_2007_Gurram.pdf

その論文はあなたが従うことができるいくつかのさらなる参考文献を提供します。

10
nsanders

答えはまだ他の誰かにとって興味深いかもしれません:マーチングスクエアアルゴリズムのバリエーションを適用できます。 scalesポイントの平均密度に依存します。スケールは互いに整数倍にする必要があります。たとえば、効率的なサンプリングに使用できるグリッドを構築します。これにより、空のsamples = squares、完全にポイントの「クラスター/クラウド」内にあるサンプル、およびそれらの間にあるサンプルをすばやく見つけることができます。後者のカテゴリは、凹型の船体の一部を表すポリラインを簡単に決定するために使用できます。

このアプローチではすべてが線形であり、三角測量は必要ありません。アルファ形状を使用せず、ここで説明する商用/特許の提供とは異なります( http://www.concavehull.com/

2
monnoo

男たち here は、「点の数にほぼ線形」で動作する点のセットの凹包を決定するためのk最近傍アプローチを開発したと主張しています。悲しいことに、彼らの論文は非常によく守られているようで、あなたは them に尋ねなければならないでしょう。

ここに 良い参照のセット があり、上記を含み、より良いアプローチを見つけるように導くかもしれません。

2
Vinko Vrsalovic

Bing Maps V8インタラクティブSDKには、高度なシェイプ操作内の凹型ハルオプションがあります。

https://www.bing.com/mapspreview/sdkrelease/mapcontrol/isdk/advancedshapeoperations?toWww=1&redig=D53FACBB1A00423195C53D841EA0D14E#JS

ArcGIS 10.5.1内で、3D Analystエクステンションには、凹型ハル、球体、エンベロープ、または凸型ハルのジオメトリタイプを持つ最小バウンディングボリュームツールがあります。どのライセンスレベルでも使用できます。

ここに凹型ハルアルゴリズムがあります: https://github.com/mapbox/concaveman

1
Jaybird64

簡単な解決策は、多角形のエッジを歩くことです。点P0とP1を接続する境界から現在のエッジが与えられた場合、境界P2の次の点は、Aが最小の点になります。ここで、

H01 = bearing from P0 to P1
H12 = bearing from P1 to P2
A = fmod( H12-H01+360, 360 )
|P2-P1| <= MaxEdgeLength

次に設定します

P0 <- P1
P1 <- P2

始めたところに戻るまで繰り返します。

これはまだO(N ^ 2)なので、ポイントリストを少し並べ替える必要があります。たとえば、都市の重心から方位をソートする場合、各反復で考慮する必要があるポイントのセットを制限できます。

1
Mike F

このプラグインを使用してQGISで実行できます。 https://github.com/detlevn/QGIS-ConcaveHull-Plugin

データとのやり取りにどのように必要かによって、ここでどのように行われたかを確認する価値があります。

1
Cameron

クイック近似解(凸包に対しても有用)は、東西の各小さな要素の北と南の境界を見つけることです。

必要な詳細に基づいて、上限/下限の固定サイズの配列を作成します。各ポイントについて、それがどのE-W列にあるかを計算し、その列の上限/下限を更新します。すべてのポイントを処理した後、欠落した列の上部/下部のポイントを補間できます。

また、非常に長い薄い形状について事前に簡単なチェックを行い、ビンNSまたはEwにするかどうかを決定します。

1
Martin Beckett

良い質問!私はこれをまったく試していませんが、私の最初のショットはこの反復法です:

  1. セットN(「含まれていない」)を作成し、セット内のすべてのポイントをNに追加します。
  2. Nから3つの点をランダムに選択して、初期ポリゴンPを形成します。Nから削除します。
  3. some point-in-polygon algorithm を使用して、Nのポイントを確認します。Nの各ポイントについて、Pに含まれている場合は、Nから削除します。Nのポイントが見つかったらすぐにそれがまだPに含まれていない場合は、手順4に進みます。Nが空になれば、完了です。
  4. Aを見つけたポイントを呼び出します。Aに最も近いPのラインを見つけ、その中央にAを追加します。
  5. 手順3に戻る

私はそれが十分に機能する限り機能すると思います—最初の3つのポイントに適したヒューリスティックが役立つかもしれません。

幸運を!

1
Rob Dickerson

乱暴に採用されたリファレンスとして、PostGISは凸包から始まり、それを洞窟に入れます。ここで確認できます。

https://github.com/postgis/postgis/blob/380583da73227ca1a52da0e0b3413b92ae69af9d/postgis/postgis.sql.in#L5819

0
Evan Carroll