มีความแตกต่างระหว่าง Planchon & Darboux และ Wang และ Liu ที่เติมอัลกอริธึมหรือไม่? นอกเหนือจากความเร็ว?


11

ใครสามารถบอกฉันได้จากประสบการณ์การวิเคราะห์ที่แท้จริงถ้ามีความแตกต่างระหว่างอัลกอริธึมการเติมความหดหู่ทั้งสองนี้นอกเหนือจากความเร็วที่พวกมันประมวลผลและเติมความกดดัน (จม) ใน DEMs?

อัลกอริทึมที่รวดเร็วใช้งานง่ายและอเนกประสงค์เพื่อเติมเต็มรูปแบบการยกระดับแบบดิจิตอล

Olivier Planchon, Frederic Darboux

และ

วิธีที่มีประสิทธิภาพสำหรับการระบุและการเติมพื้นผิวในแบบจำลองระดับความสูงแบบดิจิตอลสำหรับการวิเคราะห์และการสร้างแบบจำลองทางอุทกวิทยา

วังและหลิว

ขอบคุณ

คำตอบ:


12

จากมุมมองทางทฤษฎีการเติมภาวะซึมเศร้ามีเพียงวิธีเดียวเท่านั้นแม้ว่าจะมีวิธีมากมายในการแก้ปัญหานั้นซึ่งเป็นเหตุผลว่าทำไมจึงมีอัลกอริทึมการเติมความซึมเศร้าที่แตกต่างกันมากมาย ดังนั้นในทางทฤษฎีแล้ว DEM ที่เต็มไปด้วย Planchon และ Darboux หรือ Wang and Liu หรืออัลกอริธึมอื่น ๆ ในการซึมเศร้าควรมีลักษณะเหมือนกันในภายหลัง เป็นไปได้ว่าพวกเขาจะไม่อย่างไรก็ตามและมีสาเหตุบางประการ ครั้งแรกในขณะที่มีเพียงวิธีเดียวสำหรับการเติมภาวะซึมเศร้ามีวิธีการแก้ปัญหาที่แตกต่างกันมากมายสำหรับการใช้การไล่ระดับสีบนพื้นผิวเรียบของภาวะซึมเศร้าที่เต็มไป นั่นคือโดยปกติเราไม่เพียง แต่ต้องการเติมความหดหู่ใจ แต่เรายังต้องการบังคับให้ไหลผ่านพื้นผิวของภาวะซึมเศร้าที่เต็มไปด้วย ที่มักจะเกี่ยวข้องกับการเพิ่มการไล่ระดับสีที่เล็กมากและ 1) มีกลยุทธ์ที่แตกต่างกันมากมายสำหรับการทำเช่นนี้ (หลายแห่งถูกสร้างขึ้นในอัลกอริทึมการเติมความซึมเศร้าต่างๆโดยตรง) และ 2) การจัดการกับจำนวนน้อยเช่นนี้ ปรากฏในความแตกต่างระหว่าง DEM ที่ถูกเติม ดูรูปนี้:

ความแตกต่างของระดับความสูงใน DEM ที่เติมเต็ม

มันแสดงให้เห็นถึง 'DEM of different' ระหว่าง DEM สองตัวซึ่งสร้างจาก DEM ต้นทาง แต่อีกอันหนึ่งที่เต็มไปด้วย depressions โดยใช้อัลกอริธึม Planchon และ Darboux และอีกอันหนึ่งด้วยอัลกอริธึม Wang และ Liu ฉันควรจะบอกว่าอัลกอริทึมการเติมความหดหู่เป็นทั้งเครื่องมือจากภายใน Whitebox GAT และดังนั้นจึงมีการใช้งานที่แตกต่างกันของอัลกอริทึมกว่าสิ่งที่คุณอธิบายไว้ในคำตอบของคุณข้างต้น ขอให้สังเกตว่าความแตกต่างใน DEM นั้นทั้งหมดน้อยกว่า 0.008 m และมีอยู่ทั้งหมดภายในพื้นที่ของภูมิประเทศที่หดหู่ (นั่นคือเซลล์กริดที่ไม่ได้อยู่ในภาวะซึมเศร้านั้นมีระดับความสูงเท่ากับ DEM ที่ป้อนเข้า) ค่าขนาดเล็กที่ 8 มม. นั้นสะท้อนกลับมาจากค่าเล็ก ๆ ที่ใช้ในการบังคับใช้การไหลบนพื้นผิวเรียบที่ทิ้งไว้ข้างหลังโดยการเติมและอาจได้รับผลกระทบจากข้อผิดพลาดในการปัดเศษเมื่อแสดงตัวเลขขนาดเล็กเช่นนี้ คุณไม่เห็น DEM ที่เติมเต็มสองรายการที่ปรากฏในภาพด้านบน แต่คุณสามารถบอกได้จากรายการในตำนานว่าพวกเขายังมีค่าระดับความสูงเหมือนกันตามที่คุณคาดหวัง

ดังนั้นทำไมคุณจะสังเกตเห็นความแตกต่างของระดับความสูงตามยอดเขาและพื้นที่ที่ไม่มีภาวะซึมเศร้าอื่น ๆ ใน DEM ในคำตอบของคุณด้านบน ฉันคิดว่ามันน่าจะเกิดขึ้นได้กับการใช้อัลกอริทึมเฉพาะเท่านั้น มีบางอย่างเกิดขึ้นภายในเครื่องมือเพื่อพิจารณาความแตกต่างเหล่านั้นและไม่เกี่ยวข้องกับอัลกอริทึมจริง นี่ไม่ใช่เรื่องที่น่าแปลกใจสำหรับฉันที่มีช่องว่างระหว่างคำอธิบายของอัลกอริทึมในบทความวิชาการและการนำไปใช้จริงรวมกับความซับซ้อนของวิธีการจัดการข้อมูลภายใน GIS อย่างไรก็ตามขอบคุณที่ถามคำถามที่น่าสนใจนี้

ไชโย

จอห์น


ขอบคุณมากจอห์น !!! ให้ข้อมูลเช่นเคย ในที่สุดตอนนี้ฉันก็เข้าใจความแตกต่างที่สำคัญระหว่างการเติมความหดหู่และการบังคับใช้ความชันขั้นต่ำเพื่อให้แน่ใจว่าการไหล ฉันเคยประณามความคิดทั้งสองนั้นก่อนหน้านี้ ฉันต้องการให้คุณรู้ว่าฉันพยายามใช้ Whitebox สำหรับการวิเคราะห์นี้ แต่ฉันยังคงพบข้อผิดพลาดที่เกี่ยวข้องกับค่า NoData ที่เชื่อมโยงกับเขตลุ่มน้ำเมื่อใช้การเติม Planchon และ Darboux - ฉันรู้ว่าการแก้ไขกำลังจะเกิดขึ้น คุณทำการวิเคราะห์นี้ใน DEM แบบสี่เหลี่ยมเพื่อหลีกเลี่ยงปัญหานั้นหรือไม่ ขอบคุณอีกครั้ง.
traggatmot

1
+1 มันเป็นความยินดีที่ได้อ่านคำตอบที่ให้ข้อมูลอย่างรอบคอบและมีความรู้เช่นนี้
whuber

5

ฉันจะพยายามที่จะตอบคำถามของตัวเอง - 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

# ----------------------------------------------------------------------

คุณติดต่อผู้ดูแลระบบ SAGA เกี่ยวกับปัญหานี้หรือไม่?
reima

3

ในระดับอัลกอริทึมอัลกอริธึมทั้งสองจะให้ผลลัพธ์ที่เหมือนกัน

ทำไมคุณถึงได้รับความแตกต่าง

การแทนข้อมูล

หากหนึ่งในอัลกอริทึมของคุณใช้float(32 บิต) และอีกวิธีใช้double(64 บิต) คุณไม่ควรคาดหวังว่าพวกเขาจะให้ผลลัพธ์ที่เหมือนกัน ในทำนองเดียวกันการใช้งานบางอย่างแสดงถึงค่าจุดลอยตัวใช้ชนิดข้อมูลจำนวนเต็มซึ่งอาจส่งผลให้เกิดความแตกต่าง

การบังคับใช้การระบายน้ำ

อย่างไรก็ตามอัลกอริทึมทั้งสองจะสร้างพื้นที่ราบซึ่งจะไม่ระบายถ้าใช้วิธีการแปลเพื่อกำหนดทิศทางการไหล

Planchon และ Darboux จัดการเรื่องนี้โดยการเพิ่มความสูงของพื้นที่ราบเล็กน้อยเพื่อบังคับใช้การระบายน้ำ ตามที่กล่าวไว้ใน Barnes และคณะ กระดาษ (2014) "การกำหนดทิศทางการระบายน้ำที่มีประสิทธิภาพเหนือพื้นผิวเรียบในแบบจำลองระดับความสูงแบบดิจิตอลแรสเตอร์"การเพิ่มส่วนเพิ่มนี้อาจทำให้การระบายน้ำนอกพื้นที่ราบเป็นเส้นทางที่ผิดธรรมชาติหากการเพิ่มขึ้นมีขนาดใหญ่เกินไป ทางออกคือการใช้เช่นnextafterฟังก์ชั่น

ความคิดอื่น ๆ

วังและหลิว (2006) เป็นตัวแปรของขั้นตอนวิธีการจัดลำดับความสำคัญน้ำท่วมที่กล่าวไว้ในกระดาษของฉัน"ลำดับความสำคัญน้ำท่วม: การที่ดีที่สุดภาวะซึมเศร้าบรรจุและอัลกอริทึมลุ่มน้ำติดฉลากสำหรับรุ่นที่สูงแบบดิจิตอล"

ลำดับความสำคัญ - น้ำท่วมมีความซับซ้อนของเวลาสำหรับข้อมูลจำนวนเต็มและจำนวนเต็ม ในกระดาษของฉันฉันสังเกตว่าการหลีกเลี่ยงการวางเซลล์ในคิวลำดับความสำคัญเป็นวิธีที่ดีในการเพิ่มประสิทธิภาพของอัลกอริทึม ผู้เขียนคนอื่น ๆ เช่นโจวและคณะ (2016)และWei et al. (2018)ใช้ความคิดนี้เพื่อเพิ่มประสิทธิภาพของอัลกอริทึม รหัสที่มาสำหรับขั้นตอนวิธีการเหล่านี้สามารถใช้ได้ที่นี่

ด้วยสิ่งนี้ในใจอัลกอริทึมของ Planchon และ Darboux (2001) จึงเป็นเรื่องราวของสถานที่ที่วิทยาศาสตร์ล้มเหลว ในขณะที่ลำดับความสำคัญของน้ำท่วมทำงานในเวลาO (N)กับข้อมูลจำนวนเต็มและเวลาO (N log N)ในข้อมูลจุดลอยตัว P & D ทำงานในเวลา O (N 1.5 ) สิ่งนี้แปลเป็นความแตกต่างด้านประสิทธิภาพที่เพิ่มขึ้นอย่างมากกับขนาดของ DEM:

Jenson และ Domingue เทียบกับ Planchon และ Darboux เทียบกับ Wang และ Liu สำหรับการเติมความซึมเศร้า

ในปี 2544 Ehlschlaeger, Vincent, Soille, Beucher, Meyer และ Gratin ได้ตีพิมพ์เอกสารห้าฉบับซึ่งมีรายละเอียดเกี่ยวกับลำดับความสำคัญของอัลกอริธึมน้ำท่วม Planchon และ Darboux และผู้ตรวจสอบของพวกเขาพลาดสิ่งเหล่านี้ทั้งหมดและคิดค้นอัลกอริทึมซึ่งเป็นลำดับความสำคัญช้ากว่า ตอนนี้ปี 2018 และเรายังคงสร้างอัลกอริธึมที่ดีขึ้น แต่ P&D ยังคงถูกใช้งานอยู่ ฉันคิดว่ามันโชคร้าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.