私がいくつかの言語で実装し、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 */
}