アークのセットからカバレッジ+オーバーラップを計算するアルゴリズム


10

肥料を散布するトラックが農場に移動する経路を表す弧を含むシェープファイルがあります。

散布幅が30mであることを知っているとしましょう。つまり、トラックは車両の両側15mに肥料を散布できます。

次のような一連のポリゴンを生成したいと思います
。1)肥料を受け取った総面積
2)オーバーラップの面積、つまり2つの別々のパスが近すぎて、農場の一部が2倍の正しい「線量」を受け取った場合"肥料の。

素朴なアプローチは、アークの周りのバッファとしてカバレッジポリゴンを作成することです。これは、スプレッドラインが互いに異なる特別な場合に機能します。ただし、トラックは徐々に減少するスパイラルでファーム内を移動する可能性があり、単純なバッファーは、スパイラルの2つのパスが接近しすぎているオーバーラップを表示できません(スパイラルが単一の円弧の場合、重複部分のない単一のポリゴン)。

関連性がある場合は、TatukGIS VCL DKを使用していますが、具体的なソリューションではなくアルゴリズムを実際に探しています。

これまでの議論に応じた明確化:

1)特定のメタデータ(GPSログや拡散率など)を持つベクターデータに依存できません。ユーザーがレイヤーを選択してスプレッド幅を指定できるようにすると、レポートが実行されます。

2)レポートの目的は、実際にユーザーに車両オペレーターの「スキル」を示すことです。ここで、「スキル」とは、「重なりが最も少なく、カバレッジが最も高い」ことを意味します。

3)ラスターランドよりもベクターランドの方が快適なので、ベクターベースのソリューションを優先します。

おかげで、

ダレン。


1
これは予想される嵐の経路に基づいて累積降水量を予測する方法に似ているのだろうか。
カークカイケンダル

回答:


3

おそらく最も簡単な解決策は、単一のジオメトリをセグメントに分割し、それらの個々のセグメントをバッファリングすることです。らせんの場合、各アークをバッファリングしてから、個々のアークを交差させて数を計算します。セグメント自体の左と右にのみ、セグメントの端をバッファリングしないことにより、誤ったオーバーラップを回避するように注意してください。

別のアプローチは、ポリゴングリッドをデータにオーバーレイし、各グリッドセル内で、交差するすべてのラインセグメントを個別にバッファーすることです。これを正確に行うには、分析中のグリッドセルを取得してバッファリングし、交差するセグメントを収集してバッファリングし、元のセルウィンドウ内で分析を実行します。

これらのオプションのいずれかで重複の妥当な見積もりが得られるはずですが、より正確なアプローチをいくつか考えることができますが、データについて何かを知っている必要があります。


ありがとう。私はあなたの最初の提案の線に沿って考えていました-ジオメトリをセグメントに分割してそれらをバッファリングします。コーナーの角が丸くなるように、セグメントの端もバッファリングする必要があると思います。私が直角の線で始まる場合を考えてください-端をバッファリングしない場合、角の外側に正方形が欠落している2つの重なり合う長方形ができます(テキストとして表現するのは難しい!)
dbruning 2011

コーナーの角が丸くなるように、セグメントの端もバッファリングする必要があると思います。さらに、各セグメントのバッファーを前のセグメントのバッファーと交差させ、各バッファーの「新しい」部分だけをマスターバッファーに蓄積することを考えていました。以前のセグメントとのオーバーラップを無視するという考えですが、ピックアップは古いセグメントとオーバーラップします。
2010

2

解決策はありませんが、いくつかの入力:

この問題は、マップの一般化における線合体検出問題に似ています。これは、曲がりくねった線に大きなスタイルが適用されると発生します(シンボルの自己重複)。

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

このドキュメントpp。176から180(フランス語...申し訳ありません)は、このような自己交差部分を検出するアルゴリズムを提供します。原理は、scwによって提案されているように、セグメントと0、1、または2つの円弧で構成される各セグメントの片側バッファを使用することです。JTSに便利なこの片側バッファの実装が含まれています。


自己交差の検出について心配しているのはなぜですか?そして、なぜ「片側」バッファを提案するのですか?どちらも問題に密接な関係はないようです。
whuber

目的は、トラックが肥料を数回散布する場所、つまり散布エリアが自己交差する場所を検出することです。
julien

2

ベクトルソリューションは、潜在的に重要な変数である時間、およびそれを介して拡散率を見逃します。トラクターの動きが速くなると、単位面積あたりの肥料散布量が少なくなり、移動速度が遅い(ターンに減速して1つから加速する)と、単位面積あたりの肥料散布量が多くなります。さらに、トラクターが旋回中に資材を広げている場合、資材は旋回の内側に向かって集中し、外側に向かって集中しなくなります。

時間データは、トラクターの進行状況のGPSレコードで利用できます。勾配(移動距離を経過時間で割ったもの)は、すべてのポイントで速度を推定します。あるいは、(近似として)フィールドの内部では一定の速度を想定し、フィールドの境界の適切な内部バッファでは低速を想定するかもしれません。

ラスター表現はこれらの問題を処理できます。 トラクターの経路をラスタライズします。これにより、トラクタが通過していないすべてのセルがNoData値(またはゼロ)に設定されます。トラクターが標準の一定の速度で移動する場合は、各データセルに一定の値を設定するだけで十分です。たとえば、トラクターがこの速度の2倍で動いている場合、(おそらく)散布量は半分になり、これはセルの値を半分にすることで表すことができます。

一般的に、任意のセルに配置する値は、単位面積あたりの塗布率です。トラクターが、毎秒x Kgの肥料を均一に散布していて、速度がy m / secの速度で走行している場合は、 x / y Kg / sec / [m / sec] /(2 * 15 m)= x /(30 y)Kg / m ^ 2肥料。したがって、x /(30 y)は各セルに入力する値です。 xが与えられ、yがGPSデータから計算されます。

自己交差は原則として問題ありません。トラクターの経路がそれ自体と交差する場合は、セルを再び通過するたびに寄与度を追加します。グリッドの作成方法やGISソフトウェアの機能によっては、これを実現するために特別な処理が必要になる場合があります。

その準備が完了すると、残りは速くて簡単です。このグリッドの焦点合計は、半径15 mの円形の近傍を使用して、すべてのセルの単位面積あたりの累積量の広がりを見つけます。


1
+1カーネル(トラクターを表す)が(各行ではなく)パスに沿って移動できるツールがある場合、この問題はより扱いやすくなります。
カークカイケンダル

@Kirkカーネルでは、パスや行などをたどる必要はありません。フォーカルサムに伴う視点の変化を理解することが重要です。問題を点の経路から拡散することの1つとして見るのではなく、フィールド内のすべての点でどれだけの材料が蓄積するかを計算することの1つとしてそれを見てください。 。明らかに、それは同じソリューションで同じ問題です。移動カーネルアプローチ(および提案されたバッファリングアプローチ)は、最初の視点を取ります。フォーカルサム、2番目。ただし、フォーカルサムツールを使用できます。移動カーネル計算はそうで​​はありません。
whuber

概説するラスターアプローチは、速度と拡散率がわかっている場合に最適な方法だと思います。残念ながら、この特定のシナリオでは、どちらもわかりません。エンドユーザーはこのカバレッジレポートへの入力として任意のレイヤーを選択でき、特定のメタデータを持つジオメトリに依存することはできません。
dbruning '22

@dbruningこのアプローチは既知の速度/拡散率を必要としないようです。あなたがそれらを持っている場合、それはそれらを可能にします(+現実のより正確なモデル)。ただし、システムから必要なメトリック(総面積カバレッジ;重複面積)を取得するために、セルのしきい値とカウントをいくらか必要とすることにもなり、精度のトレードオフもそこに含まれます。
ダンS.

@dbruningスプレッドレートがわからない場合は、相対的なスプレッドレートが表示されます。速度がわからない場合でも、人々がトラクターを運転する方法を知っている(または知っておくべき)ので、相対速度の合理的な推定値を導き出せるはずです。一定の速度と一定の散布量を想定している場合でも、妥当な答えが得られます。彼らは、トラクターのルートのまっすぐな部分でのバッファーベースの回答に同意します。そして、それらは湾曲した部分でより現実的になりそうです。
whuber

2

StackExchangeプロトコルについて100%確信がないので、これを私の質問への回答として投稿します。とにかく使ってしまった答えです。

基本的なアルゴリズムは次のとおり
です。1.レイヤー上のジオメトリを分割幅の1/2以下のセグメントに分割します。
2.セグメントごとに:
-形状に沿って後方を見て「ローリングバッファー」を作成し、それらのセグメントの累積長がスプレッド幅よりも小さい前のすべてのセグメントをバッファーします(バッファー半径=スプレッド幅の1/2)
-作成次のセグメントだけの「次のセグメントバッファー」(バッファー半径=スプレッド幅の1/2)
-「次のセグメントバッファー」から「ローリングバッファー」を差し引いて「新しいバッファー」を取得
- 「すべての新しいバッファー」を結合ポリゴンを組み合わせて、シェイプごとに1つのポリゴンを取得します。

基本的にこれにより、スプレッダー車両のドライバーはオーバーラップペナルティなしに直角(またはより広い)ターンを行うことができますが、「古い地面」に広がるほど急激に曲がると、オーバーラップが発生し始めます。

青のオーバーラップ

スパイラルは私がそれを望んでいるように見えます:

螺旋

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