D8アルゴリズム、PythonおよびMatplotlibを使用した湖の識別およびフローアルゴリズムの実装。
このコードは、DEMおよび降雨データを使用してフローアルゴリズムを実装します。さらに、ピットフラグ /湖を識別および埋め、湖の流出に向かって重力モデルを使用して排水アルゴリズムを開発します。排水アルゴリズムの詳細と擬似コードについては、www.geo-blog.com/lake-flow-algorithmを参照してください。
コードは4つの異なるタスクに分割されます(driver.pyのコメントを参照)。
出力図「ネットワーク構造 - 湖の前」は、ピットフラグを削除する前にフローネットワーク構造を表示します(ネットワークは接続されていません)。

この図の背景は標高を表しており、黄色が高いラスターセルを表し、青色は低いラスターセルを示しています。線はフロー方向を表します。フロー方向は、O'Callaghan&Mark(1984)によって導入された標準アルゴリズムD8で計算されます。これは、8つの隣接セルを調べ、フロー方向を最低隣接に設定します(Flow.PyのFlowrasterクラスの方法も参照)。さらに、隣接する細胞がセル自体よりも低い場合、図1の赤い点が「ピットフラグ」を表します。 Pitflagsは、ダウンノードを持たないラスターセルです。つまり、このセルから他のセルに水が流れません。
タスク2は、タスク1からネットワーク構造を使用してフローレート(一定の降雨量を仮定)を計算します。フロー率は再帰関数getflow()で計算されます。ネットワークがまだ結合されていないため、湖 /ピットフラグでは水が消えるように見えることに注意してください。

この図は、一定の雨(セルあたり1mm)の河川流量を示しています。黄色の値は高流量を示し、青い値は低流量を示します。
タスク3は、コンセントントでない降雨を使用してタスク2を繰り返します(ランダムに生成されました)
タスク4は、集水域に参加することにより、水文学モデルをより現実的にします。これを行うために、シンクと湖が特定され、湖の流出が計算されます。これは3つのステップで実行されました。まず、湖は各ピットフラグから始まり、常に最低の隣接を選択してエッジへのパスを作成するアルゴリズムによって識別されます(D8アルゴリズムと同様)。このパスの最高点は、湖の流出を表しています。 2番目のステップでは、特定された湖は流出と同じ高さまで満たされます。第三に、湖の流出に向かって重力を備えた新しい流れが各湖について計算されます。
実装されたアルゴリズムをテストするために、エッジのピットフラグでの入っている降雨と合計流量を比較しました。 2つの値は同じでなければなりませんでした。
湖の流出に向かって重力で流れを計算するためのアルゴリズム。



タスク5の場合、実際のラスターデータ(降雨とDEM)がインポートされ、同じ解像度に変換されます。
