ポリゴンへのライン


11

線を多角形に変換できるアルゴリズムの「名前」を見つけることができませんでした。この問題はGISと計算幾何学およびコンピューターサイエンスの分野を横断しているためです。他に何をミックスに追加するのかわかりません。他の人が検索条件の最初の選択と見なすものを知りたいので、私が検索したもののリストを提供するのは嫌です。

シナリオ...私はラインを持っています(ラインを構築するために必要な2つのポイント)...各ラインは少なくとも1つの他のラインに接続されています。接続された線の間のスペースは多角形を形成します。最も単純なシナリオは、三角形...長方形...であり、複数のセグメント化された機能に移動できます。

あいまいな説明で申し訳ありませんが、私が言ったように、私は最終的な解決策と同じくらい「最初の考え」に興味があるので、私がすでに訪れた道に考えられる解決策を導きたくありません。


線は一致しますか?線は交差できますか?(つまり、クリーンですか?)その場合、このプロセスをBuildと呼ぶことはアプリ固有ではないことを願っています。
カーククイケンドール

カーク一致線およびその他の「欠陥」は、ポリゴンを構築する前に削除されていました...さまざまなGISパッケージ(例:arcgis)に実装されていると確信している「アルゴリズム名」を見つけようとしています。要するに、すべての縮退条件が処理され、ポリゴンを構築できるノードで一致するきれいな線(2点線)が残っていることを考慮してください。重要なのは、ラインが存在し、縮退状態がなく、介在スペースをポリゴンに変換する必要があることです。ありがとう

点は平面上ですか、それとも球上ですか?
カーククイケンドール

カーク...平面上で、球面座標ではなく、メトリックx、y座標。たとえば、ボロノイ図を形成するラインセグメントはあるが、それを形成するセグメントはあるが、実際のデータ構造はつながっていないとします。つまり、すべてのセグメントが接続されており、すべてのセグメントが一意です。

回答:


4

おそらく「エリアフィル」?こちらこちらをご覧ください。

編集

別の可能性は、制約付き三角測量です。(リンクはJavaアプレットへのリンクであり、マウスを使用してグラフを描画し、平面スイープアルゴリズムを使用してそれを三角形分割します。)三角形分割の結果は、実行方法に関係なく、簡単に処理できます目的のポリゴンを作成します。新しく作成したエッジを共有するすべての隣接する三角形を単純にマージします。

元のグラフ:

元のグラフ

三角グラフ:

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


ビル私はそれに出くわしなかったので、投票に行きます...さまざまな分野の人々からの他のコメントを制限したくない。

主にラスター塗りつぶしを扱っていますが、これが最も近い答えです。ラスターまたはベクターのいずれかにアタッチされていない限り、アルゴリズム名はまだありませんが、「スイープ」アルゴリズムで十分かもしれませんが、座標がXではなくYでソートされる理由を私は理解できません(ほとんどの言語で簡単に実装できます)。

@Dan yまたはxによる並べ替えは重要ではありません。プレーンスイープまたはラインスイープアルゴリズムが関係していることも正しいですが、残念なことに、これはほとんどすべての計算幾何学的手順をカバーする一般的な手法であるため、特にアルゴリズムを検索するのに適した用語ではありません。この特定の問題は、ポリライン複合体の平面(または球体)への埋め込みを含むため、純粋なグラフ理論ではないことに注意してください。したがって、良いアルゴリズムは埋め込みに関する情報を維持する必要があります。中心に。
whuber

5

グラフ理論と呼ばれ、この動作は、計算を向いています。これは、与えられたグラフの双対の計算に関連しています。

たとえば、GeOxygèneJavaライブラリのグラフ(CarteTopoと呼ばれる)には、そのfaceを取得するメソッドgetFacesがあります。

これはJTSではポリゴン化と呼ばれます


良いリンク。ただし、それらはすべて@Danの問題が既に解決されていることを前提としています。グラフを「平面」と呼ぶことができるということは、多角形の面をすでに特定していることを意味します。彼は、(平面内の)任意の弧の集合を、まず最初に善良で誠実な平面グラフに変換する方法を知りたいと思っています。これには、DCELなどの「トポロジ」の表現を構築する必要があります。
whuber

どうもありがとう、あなたは知識の源です!誰がどのように素晴らしいことができるのだろうか。
ジュリアン

4

RepRapホストソフトウェアは、ラインセグメントのリスト(未知のランダムな順序で)をポリゴンのリストに変換します。これは、あなたがやろうとしていることに似ています。

特に、RepRap "end matching"アルゴリズムは、多数の病理学的ケースを処理します。

悲しいかな、RepRapソフトウェアは、すべてのコーナーに向かう偶数のエッジがあると想定しています。通常のオブジェクトのコーナーに向かう2本の線。あるオブジェクトの角が別のオブジェクトの角に触れると、4本の線が一緒になります。このアルゴリズムを適応して、通常はすべての角に行く3つのエッジを持つボロノイ図を処理するのがどれほど難しいかわかりません。


+1興味深い検索!ただし、このソフトウェアは、ラインをポリゴンに接続することに関連する多くの問題を解決できるように見えますが、あまりにも多くのことを行う可能性があります。機能も同様に単純化しようとしているようです。(たとえば、トポロジの整合性を破壊する可能性があります。)
whuber

3

あなたの問題を解決するためにGRASSのコードベースを調べましたか?-> http://old.nabble.com/Polyline-to-Polygon-operation-td20257839.html


1
おかげで...しかし、私は特定の「パッケージ化」ソリューションが、GISのさまざまな領域を来る基本的なアルゴリズムおよび/またはその名前を捜しているわけではない、コンプはGeomおよび/またはコンプSCIは...来てアイデアを保つ

私のリンクで言及されている2つのプロセスの背後にあるソースコードを具体的に見て、あなたに役立つかもしれないと考えていました。
-oeon

私は何かを見逃していない限り、これらのページにリストが表示されないため、コードを表示するにはソフトウェアをインストールする必要があると思います。

1
あなたは、オンラインGRASSのソースを閲覧することができます:trac.osgeo.org/grass/browser
アンダーダーク

@underdarkポインターをありがとう。私の知る限りで言うことができるようmain.cv.type、ソース、それが起こるすべての機能を境界として再ラベル付けされていることである。実際の処理は発生しません。振り返ってみると、これはそれほど驚くことではありません:フィーチャが完全な2Dトポロジ情報で維持されている場合(確かではない)、ポリゴン領域を識別するためのすべての計算は、フィーチャの作成またはインポート中に自動的に行われ、全体にわたって保持されますすべてのジオプロセシング操作。
whuber

3

ハロー

あなたが探しているのは特定のアルゴリズムだとは思いません。タスクは、データセットに応じて非常に困難な場合や非常に単純な場合があります。

問題を少なくとも2つの部分に分ける必要があります。1)ネットワーキングの問題、ラインストリングの閉じたリングを見つける方法。2)閉じたラインストリングをポリゴンとして表現する

「ラインをポリゴンに変換する」という2番目の部分は、ポリゴン/ラインストリング表現よりも多くの形式に依存します。私はから行くことを意味します:

LINESTRING(1 1、2 2)
LINESTRING(2 2、2 1)
LINESTRING(2 1、1 1)


宛先:POLYGON((1 1,2 2,2 1,1 1))

線を多角形に変換していますが、あなたが話していることではないでしょう。より難しい部分は最初のものです。ラインのスパゲッティがある場合、それらを閉じたラインストリングとして注文する方法。

その質問に対する答えは、データセットの多くに依存すると思います。カークが尋ねたように、線が問題を越えることができるかどうかははるかに大きい。すべての「ラインコレクション」が閉じたラインストリングの一部であることがわかっている場合は、簡単になります。その後、任意の線をつかみ、再び戻るまでパスを歩き回り、上記のステップ2に進みます。

私のポイントは、データセットの条件がその方法に関するすべてのルールを設定するということです。線ストリングのスパゲッティですべての可能なポリゴンを検​​索する場合、すべての交差点に頂点ポイントを配置したり、すべての可能なパスを検索したりするために、多くの異なるアルゴリズムが必要になると思います。

PostGISでは、この関数はST_Polygonizeと呼ばれます。 この関数は、指定したラインストリングからすべての可能なポリゴンを作成します。

GEOSによって実行されるため、GEOSとJTSの両方のコードの背後にあるアルゴリズムを見つけることができます。

いくつかの考え

/ Nicklas


1

「Forward Star」アルゴリズムを検索してみてください。私はそれが一般的であると言われました、しかし、私が今まで読んだそれについての唯一の議論は、常にarcgisに関してです。これらの講義ノートで引用されているフォワードスターの参考文献を調べてください。


1
このコメントは、提案されたソリューションの他のいくつかにも対応していますが、問題ネットワーク(またはグラフ)で表すことはできませんが、ここでコメントします。2次元表面内で線がどのように接続されているかに関する情報が必要です。したがって、前方/後方の星の表現はほとんど役に立ちません。DCELまたはそのようなものが必要です。
whuber

@whuber-すべての「欠陥」が削除されたというDanのコメントは、行がきれいであることを暗示していると思っていました。そのため、これをグラフ内のすべてのサイクルを検出するグラフ走査問題に減らすことができるはずです。最初に、フォワードスターは、各ノードで可能な限り鋭い右折を行うグラフを歩き回るアルゴリズムを支援すると考えました。しかし、もう少し見てみると、もっと良い方法があるようです。stackoverflow.com/questions/261573/… それでも、これは問題をグラフとして表現できると仮定しています。
カーククイケンダル

1
グラフでサイクルを見つけることは、平面グラフで面を見つけることと同じではありません。頂点{a、b、c、d}とエッジ{a、b}、{a、c}、{b、c}、{b、d}、{c、d}の抽象的なグラフを考えてみましょう。サイクルの基礎は、a-> b-> d-> c-> aおよびa-> b-> c-> aで構成されます。平面埋め込みa->(0,1)、b->(2,2)、c->(2,0)、d->(3,1)(すべてのエッジは線分)、サイクルa-> b-> d-> c-> aは面ではありませんが、dを(1,1)に移動する、面になります。これは、「顔」の概念がグラフを平面に埋め込む必要がある理由と、グラフの抽象的な構造から顔を純粋に計算できない理由を示しています。
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.