ArcGIS Watershedツールで使用されるアルゴリズムは何ですか?


10

(Spatial Analystパッケージの)ArcGIS Watershedツールで使用されているアルゴリズムの種類を知っている人はいますか?

EsriのWebサイトで提供されている情報はほとんどありません...

私はこれらのArcGISオンラインヘルプページを見てきました。

それで、はい、それは流れ方向ラスターを使用しますが、ラスターを横断するためにどのアルゴリズムを使用していますか?

「D8を使用しています」という答えは探していません。D8は実際にはアルゴリズムではなく、使用するアルゴリズムの定義に役立つモデルです。IEでは、深さ優先検索アルゴリズムおよび/または幅優先検索アルゴリズム内にD8スキームを実装できます


ジェームズ、私も同じことをやっています 私はpythonを使用しています。私たちの進歩について話しましょう。

私もPythonを使用しています。私は流れ方向グリッドを計算し、そこから先に進むという簡単な問題から始めています。
James

回答:


6

私がいくつかの言語で実装し、ESRIが使用していると信じている方法(申し訳ありませんが、このページの他の場所で引用されているJensonとDomingue以外のリファレンスはありません)は、ユーザー指定の「pour-point」セルまたはセルから開始することですフロー方向グリッド(fdr)の端で、8つの隣接セルを調べて、現在のセルに直接流入するフローを見つけ、それらのセルを出力グリッドの現在の「流域」に割り当てます。次に、関数は、流入する各近傍に対して再帰的に自分自身を呼び出します。このプロセスは、すべての流入セルが流出点まで使い果たされるまで繰り返され、その後すべての流出点で繰り返されます。

再帰的アルゴリズムの設計は、大量のデータをメモリに保持しようとする可能性があり、ディスクにスワップ/ページングする必要があり、そのため一般にI / Oの速度低下に苦しむため、かなり高価になる可能性があります。

(RYOを行う場合は、再帰のさまざまな方法について、下記のwhuberのコメントを参照してください)

_____________ 編集 _____________

例として私の古いCコードを掘り出します(注:ほとんどのpythonerは部屋から実行したいかもしれませんが、悪くないはずです)。説明するのは興味深いかもしれないと思いました。私は今、幅優先と深さ優先の再帰で表面的にはなじみがありますが、このスタックオーバーフローの投稿に基づいて、私のルーチンは本当に深さ優先(そして上記の私の自然言語の説明は誤解を招くものである)だと思います(うまくいけば@ whuberまたは私が確認/拒否できるよりも賢い別の人)。

コード:説明:idir流れ方向の値のラスターです。offset現在分析されている中央のセルを参照し、offそのセルの隣接セルをそれぞれチェックします。これは、別の関数を呼び出します。この関数はdoes_it_flow_into_me、隣接するセルのflowdirが現在のセルを指しているかどうかに関するブール値を返します。ネイバーがtrueの場合、その場所に再帰します。

void shed(int init_x, int init_y, int basin_id){

int i, j, offset, off, flow_dir;

offset = ((init_y - 1) * nc) + (init_x - 1);
*(basin + offset) = basin_id;


/* kernel analysis */
for (i = -1; i <  2; i++) {
    for (j = -1; j <  2; j++) {
        if ((i) || (j)) {

            off = offset + (j * nc +  i);
            flow_dir = *(idir + off);


            if (does_it_flow_into_me(i,j,flow_dir)){
                shed(init_x+i, init_y+j,basin_id);
            }
        } /*not center */
    } /* do - j */
} /* do - i */
}

幅優先の再帰について説明します。小さなスタックによって、メモリをほとんど必要としない効率的な深さ優先の再帰を実装できます。主なパフォーマンスの問題は、グリッドのタイルをRAMに繰り返しRAMからスワップアウトする必要がある場合がある大きな流域に関係します。ただし、他の回答へのコメントで説明したように、実際の問題は、D8の方向が一意に決定されていないセル、特に広範囲の平らな水平パッチ(予備のシンク充填ルーチンによって作成されたパッチなど)内にあるセルの扱いに関係しています。
whuber

間違いなくゴミのゴミ出し問題。私とほとんどのGIが行うことは、入力をクリーンアップしません。ハックに磨きをかけるために、深さ優先の再帰を調べる必要があるようです。
Roland

これはごみだとは思いません-実装がどのように分解されたかに関係なく、元の入力は誰かのD8コーディングではなくDEM自体であることに注意してください-しかし、それは間違いなく挑戦です。現実の世界には、流れの方向を特定するのが難しいほど平坦な場所がたくさんあります。静的な水域は良い例です。実際には、湖やその他の平らな場所の出口を見つける必要があり、複数の出口がある平らな場所に対処する必要があります。これには、ローカルでない検索が必要ですが、これは困難です。
whuber

私はおそらく混乱しています。私たちは、help.arcgis.com / en / arcgisdesktop / 10.0 / help ../ index.html#//…について議論していると思います。これは、入力としてflowdirを取ります。残りを十分に読まなかったら、雑草に引き込まれたくない!
Roland

いいえ、私はあなたが正しいと思います。質問を読み直すと、想定していたより一般的な状況ではなく、入力としてフロー方向ラスターの処理に特に焦点が当てられていることがわかります。そのため、直接対処するため、および洞察と役立つポインタを使用して、回答を+1してください。
whuber

4

ArcGISのヘルプは言います:

流域は、流れの方向を計算し、それを流域ツールで使用することにより、DEMから描くことができます。寄与領域を特定するには、流れ方向ツールを使用して、流れの方向を表すラスターを最初に作成する必要があります。

流れ方向は、D8メソッドを使用してDEMから計算されます。ここで、フローは、セルごとに計算され、8つの隣接セルのうち、このセルからの水が流れる先として計算されます。

Rho8、Froh8、Stream Tubesなど、D8には多くの代替手段がありますが、ArcGISを含むほとんどのGISソフトウェアは、他よりも単純で計算負荷が少ないため、D8を使用する傾向があります。


数年前、私はWatershed Delineationプロジェクトに取り組んでおり、D8メソッドを使用するArcGISが原因でいくつかの問題に直面していました。2つの主な問題は

  • D8は単一方向フローのみを許可します。水は、1つのセルから一方向にのみ流出できます。
  • 生成されたストリームフローには、対角軸に沿って大きなバイアスがありました。これにより、奇妙に見えるストリームが発生しました。

私たちのデータから、これら2つの問題が大きな問題であることを知っていたため、ハイブリッド手法を使用して流れ方向を生成するためのツールをいくつか開発しました。

私の最初の仕事の1つは、集水域計算ツールをリバースエンジニアリングすることでした。論理的には非常に単純であることがわかりました。特定のポイント(流動点とも呼ばれます)の集水域を検索するには、まず、それが属するセルを検索します。多くの場合、所定の許容範囲内で最大の流量の累積があるポイントにスナップしようとします。

このセルの場合、そのセルに寄与する近傍内のすべてのセルが見つかります。これらの近傍セルのそれぞれについて、それらに寄与するセルなどを見つけます。新しいセルが見つからなくなるまで、この反復プロセスを続けます。稜線または分水界の境界に達したときです。

ASCIIラスタに対してこれを実行する私の単純なコードは、ArcGISのWatershedツールと比較すると、ほぼ同様の出力を提供することがわかりました。境界にいくつかのセルの違いがあったこともあるので、ArcGISは変更されていないD8アルゴリズムに従っていると確信しています。


詳しい説明ありがとうございます。しかし、流域を見つけるためにD8方向を使用するためのアルゴリズムは何ですか?dmahrの回答に続くコメントを参照してください。
whuber

こんにちは、ありがとうございます。しかし、これは実際には質問の答えにはなりません。「このセルの場合、そのセルに寄与する近傍内のすべてのセルが見つかります。これらの各近傍セルの場合、それらに寄与するセルなどが見つかります」という文をそれに当てはめます。その検索を実装するための多くの異なるアルゴリズムがあります。問題はどれ
James

4

これは以前に尋ねられましたが、おそらく少し異なる状況にあります。Spatial Analystの水文学的ツールセットのすべてのジオプロセシングツールは、フロー方向の仕組みのページで説明されているようにD8フロー方向モデルを使用します

流れが進むことができる8つの隣接するセルに関連する8つの有効な出力方向があります。このアプローチは一般に8方向(D8)フローモデルと呼ばれ、Jenson and Domingue(1988)で提示されたアプローチに従います。

ジェンソンとドミンゲ(1988)の論文のコピーはこちらから入手できます

入力としてフロー方向ラスターを使用するすべてのツールは、関連付けによってこのフロー方向モデルを利用します。これには、流域、流れの累積、流れの長さ、充填などが含まれます。


だから私はフォローアップ質問になると思います、そのアルゴリズムは集水域を返すようにどのように修正されますか?
James

流域ツールは、流動点から流れ方向ラスターを上に移動します。これはFlow Accumulationツールの逆ですが、セルの数を表す出力ラスターの代わりに、流動点のIDを報告します。
dmahr 2014年

1
わかりました、もう少し具体的にする必要があると思います。私はそれが何をするかの概念を知っています。実装されているアルゴリズムがわかりません。つまり、ある種の検索アルゴリズムであると思いますが、それでも可能です。幅優先、深さ優先、反復深化深さ優先など...
James

1
ありがとうdmahr。@whuber:私の知る限りでは、検索アルゴリズムが異なると結果がわずかに異なる可能性がありますか?そして、はい、一般的なアルゴリズムを見つけることは問題ではありませんが、ESRIが流域固有の領域(DTMの平坦な部分など)をどのように処理するかを学ぶことは役に立ちます。
James

1
James最後のポイントを明確にするために質問を編集してください。そうしないと、このスレッドは役に立たない「それはD8だ」という回答の収集を停止します。(何である D8のコメントに関する役立つことは、あなたがユニークな流れ方向のグラフにそのD8リードを受け入れる場合は、存在することであるユニークな流域は、グラフ自体の特性であるため、流域描写問題に対する正しい解決策は、。このように存在する場合(a)「流域」の定義、(b)D8方向の計算方法、または(c)水平セル(つまり、固有のD8方向のない)の処理方法)にある
曖昧さ

0

この質問についてさらに考えるために、流域解析を円弧で実行しました。(塗りつぶされた)DEMを取り、流れの方向を計算し、以前に計算された河川ネットワーク上の場所に対応するいくつかのポイントを配置しました。私は 'watershed'ツールを実行しました、そしてそれは私にいくつかの素晴らしい盆地を与えました。

流域イメージ

次に、Pythonでクイック検索アルゴリズムをコード化し(上記の回答のように)、フロー方向グリッドを検査してフローパスを「追跡」します。各ノードについて、8つの隣接ノードを検査し、隣接ノードが現在のノードに流れ込む場合は、隣接ノードを入力として同じ関数を再帰的に呼び出します。

疑似コード

class d8():
    def __init__(self, arr):
       self.catchment = set()
       self.arr = arr

    def search(self, node):
        """ Searches all neighbouring nodes to find flow paths """ 

        # add the current node to the catchment
        self.catchment.add(node)

        # search the neighbours, ignore ones we already visited
        for each_neighbour:
            if neighbour is in self.catchment:
               do nothing

            # if the neighbour flows into the current node, visit that neighbour
            elif neighbour_flows_into_me:
               self.search(neighbour)

私は同じ流れ方向入力グリッドと同じ点の1つを使用してその関数を実行しました。問題は、アークがそのポイントの約40000セルの集水域を返す場合、私のアルゴリズムは72セルを返すだけです。

誰かが私が間違っていることを知っていますか?

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