क्या प्लैंकन और डार्बौक्स और वांग और लियू अवसाद भरने वाले एल्गोरिदम के बीच अंतर है? गति के अलावा?


11

क्या कोई मुझे बता सकता है, वास्तविक विश्लेषणात्मक अनुभव के आधार पर, अगर इन दो अवसाद भरने वाले एल्गोरिदम के बीच अंतर है, तो उस गति के अलावा, जिस पर वे प्रक्रिया करते हैं और डीईएम में अवसाद (सिंक) भरते हैं?

डिजिटल ऊंचाई मॉडल के अवसादों को भरने के लिए एक तेज, सरल और बहुमुखी एल्गोरिथ्म

ओलिवियर प्लांचन, फ्रेडरिक डार्बॉक्स

तथा

हाइड्रोलॉजिकल विश्लेषण और मॉडलिंग के लिए डिजिटल उन्नयन मॉडल में सतह के अवसादों की पहचान करने और भरने के लिए एक कुशल विधि

वांग और लियू

धन्यवाद।

जवाबों:


12

एक सैद्धांतिक दृष्टिकोण से अवसाद भरने का केवल एक ही समाधान है, हालांकि उस समाधान में आने के कई तरीके हो सकते हैं, यही वजह है कि एल्गोरिदम को भरने के लिए बहुत सारे अलग-अलग अवसाद हैं। इसलिए, सैद्धांतिक रूप से एक डेम जो कि प्लैंकोन और डार्बौक्स या वांग और लियू से भरा है, या अन्य किसी भी डिप्रेशन एल्गोरिदम को भरने के बाद समान दिखना चाहिए। यह संभावना है कि वे हालांकि नहीं होंगे और कुछ कारण हैं कि क्यों। सबसे पहले, जबकि एक अवसाद को भरने के लिए केवल एक समाधान है, भरे हुए अवसाद की सपाट सतह पर एक ढाल लगाने के लिए कई अलग-अलग समाधान हैं। यही है, आमतौर पर हम सिर्फ एक अवसाद को भरना नहीं चाहते हैं, लेकिन हम भी भरे हुए अवसाद की सतह पर प्रवाह को मजबूर करना चाहते हैं। इसमें आम तौर पर बहुत छोटे ग्रेडिएंट्स शामिल होते हैं और 1) ऐसा करने के लिए बहुत सारी अलग-अलग रणनीतियाँ होती हैं (जिनमें से कई सीधे अलग-अलग डिप्रेशन फिलिंग एल्गोरिदम में बनाई जाती हैं) और 2) ऐसे छोटे नंबरों के साथ काम करने से अक्सर छोटी गोल त्रुटि हो सकती है। भरे हुए डेमों के बीच अंतर में प्रकट होना। इस छवि पर एक नज़र डालें:

भरे हुए डेम में ऊंचाई का अंतर

यह दो डीईएम के बीच 'डीईएम अंतर का' दिखाता है, दोनों स्रोत डीईएम से उत्पन्न होते हैं, लेकिन एक प्लैनचोन और डार्बौक्स एल्गोरिथ्म का उपयोग करके भरे हुए अवसादों के साथ और दूसरा वांग और लियू एल्गोरिदम के साथ। मुझे यह कहना चाहिए कि डिप्रेशन फिलिंग एल्गोरिदम व्हाइटबॉक्स गैट के भीतर से दोनों उपकरण थे और इसलिए आप ऊपर दिए गए अपने उत्तर में वर्णित की तुलना में एल्गोरिदम के विभिन्न कार्यान्वयन हैं। ध्यान दें कि डीईएम में अंतर 0.008 मीटर से कम है और वे पूरी तरह से स्थलाकृतिक अवसादों के क्षेत्रों में निहित हैं (यानी ग्रिड कोशिकाएं जो अवसादों के भीतर नहीं हैं, इनपुट डेम के समान ऊंचाई हैं)। 8 मिमी का छोटा मान फिलिंग ऑपरेशन द्वारा छोड़ी गई सपाट सतहों पर प्रवाह को लागू करने के लिए उपयोग किए जाने वाले छोटे मूल्य का चिंतनशील है और फ्लोटिंग पॉइंट मानों के साथ ऐसी छोटी संख्याओं का प्रतिनिधित्व करते समय गोलाई त्रुटियों के पैमाने से कुछ हद तक प्रभावित होने की संभावना है। आप ऊपर दी गई छवि में प्रदर्शित दो भरे हुए डेम नहीं देख सकते हैं, लेकिन आप उनकी किंवदंती प्रविष्टियों से बता सकते हैं कि उनके पास ऊंचाई मानों की सटीक रेंज भी है, जैसा कि आप उम्मीद करेंगे।

तो, आप अपने उत्तर में डेम में चोटियों और अन्य गैर-अवसाद क्षेत्रों के साथ ऊंचाई के अंतर का निरीक्षण क्यों करेंगे? मुझे लगता है कि यह वास्तव में केवल एल्गोरिथ्म के विशिष्ट कार्यान्वयन के लिए नीचे आ सकता है। उन अंतरों के लिए उपकरण के अंदर कुछ होने की संभावना है और यह वास्तविक एल्गोरिथ्म से संबंधित नहीं है। यह मेरे लिए आश्चर्य की बात नहीं है कि एक अकादमिक पेपर में एल्गोरिथ्म के विवरण और इसके वास्तविक कार्यान्वयन के बीच की खाई को इस बात की जटिलता के साथ जोड़ा गया कि डेटा को GIS के भीतर आंतरिक रूप से कैसे नियंत्रित किया जाता है। किसी भी तरह, यह बहुत दिलचस्प सवाल पूछने के लिए धन्यवाद।

चीयर्स,

जॉन


बहुत बहुत धन्यवाद जॉन !!! हमेशा की तरह जानकारीपूर्ण। अब मैं अंत में एक अवसाद को भरने और प्रवाह को सुनिश्चित करने के लिए एक न्यूनतम ढलान लागू करने के बीच महत्वपूर्ण अंतर को समझता हूं। मैं पहले उन दो विचारों को व्यक्त कर रहा था। मैं चाहता हूं कि आप जानें कि मैंने इस विश्लेषण के लिए व्हाइटबॉक्स का उपयोग करने की कोशिश की थी, लेकिन मैं प्लांच और डार्बौक्स फिल को चलाते समय वाटरशेड की सीमा को अस्तर करते हुए नोडाटा मूल्यों से संबंधित त्रुटि में भाग रहा था - मुझे पता है कि फिक्स आ रहा है। क्या आपने इससे बचने के लिए एक वर्ग डीईएम पर यह विश्लेषण किया था? एक बार फिर धन्यवाद।
त्रिगुटमोट

1
+1 यह इस तरह की जानकारीपूर्ण, विचारशील, ज्ञानवर्धक उत्तर को पढ़ने में खुशी है।
whuber

5

मैं अपने ही सवाल का जवाब देने का प्रयास करूंगा - डन डन डन।

मैंने SAGA GIS का उपयोग 6 अलग-अलग वाटरशेड के लिए उनके प्लांचन और डार्बौक्स (PD) आधारित फिलिंग टूल (और उनके वांग और लियू (WL)) आधारित फिलिंग टूल का उपयोग करके भरे हुए वाटरशेड में अंतर की जांच करने के लिए किया। (यहां मैं केवल परिणामों के दो सेट दिखाता हूं - वे सभी 6 वाटरशेडों के समान थे) मैं कहता हूं कि "आधारित" है, क्योंकि हमेशा यह सवाल होता है कि क्या एल्गोरिथ्म या एल्गोरिथ्म के विशिष्ट कार्यान्वयन के कारण मतभेद हैं।

वाटरशेड डीईएम का उपयोग यूएसजीएस द्वारा प्रदान किए गए वाटरशेड शेपफाइल्स का उपयोग करते हुए एनओएस 30 मीटर डेटा क्लिपिंग द्वारा उत्पन्न किया गया था। प्रत्येक बेस डेम के लिए, दो उपकरण चलाए गए थे; प्रत्येक उपकरण के लिए केवल एक ही विकल्प है, न्यूनतम लागू ढलान, जिसे दोनों उपकरण में 0.01 पर सेट किया गया था।

वाटरशेड भरे जाने के बाद, मैंने परिणामी ग्रिड में अंतर को निर्धारित करने के लिए रास्टर कैलकुलेटर का उपयोग किया - ये अंतर केवल दो एल्गोरिदम के विभिन्न व्यवहारों के कारण होना चाहिए।

मतभेदों या अंतर की कमी (मूल रूप से गणना अंतर रेखापुंज) का प्रतिनिधित्व करने वाले चित्र नीचे प्रस्तुत किए गए हैं। अंतर की गणना में उपयोग किया जाने वाला सूत्र था: (((PD_Filled - WL_Filled) / PD_Filled) * 100) - सेल के आधार पर सेल पर प्रतिशत अंतर दें। रंग में सेल ग्रे अब अंतर दिखाते हैं, रंग में कोशिकाओं के साथ रेडर जिसके परिणामस्वरूप पीडी ऊँचाई अधिक होती है, और रंग में सेल ग्रेनर जिसके परिणामस्वरूप WL ऊंचाई अधिक थी।

1 वाटरशेड: क्लियर वाटरशेड, वायोमिंग यहाँ छवि विवरण दर्ज करें

यहाँ इन छवियों के लिए किंवदंती है:

यहाँ छवि विवरण दर्ज करें

अंतर केवल -0.0915% से + 0.0910% तक होता है। मतभेद चोटियों और संकीर्ण धारा चैनलों के आसपास केंद्रित किए गए प्रतीत होते हैं, जिसमें WL एल्गोरिथ्म चैनलों में थोड़ा अधिक है और स्थानीय चोटियों के आसपास पीडी थोड़ा अधिक है।

क्लियर वाटरशेड, व्योमिंग, ज़ूम 1 यहाँ छवि विवरण दर्ज करें

क्लियर वाटरशेड, वायोमिंग, ज़ूम 2 यहाँ छवि विवरण दर्ज करें

दूसरा वाटरशेड: विन्निपसाउकी नदी, एनएच

यहाँ छवि विवरण दर्ज करें

यहाँ इन छवियों के लिए किंवदंती है:

यहाँ छवि विवरण दर्ज करें

विन्निपसाउकी नदी, एनएच, ज़ूम 1

यहाँ छवि विवरण दर्ज करें

अंतर केवल -0.323% से + 0.315% तक होता है। मतभेद चोटियों और संकीर्ण धारा चैनलों के आसपास केंद्रित होने लगते हैं, (पहले के रूप में) चैनलों में डब्ल्यूएल एल्गोरिथ्म थोड़ा और पीडी स्थानीयकृत चोटियों के आसपास थोड़ा अधिक है।

Sooooooo, विचार? मेरे लिए, मतभेद तुच्छ प्रतीत होते हैं, संभवतः आगे की गणनाओं को प्रभावित करने की संभावना नहीं है; कोई सहमत है? मैं इन छह वाटरशेड के लिए अपने वर्कफ़्लो को पूरा करके जाँच कर रहा हूँ।

संपादित करें: अधिक जानकारी। ऐसा लगता है कि डब्लूएल एल्गोरिथ्म कम व्यापक चैनलों की ओर जाता है, जिससे उच्च स्थलाकृतिक सूचकांक मान (मेरा अंतिम व्युत्पन्न डेटा सेट) होता है। नीचे बाईं ओर की छवि पीडी एल्गोरिथ्म है, दाईं ओर की छवि डब्ल्यूएल एल्गोरिथ्म है।

यहाँ छवि विवरण दर्ज करें

ये छवियां समान स्थानों पर स्थलाकृतिक सूचकांक में अंतर दिखाती हैं - दाईं ओर डब्ल्यूएल तस्वीर में व्यापक गीले क्षेत्र (अधिक चैनल - रेडर, उच्च टीआई); संकरी चैनल (कम गीला क्षेत्र - कम लाल, संकरा लाल क्षेत्र, क्षेत्र में कम तिवारी) बाईं ओर पीडी तस्वीर में।

यहाँ छवि विवरण दर्ज करें

इसके अतिरिक्त, यहाँ पीडी को एक डिप्रेशन (बाएं) को कैसे संभाला जाता है और डब्ल्यूएल ने इसे (दाएं) कैसे संभाला है - उठाया ऑरेंज (लोअर टोपोग्राफिक इंडेक्स) सेगमेंट / लाइन को डीएलआर भरे आउटपुट में डिप्रेशन से पार करते हुए नोटिस करें?

यहाँ छवि विवरण दर्ज करें

तो मतभेद, हालांकि, छोटे, अतिरिक्त विश्लेषण के माध्यम से चकरा देने लगते हैं।

अगर कोई दिलचस्पी रखता है तो यहां मेरी पायथन लिपि है:

#! /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

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

क्या आपने इस मुद्दे के बारे में एसएजीए अनुरक्षकों से संपर्क किया?
रीमा लागू

3

एक एल्गोरिथम स्तर पर, दो एल्गोरिदम एक ही परिणाम का उत्पादन करेंगे।

आपको मतभेद क्यों हो सकते हैं?

डेटा प्रतिनिधित्व

यदि आपका एक एल्गोरिदम उपयोग करता है float(32-बिट) और दूसरा उपयोग double(64-बिट), तो आपको उनसे उसी परिणाम का उत्पादन करने की उम्मीद नहीं करनी चाहिए। इसी तरह, कुछ कार्यान्वयन फ्लोटिंग-पॉइंट मानों का प्रतिनिधित्व करते हैं जो पूर्णांक डेटा प्रकारों का उपयोग करते हैं, जिसके परिणामस्वरूप अंतर भी हो सकता है।

जल निकासी प्रवर्तन

हालांकि, दोनों एल्गोरिदम फ्लैट क्षेत्रों का उत्पादन करेंगे जो प्रवाह दिशाओं का निर्धारण करने के लिए एक स्थानीय पद्धति का उपयोग करने पर नाली नहीं करेंगे।

ड्रेनेज को लागू करने के लिए फ्लैट क्षेत्र की ऊंचाई में एक छोटी वृद्धि को जोड़कर प्लांचोन और डार्बौक्स इसे संबोधित करते हैं। जैसा कि बार्न्स एट अल में चर्चा की गई है। (2014) का पेपर "रेखापुंज डिजिटल ऊंचाई मॉडल में फ्लैट सतहों पर जल निकासी दिशा का एक कुशल असाइनमेंट" इस वेतन वृद्धि के अलावा वास्तव में एक फ्लैट क्षेत्र के बाहर जल निकासी का कारण हो सकता है अगर वृद्धि बहुत बड़ी है। एक समाधान का उपयोग करना है, उदाहरण के लिए, nextafterफ़ंक्शन।

अन्य विचार

वांग और लियू (2006) प्राथमिकता-बाढ़ एल्गोरिथ्म का एक प्रकार है, जैसा कि मेरे पेपर "प्राथमिकता-बाढ़: एक इष्टतम अवसाद-भरने और डिजिटल उन्नयन मॉडल के लिए वाटरशेड-लेबलिंग एल्गोरिथ्म" में चर्चा की गई है ।

प्राथमिकता-बाढ़ में पूर्णांक और फ्लोटिंग-पॉइंट डेटा दोनों के लिए समय की जटिलताएं हैं। अपने पेपर में, मैंने नोट किया कि एल्गोरिथ्म के प्रदर्शन को बढ़ाने के लिए प्राथमिकता कतार में कोशिकाओं को रखने से बचना एक अच्छा तरीका था। अन्य लेखक जैसे झोउ एट अल। (2016) और वी एट अल। (2018) ने एल्गोरिथ्म की दक्षता को और बढ़ाने के लिए इस विचार का उपयोग किया है। इन सभी एल्गोरिदम के लिए सोर्स कोड यहां उपलब्ध है

इसे ध्यान में रखते हुए, प्लांचोन और डार्बौक्स (2001) एल्गोरिथम एक ऐसी जगह की कहानी है जहां विज्ञान विफल हो गया। जबकि प्रायोरिटी-फ्लड पूर्णांक डेटा पर O (N) समय में और फ्लोटिंग-पॉइंट डेटा पर O (N लॉग एन) समय पर काम करता है, P & D O (N 1.5 ) समय में काम करता है । यह एक विशाल प्रदर्शन अंतर में बदल जाता है जो DEM के आकार के साथ तेजी से बढ़ता है:

प्रायोजन-फ्लड डिप्रेशन फिलिंग के लिए जेनसन और डोमिंग्यू बनाम प्लांचन और डार्बॉक्स बनाम वांग और लियू

2001 तक, इल्सचलेगर, विन्सेन्ट, सोइल, बेउचर, मेयर और ग्रैटिन ने सामूहिक रूप से प्राथमिकता-बाढ़ एल्गोरिथ्म का विवरण देते हुए पांच पत्र प्रकाशित किए थे। प्लैनचोन और डार्बौक्स और उनके समीक्षकों ने इस सब को याद किया और एक एल्गोरिथ्म का आविष्कार किया जो परिमाण धीमी करने के आदेश थे। यह अब 2018 है और हम अभी भी बेहतर एल्गोरिदम बना रहे हैं, लेकिन P & D का अभी भी उपयोग किया जा रहा है। मुझे लगता है कि यह दुर्भाग्यपूर्ण है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.