ฉันจะพยายามที่จะตอบคำถามของตัวเอง - dun dun dun
ฉันใช้ SAGA GIS เพื่อตรวจสอบความแตกต่างของแหล่งน้ำที่เต็มไปด้วยเครื่องมือบรรจุแบบ Planchon และ Darboux (PD) (และเครื่องมือการเติมแบบ Wang and Liu (WL) สำหรับแหล่งต้นน้ำที่แตกต่างกัน 6 แห่ง (ที่นี่ฉันจะแสดงผลลัพธ์สองชุดเท่านั้น - มันมีความคล้ายคลึงกันในทั้ง 6 ลุ่มน้ำ) ฉันพูดว่า "อิง" เพราะมีคำถามเสมอว่าความแตกต่างนั้นเกิดจากอัลกอริทึมหรือการใช้อัลกอริทึมเฉพาะอย่างหรือไม่
DEM ที่อยู่ในลุ่มน้ำนั้นถูกสร้างขึ้นโดยการตัดข้อมูล NED กระเบื้องโมเสค 30 ม. โดยใช้ USGS ที่ให้รูปร่างของต้นน้ำ สำหรับแต่ละ DEM พื้นฐานเครื่องมือทั้งสองถูกเรียกใช้ มีเพียงหนึ่งตัวเลือกสำหรับแต่ละเครื่องมือความชันบังคับใช้ขั้นต่ำซึ่งตั้งค่าในเครื่องมือทั้งสองเป็น 0.01
หลังจากที่เต็มไปด้วยแหล่งต้นน้ำฉันใช้เครื่องคำนวณแรสเตอร์เพื่อกำหนดความแตกต่างในกริดที่เกิดขึ้น - ความแตกต่างเหล่านี้ควรเกิดจากพฤติกรรมที่แตกต่างกันของอัลกอริธึมทั้งสอง
ภาพที่แสดงถึงความแตกต่างหรือการขาดความแตกต่าง สูตรที่ใช้ในการคำนวณความแตกต่างคือ: (((PD_Filled - WL_Filled) / PD_Filled) * 100) - ให้ผลต่างเปอร์เซ็นต์กับเซลล์ตามแต่ละเซลล์ เซลล์สีเทาแสดงสีต่างกันในขณะที่เซลล์สีแดงแสดงว่าการยกระดับ PD ที่เกิดขึ้นนั้นสูงกว่าและเซลล์สีเขียวแสดงว่าการยกระดับ WL นั้นสูงขึ้น
สันปันน้ำที่ 1: ล้างลุ่มน้ำไวโอมิง
นี่คือตำนานของภาพเหล่านี้:
ความแตกต่างอยู่ในช่วงตั้งแต่ -0.0915% ถึง + 0.0910% ความแตกต่างดูเหมือนจะเน้นไปที่ยอดเขาและช่องทางแคบ ๆ ด้วยอัลกอริธึม WL สูงขึ้นเล็กน้อยในช่องทางและ PD สูงขึ้นเล็กน้อยรอบยอดเขาที่มีการแปลเล็กน้อย
เคลียร์สันปันน้ำไวโอมิงซูม 1
เคลียร์สันปันน้ำไวโอมิงซูม 2
ลุ่มน้ำที่ 2: แม่น้ำ Winnipesaukee, NH
นี่คือตำนานของภาพเหล่านี้:
แม่น้ำ Winnipesaukee, NH, Zoom 1
ความแตกต่างอยู่ในช่วงตั้งแต่ -0.323% ถึง + 0.315% ดูเหมือนความแตกต่างจะเน้นไปที่จุดสูงสุดและช่องทางสตรีมที่แคบ (ก่อนหน้านี้) อัลกอริทึม WL จะสูงขึ้นเล็กน้อยในช่องสัญญาณและ PD จะสูงขึ้นรอบ ๆ ยอดเขาที่มีการแปลเล็กน้อย
Sooooooo ความคิด? สำหรับฉันความแตกต่างที่ดูเหมือนเล็กน้อยอาจไม่น่าจะส่งผลต่อการคำนวณต่อไป มีใครเห็นด้วยไหม ฉันกำลังตรวจสอบโดยทำตามขั้นตอนการทำงานของฉันสำหรับแหล่งต้นน้ำหกแห่งนี้
แก้ไข: ข้อมูลเพิ่มเติม ดูเหมือนว่าอัลกอริทึม WL จะนำไปสู่ช่องทางที่มีความแตกต่างน้อยกว่าในวงกว้างมากขึ้นทำให้เกิดค่าดัชนีภูมิประเทศสูง (ชุดข้อมูลอนุพันธ์สุดท้ายของฉัน) ภาพด้านซ้ายด้านล่างเป็นอัลกอริธึม PD ภาพด้านขวาคืออัลกอริธึม WL
ภาพเหล่านี้แสดงความแตกต่างในดัชนีภูมิประเทศในสถานที่เดียวกัน - พื้นที่เปียกกว้างขึ้น (ช่องเพิ่มเติม - แดง, สูงกว่า TI) ใน WL pic ทางขวา ช่องที่แคบกว่า (พื้นที่เปียกน้อยกว่า - สีแดงน้อยลง, พื้นที่สีแดงที่แคบกว่า, TI ที่ต่ำกว่าในพื้นที่) ในรูป PD ด้านซ้าย
นอกจากนี้ต่อไปนี้เป็นวิธีจัดการ PD (ซ้าย) ภาวะซึมเศร้าและวิธีจัดการ WL (ขวา) - สังเกตกลุ่ม / บรรทัดสีส้มที่ยกสูงขึ้น
ดังนั้นความแตกต่างเล็ก ๆ ดูเหมือนจะไหลผ่านการวิเคราะห์เพิ่มเติม
นี่คือสคริปต์ Python ของฉันหากใครสนใจ:
#! /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
# ----------------------------------------------------------------------