Die Methode, die ich in einigen Sprachen implementiert habe und die von ESRI verwendet wird (leider keine anderen Referenzen als Jenson und Domingue, die an anderer Stelle auf dieser Seite zitiert werden), besteht darin, an einer vom Benutzer bereitgestellten "Pour-Point" -Zelle oder einer Zelle zu beginnen Untersuchen Sie am Rand des Strömungsrichtungsgitters (fdr) seine acht Nachbarn, um herauszufinden, welche von diesen direkt in die aktuelle Zelle fließen, und ordnen Sie diese Zellen der aktuellen "Wasserscheide" im Ausgangsgitter zu. Dann ruft sich die Funktion rekursiv einmal für jeden der einströmenden Nachbarn auf. Dieser Vorgang wird wiederholt, bis alle einströmenden Zellen für einen Stockpunkt erschöpft sind, und wird dann für alle Stockpunkte wiederholt.
Das Design des rekursiven Algorithmus kann ziemlich teuer sein, da es möglicherweise versucht, viele Daten im Speicher zu halten, die Seite auf die Festplatte austauschen muss und daher im Allgemeinen unter I / O-Verlangsamungen leidet.
(Siehe Whubers Kommentar unten zu verschiedenen Rekursionsmethoden, wenn Sie RYO wollen.)
_____________ BEARBEITEN _____________
Als Beispiel habe ich meinen alten C-Code ausgegraben (Hinweis: Obwohl die meisten Python-Spieler möglicherweise aus dem Raum rennen möchten, sollte dies nicht schlecht sein). Ich dachte, es könnte interessant sein, dies zu veranschaulichen. Obwohl ich erst jetzt oberflächlich mit der Rekursion "Breite zuerst" und "Tiefe zuerst" vertraut bin, denke ich, dass meine Routine tatsächlich Tiefe zuerst ist (und dass meine obige Beschreibung der natürlichen Sprache irreführend war), basierend auf diesem Stackoverflow-Posting (hoffentlich @ whuber oder eine andere Person, die klüger als ich ist, kann dies bestätigen / ablehnen).
Code: Erklärung: idir
ist das Raster der Durchflussrichtungswerte. offset
bezieht sich auf die zentrale Zelle, die gerade analysiert wird, und off
überprüft jeden Nachbarn dieser Zelle. Dies ruft eine andere Funktion auf, does_it_flow_into_me
die einen Booleschen Wert zurückgibt, um festzustellen, ob das Flussverzeichnis der benachbarten Zelle auf die aktuelle Zelle zeigt. Wenn dies für einen Nachbarn zutrifft, kehren Sie zu diesem Ort zurück.
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 */
}