Ich werde versuchen, meine eigene Frage zu beantworten - dun dun dun.
Ich habe SAGA GIS verwendet, um die Unterschiede in gefüllten Wassereinzugsgebieten mit ihrem auf Planchon und Darboux (PD) basierenden Füllwerkzeug (und ihrem auf Wang und Liu (WL) basierenden Füllwerkzeug für 6 verschiedene Wassereinzugsgebiete zu untersuchen. (Hier zeige ich nur zwei Ergebnissätze - Sie waren in allen 6 Wassereinzugsgebieten ähnlich. Ich sage "basiert", da immer die Frage besteht, ob Unterschiede auf den Algorithmus oder die spezifische Implementierung des Algorithmus zurückzuführen sind.
Wassereinzugsgebiets-DEMs wurden durch Abschneiden von Mosaik-NED-30-m-Daten unter Verwendung von USGS-bereitgestellten Wassereinzugsgebiets-Shapefiles erzeugt. Für jedes Basis-DEM wurden die beiden Tools ausgeführt. Für jedes Werkzeug gibt es nur eine Option, die minimale erzwungene Neigung, die in beiden Werkzeugen auf 0,01 eingestellt wurde.
Nachdem die Wassereinzugsgebiete gefüllt waren, habe ich den Rasterrechner verwendet, um die Unterschiede in den resultierenden Gittern zu bestimmen. Diese Unterschiede sollten nur auf das unterschiedliche Verhalten der beiden Algorithmen zurückzuführen sein.
Bilder, die die Unterschiede oder das Fehlen von Unterschieden darstellen (im Grunde das berechnete Differenzraster), sind unten dargestellt. Die Formel zur Berechnung der Differenzen lautete: (((PD_Filled - WL_Filled) / PD_Filled) * 100) - Geben Sie die prozentuale Differenz zellenweise an. Zellen mit grauer Farbe zeigen jetzt einen Unterschied, wobei Zellen mit roter Farbe anzeigen, dass die resultierende PD-Erhöhung größer war, und Zellen mit grünerer Farbe, was anzeigt, dass die resultierende WL-Erhöhung größer war.
1. Wasserscheide: Clear Watershed, Wyoming
Hier ist die Legende für diese Bilder:
Die Unterschiede reichen nur von -0,0915% bis + 0,0910%. Die Unterschiede scheinen sich auf Peaks und enge Stromkanäle zu konzentrieren, wobei der WL-Algorithmus in den Kanälen etwas höher und die PD in den lokalisierten Peaks etwas höher ist.
Klare Wasserscheide, Wyoming, Zoom 1
Klare Wasserscheide, Wyoming, Zoom 2
2. Wasserscheide: Winnipesaukee River, NH
Hier ist die Legende für diese Bilder:
Winnipesaukee River, NH, Zoom 1
Die Unterschiede reichen nur von -0,323% bis + 0,315%. Die Unterschiede scheinen sich auf Peaks und enge Stromkanäle zu konzentrieren, wobei (wie zuvor) der WL-Algorithmus in den Kanälen etwas höher und die PD in den lokalisierten Peaks etwas höher ist.
Sooooooo, Gedanken? Für mich scheinen die Unterschiede trivial zu sein und werden wahrscheinlich keine weiteren Berechnungen beeinflussen. stimmt jemand zu? Ich überprüfe, indem ich meinen Workflow für diese sechs Wassereinzugsgebiete abschließe.
Bearbeiten: Weitere Informationen. Es scheint, dass der WL-Algorithmus zu breiteren, weniger unterschiedlichen Kanälen führt und hohe topografische Indexwerte verursacht (mein endgültiger abgeleiteter Datensatz). Das Bild links unten ist der PD-Algorithmus, das Bild rechts ist der WL-Algorithmus.
Diese Bilder zeigen den Unterschied im topografischen Index an denselben Stellen - breitere feuchte Bereiche (mehr Kanal - röter, höherer TI) im WL-Bild rechts; schmalere Kanäle (weniger nasser Bereich - weniger roter, schmalerer roter Bereich, niedrigerer TI im Bereich) im PD-Bild links.
Außerdem erfahren Sie hier, wie PD mit einer Vertiefung umgegangen ist (links) und wie WL damit umgegangen ist (rechts).
Die noch so kleinen Unterschiede scheinen sich also durch die zusätzlichen Analysen zu ziehen.
Hier ist mein Python-Skript, wenn jemand interessiert ist:
#! /usr/bin/env python
# ----------------------------------------------------------------------
# Create Fill Algorithm Comparison
# Author: T. Taggart
# ----------------------------------------------------------------------
import os, sys, subprocess, time
# function definitions
def runCommand_logged (cmd, logstd, logerr):
p = subprocess.call(cmd, stdout=logstd, stderr=logerr)
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# environmental variables/paths
if (os.name == "posix"):
os.environ["PATH"] += os.pathsep + "/usr/local/bin"
else:
os.environ["PATH"] += os.pathsep + "C:\program files (x86)\SAGA-GIS"
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# global variables
WORKDIR = "D:\TomTaggart\DepressionFillingTest\Ran_DEMs"
# This directory is the toplevel directoru (i.e. DEM_8)
INPUTDIR = "D:\TomTaggart\DepressionFillingTest\Ran_DEMs"
STDLOG = WORKDIR + os.sep + "processing.log"
ERRLOG = WORKDIR + os.sep + "processing.error.log"
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# open logfiles (append in case files are already existing)
logstd = open(STDLOG, "a")
logerr = open(ERRLOG, "a")
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# initialize
t0 = time.time()
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# loop over files, import them and calculate TWI
# this for loops walks through and identifies all the folder, sub folders, and so on.....and all the files, in the directory
# location that is passed to it - in this case the INPUTDIR
for dirname, dirnames, filenames in os.walk(INPUTDIR):
# print path to all subdirectories first.
#for subdirname in dirnames:
#print os.path.join(dirname, subdirname)
# print path to all filenames.
for filename in filenames:
#print os.path.join(dirname, filename)
filename_front, fileext = os.path.splitext(filename)
#print filename
if filename_front == "w001001":
#if fileext == ".adf":
# Resetting the working directory to the current directory
os.chdir(dirname)
# Outputting the working directory
print "\n\nCurrently in Directory: " + os.getcwd()
# Creating new Outputs directory
os.mkdir("Outputs")
# Checks
#print dirname + os.sep + filename_front
#print dirname + os.sep + "Outputs" + os.sep + ".sgrd"
# IMPORTING Files
# --------------------------------------------------------------
cmd = ['saga_cmd', '-f=q', 'io_gdal', 'GDAL: Import Raster',
'-FILES', filename,
'-GRIDS', dirname + os.sep + "Outputs" + os.sep + filename_front + ".sgrd",
#'-SELECT', '1',
'-TRANSFORM',
'-INTERPOL', '1'
]
print "Beginning to Import Files"
try:
runCommand_logged(cmd, logstd, logerr)
except Exception, e:
logerr.write("Exception thrown while processing file: " + filename + "\n")
logerr.write("ERROR: %s\n" % e)
print "Finished importing Files"
# --------------------------------------------------------------
# Resetting the working directory to the ouputs directory
os.chdir(dirname + os.sep + "Outputs")
# Depression Filling - Wang & Liu
# --------------------------------------------------------------
cmd = ['saga_cmd', '-f=q', 'ta_preprocessor', 'Fill Sinks (Wang & Liu)',
'-ELEV', filename_front + ".sgrd",
'-FILLED', filename_front + "_WL_filled.sgrd", # output - NOT optional grid
'-FDIR', filename_front + "_WL_filled_Dir.sgrd", # output - NOT optional grid
'-WSHED', filename_front + "_WL_filled_Wshed.sgrd", # output - NOT optional grid
'-MINSLOPE', '0.0100000',
]
print "Beginning Depression Filling - Wang & Liu"
try:
runCommand_logged(cmd, logstd, logerr)
except Exception, e:
logerr.write("Exception thrown while processing file: " + filename + "\n")
logerr.write("ERROR: %s\n" % e)
print "Done Depression Filling - Wang & Liu"
# Depression Filling - Planchon & Darboux
# --------------------------------------------------------------
cmd = ['saga_cmd', '-f=q', 'ta_preprocessor', 'Fill Sinks (Planchon/Darboux, 2001)',
'-DEM', filename_front + ".sgrd",
'-RESULT', filename_front + "_PD_filled.sgrd", # output - NOT optional grid
'-MINSLOPE', '0.0100000',
]
print "Beginning Depression Filling - Planchon & Darboux"
try:
runCommand_logged(cmd, logstd, logerr)
except Exception, e:
logerr.write("Exception thrown while processing file: " + filename + "\n")
logerr.write("ERROR: %s\n" % e)
print "Done Depression Filling - Planchon & Darboux"
# Raster Calculator - DIff between Planchon & Darboux and Wang & Liu
# --------------------------------------------------------------
cmd = ['saga_cmd', '-f=q', 'grid_calculus', 'Grid Calculator',
'-GRIDS', filename_front + "_PD_filled.sgrd",
'-XGRIDS', filename_front + "_WL_filled.sgrd",
'-RESULT', filename_front + "_DepFillDiff.sgrd", # output - NOT optional grid
'-FORMULA', "(((g1-h1)/g1)*100)",
'-NAME', 'Calculation',
'-FNAME',
'-TYPE', '8',
]
print "Depression Filling - Diff Calc"
try:
runCommand_logged(cmd, logstd, logerr)
except Exception, e:
logerr.write("Exception thrown while processing file: " + filename + "\n")
logerr.write("ERROR: %s\n" % e)
print "Done Depression Filling - Diff Calc"
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# finalize
logstd.write("\n\nProcessing finished in " + str(int(time.time() - t0)) + " seconds.\n")
logstd.close
logerr.close
# ----------------------------------------------------------------------