凹包の定義、アルゴリズム、実用的なソリューションとは何ですか?[閉まっている]


116

凸包

形状の凸包は次のように定義されます:

数学では、実ベクトル空間Vの点Xの集合の凸包または凸包絡線は、Xを含む最小の凸集合です(ウィキペディア

ウィキペディアは、ラバーバンドの類推を使用してそれをうまく視覚化し、それを計算するためのいくつかの優れたアルゴリズムがあります。

凹船体

凹包は下の画像の赤い線を使用して視覚化されます(青い線は凸包を視覚化します)。直観的には、すべてのポイントを包含するポリゴンですが、凸包に比べて面積が小さい(最小?)その結果、ポリゴンの境界の長さが長くなります。

凹型の船体は、いくつかの現実世界の問題の解決策になる場合があります(たとえば、都市の合理的な境界を見つける)。

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

凹包の概念に対する適切な定義、アルゴリズム、実用的な解決策を見つけることができませんでした。草ウィキは、いくつかの説明とイメージを持っている、との商業ソリューションがありconcavehull.comが

アイデア、アルゴリズム、リンクはありますか?


どのようなコンテキストで凹型のハル/アルファ形状を生成したいですか?PostGIS、ArcMap、ウェブマップ、あなた自身のソフトウェアでは?
fmark

PostGISと私自身のPythonスクリプトの両方。
アダムマタン

凹包アルゴリズムの実装のC ++ Linux互換バージョンはありますか?
Sylv255

新しい質問がある場合は、[ 質問する ]ボタンをクリックして質問してください。コンテキストの提供に役立つ場合は、この質問へのリンクを含めてください。- 口コミより
悪の天才

計算幾何アルゴリズムライブラリ(CGAL)は、Alpha Shapesを備えたC ++ライブラリです。Linuxのダウンロードがあり、バージョン> = 4.0のGPL / LGPLとしてライセンスされています。
-klewis

回答:


57

SCWが指摘する、あなたはの実装欲しいα-図形を

アルファ形状は、凸包の一般化と考えることができます。それらは1981年に最初に記述されました:

エデルスブルナー、H .; カークパトリック、D。Seidel、R .; 、「平面上の点の集合の形状について」、情報理論、IEEE Transactions on、vol.29、no.4、pp。551- 559、1983年7月

興味のある環境向けのオープンソース実装があります:

PostGIS

PostGISスタックを使用している場合、pgRoutingのオプションのDriving Distance拡張機能は、アルファ形状の実装を公開します。ただし、アルファパラメータを変更できるかどうかはわかりません。

使用法は次のとおりです。

SELECT the_geom AS alpha_shape 
FROM 
  points_as_polygon(
    'SELECT id, ST_X(your_geom) AS x, ST_Y(your_geom) AS y FROM your_table');

Python

おそらくあなたが使用できる多くのpythonモジュールがあります。C ++計算ジオメトリライブラリであるCGALについて良いことを聞いたことがあります。 Pythonラッパーは、CGALのアルファ形状の実装Pythonに公開するなど、CGALの一部に存在します。

CGALの一部はQPLの下でライセンスされていることに注意してください。つまり、CGALにリンクされたプログラムを配布する場合は、QPLの下でリリースする必要があります。プログラムコードまたはバイナリを再配布しない場合は、コードの所有権を保持して構いません。


CGALのPythonラッパーをコンパイルできません。これらはしばらくサポートされておらず、最近のバージョンのCGALでは動作しなくなったようです。
-conradlee

2
@fmark:あなたが投稿した2番目のリンクは死んでいるようです。
radek

1
@fmark PostGISリンクは死んでいるようです
。.-radek


29

これは、特定のアプリケーションであるように思わアルファシェイプ私の読書からこの問題のより一般的な形式です。Rにはalphahullモジュールがあり、これにはアルファ形状の計算に関する優れたドキュメントがあります。また、アルファ形状のこの詳細な背景を確認してください。凸包/ 凹包のみを計算したい場合は、lastoolsの一部であるlasboundaryをチェックしてください。これはうまくスケーリングし、数百万の入力ポイントを処理できます。

最後に、Flickrによるこのアルファ形状の興味深いアプリケーションは、少し前にラウンドを行い、ユーザーが生成したポイントコンテンツを集約するためのユーティリティを示しました。

flickrからのテキサスのアルファハル


1
OMGソースはFORTRANで書かれています:-)
Adam Matan

より適切な場合は、C ++で記述されたclustrパッケージがあります。ただし、CGALのライセンスに注意してください:github.com/straup/Clustr
scw

2
実世界の良い例です。
DavidF


19

[lasboundary] [1,2]という非常に効率的なツールを作成しました。これは、LAS / LAZ / SHP / ASCII形式のLIDARの凹包を計算し、ESRI Shapefile形式またはgeoのベクトル境界ポリゴンとして結果を保存します-参照KMLファイル。

以下に実行例を示します。

C:\lastools\bin>lasboundary -i SerpentMound.las -o SerpentMound_boundary.shp
reading 3265110 points and computing convex hull for 3265110 points
growing inward towards concave hull (with concavity = 50)
outputting the concave hull
concave hull has 1639 points

結果の写真がここにあります



10

以下は、アルファハルモデルを実装するR関数です。出力はspポリゴンオブジェクトです。ヘッダーの例をご覧ください。sp、alphahull、maptoolsパッケージが必要です。

**更新(2018年1月15日)alphahullパッケージによって生成されたオブジェクトには、多数の変更が加えられました。そのため、関数を書き直す必要がありました。spatialEcoパッケージにconvexHull関数を追加しました。ただし、alphahullパッケージのライセンス制限により、この機能はGitHubの開発バージョンでのみ使用可能です。開発バージョンは、次を使用してインストールできます。

library(devtools)
install_github("jeffreyevans/spatialEco")

以下は関数の使用例です

library(sp)
library(spatialEco)
data(meuse)
 coordinates(meuse) = ~x+y
a <- convexHull(meuse, alpha=100000)
  plot(a)
    points(meuse, pch=19)

結果のSpatialLinesDataFrameをSpatialPolygonsDataFrameに変換します

library(sf)
a <- sf::st_as_sf(a) 
a <- sf::st_polygonize(a)
class( a <- as(a, "Spatial") )
  plot(a)

複数のアルファ値をテストする

par(mfcol=c(2,2))
   for (a in c(500, 1500, 5000, 100000)) {
   ch <- convexHull(meuse, alpha = a)
     plot(ch)
      points(meuse, pch=19)
        title( paste0("alpha=", a))      
   }

さまざまなハルアルファパラメーター


1あなたは、これがどのように異なるか説明してもらえアルファ形状のパッケージ
whuberの

3
alphahullオブジェクトの出力は行列として保存され、使用可能なspオブジェクトに強制する必要があります。これは、GIS形式にエクスポートできるポリゴンを作成するための「ヘルパー」機能と考えています。この関数は、alphahullパッケージを使用してハルマトリックスオブジェクトを作成し、spオブジェクトを作成してから、ポリゴンスロットを爆発させて、シングルパートポリゴンデータフレームオブジェクトにします。パッケージのヘルプには何も表示されませんが、気付いていないspクラスオブジェクトへのネイティブ強制が新しく実装される可能性があります。この場合は、この機能を廃止できるようにお知らせください。
ジェフリーエヴァンス

プログラミング言語とは何ですか?
アダムマタン

@JeffreyEvansに感謝します。パラメーターについて説明していただけますか?リンクされたjstatsoftの論文を見てきましたが、それは非常に理解しにくいものです。
地理理論16

9

JTS(http://tsusiatsoftware.net/jts/main.html)は、Convex Hullの実装を提供します。Martin Daviesさんは、アルファシェイプアルゴリズムが機能していることにも言及しているので、SVNリポジトリをチェックして、まだ入っているかどうかを確認してください。


私が知る限り、2012年6月の時点でまだ凹型のハル/アルファ形状の実装はありません。
blah238


JTSは生きていますか?最終バージョンは2006年12月19日です。vividsolutions.com
jts/

答えのリンクを試してください
イアンタートン

JTSは現在Githubにあり、アプローチバージョン1.15です:github.com/locationtech/jts私の知る限り、Alpha Shapesの実装はまだないようです。
コリンウッドベリー


7

Cで書かれたプログラムは、凸包、アルファ形状、デラウニー三角形分割、ボロノイボリュームを計算します。

  • ハル -ケンクラークソン(2002)

CおよびJava実装の別の凸包アルゴリズムは次のとおりです。


7

この投稿の以前の回答に追加するには、少なくともQGIS 2.6の時点では凹包アルゴリズムがあります

パラメーター
入力ポイントレイヤー[ベクター:ポイント]
パラメーターの説明をここに入力

しきい値(0-1、1は凸包と同等)[数値]
ここにパラメーターの説明を入力
デフォルト:0.3

穴を許可[ブール値]
ここにパラメータの説明を入力
デフォルト:True

分割マルチパートsinglepartsジオメトリ[ブール]へのジオメトリ
デフォルト:false

出力凹包[ベクター]
出力の説明をここに入力

コンソール使用
処理.runalg( 'qgis:concavehull'、入力、アルファ、穴、no_multigeometry、出力)

また、Esriにはツールの最小境界ジオメトリ(データ管理)があります

凸包を含むジオメトリタイプを選択できます

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



3

質問の「適切な定義」の部分を支援するため。https://en.wikipedia.org/wiki/Convex_hullを見 て、「適切な」定義と見なすことができるものを見つけたかもしれませんが、不足していることがわかったので、おそらく「有用な」定義は次のとおりです。

凸包の内側のすべてのポイントについて、ハル内にない任意のポイントへの直線は、ハルと1回だけ交差します。

これは、ポイントが与えられると、それを通る線を作成し、その作成された線が船体のセグメントと交差するかどうかをテストできるため便利です。

  • ポイントが船体にない交差点はありません。
  • ポイントがハル上にある1つの交差点。
  • ポイントが船体内にある2つの交差点
  • 直線は凸包と2回以上交差できません

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