Planchon & Darboux ile Wang ve Liu depresyon doldurma algoritmaları arasında bir fark var mı? Hız dışında mı?


11

Bu iki depresyon doldurma algoritması arasında DEM'lerde depresyonları (batıkları) işleme ve doldurma hızları dışında bir fark varsa, gerçek analitik deneyime dayanarak biri bana söyleyebilir mi?

Dijital yükseklik modellerinin çöküntülerini doldurmak için hızlı, basit ve çok yönlü bir algoritma

Olivier Planchon, Frederic Darboux

ve

Hidrolojik analiz ve modelleme için dijital yükseklik modellerinde yüzey çökmelerinin belirlenmesi ve doldurulması için etkili bir yöntem

Wang ve Liu

Teşekkürler.

Yanıtlar:


12

Teorik bir bakış açısından, depresyon dolgusunun sadece bir çözümü vardır, ancak bu çözüme ulaşmanın sayısız yolu olabilir, bu yüzden çok farklı depresyon doldurma algoritmaları vardır. Bu nedenle, teorik olarak, Planchon ve Darboux veya Wang ve Liu veya diğer depresyon doldurma algoritmalarından herhangi biriyle dolu bir DEM daha sonra aynı görünmelidir. Ancak muhtemelen olmayacaklar ve bunun birkaç nedeni var. İlk olarak, bir depresyonu doldurmak için sadece bir çözüm varken, dolu depresyonun düz yüzeyine bir gradyan uygulamak için birçok farklı çözüm vardır. Yani, genellikle sadece bir depresyonu doldurmak istemiyoruz, aynı zamanda dolu depresyonun yüzeyi üzerindeki akışı zorlamak istiyoruz. Bu genellikle çok küçük degradelerin eklenmesini içerir ve 1) bunu yapmak için çok sayıda farklı strateji vardır (bunların çoğu doğrudan çeşitli depresyon doldurma algoritmalarına yerleştirilmiştir) ve 2) bu tür küçük sayılarla uğraşmak genellikle küçük yuvarlama hatalarına yol açacaktır. doldurulmuş DEM'ler arasındaki farklarda kendini gösterir. Bu resme bir göz atın:

Doldurulmuş DEM'lerde yükseklik farklılıkları

Her ikisi de kaynak DEM'den oluşturulan ancak biri Planchon ve Darboux algoritması ve diğeri Wang ve Liu algoritması ile doldurulmuş çöküntülere sahip iki DEM arasındaki 'farkın DEM'ini gösterir. Depresyon doldurma algoritmalarının her ikisi de Whitebox GAT içindeki araçlar olduğunu ve bu nedenle algoritmaların yukarıdaki cevabınızda tarif ettiğinizden farklı uygulamalar olduğunu söylemeliyim. DEM'lerdeki farklılıkların hepsinin 0.008 m'den daha az olduğuna ve tamamen topografik depresyon alanlarında (yani depresyonlar içinde olmayan ızgara hücrelerinin giriş DEM'si ile tam olarak aynı yüksekliklere sahip olduklarına) dikkat edin. 8 mm'lik küçük değer, doldurma işleminin geride bıraktığı düz yüzeyler üzerindeki akışı zorlamak için kullanılan minik değeri yansıtır ve ayrıca kayan nokta değerlerine sahip bu küçük sayıları temsil ederken yuvarlama hatalarının ölçeğinden de bir miktar etkilenir. Yukarıdaki resimde iki doldurulmuş DEM'i göremezsiniz, ancak açıklama girişlerinden beklediğiniz gibi aynı yükseklik değerlerine sahip olduklarını söyleyebilirsiniz.

Öyleyse, DEM'deki tepeler ve diğer depresyon dışı alanlar arasındaki yükseklik farklılıklarını neden yukarıdaki cevabınızda gözlemliyorsunuz? Bence bu sadece algoritmanın özel uygulamasına gelebilir. Aracın içinde bu farklılıkları açıklamak için muhtemelen bir şeyler oluyor ve gerçek algoritma ile ilgisi yok. Bir algoritmanın akademik bir makaledeki açıklaması ile gerçek uygulaması arasındaki verilerin, CBS içinde dahili olarak nasıl ele alındığının karmaşıklığı ile birleştiğinde bu benim için şaşırtıcı değil. Her neyse, bu çok ilginç soruyu sorduğunuz için teşekkürler.

Alkış,

John


Çok teşekkürler John !!! Her zamanki gibi bilgilendirici. Sonunda, sadece bir depresyonu doldurmak ve akışı sağlamak için minimum eğimi uygulamak arasındaki önemli farkı anlıyorum. Daha önce bu iki fikri kandırıyordum. Bu analiz için Whitebox'ı kullanmaya çalıştığımı bilmenizi istiyorum, ancak Planchon ve Darboux dolgusunu çalıştırırken havza sınırını kaplayan NoData değerleri ile ilgili hatayı çalıştırmaya devam ettim - düzeltmenin geldiğini biliyorum. Bundan kaçınmak için bu analizi kare DEM'de yaptınız mı? Tekrar teşekkürler.
traggatmot

1
+1 Bunun gibi bilgilendirici, düşünceli, bilgili bir cevap okumak bir zevktir.
whuber

5

Kendi sorumu cevaplamaya çalışacağım - dun dun dun.

SAGA GIS'i 6 farklı havza için Planchon ve Darboux (PD) tabanlı doldurma aracını (ve Wang ve Liu (WL) tabanlı doldurma aracını kullanarak doldurulmuş havzalardaki farklılıkları incelemek için kullandım. "Havza" diyorum, çünkü farklılıkların algoritmaya mı yoksa algoritmanın özel uygulanmasına mı bağlı olduğu sorusu her zaman vardır.

Havza DEM'leri USGS tarafından sağlanan havza şekil dosyaları kullanılarak mozaikli NED 30 m verilerinin kırpılmasıyla oluşturulmuştur. Her baz DEM için iki araç çalıştırıldı; her bir alet için sadece bir seçenek vardır, her iki alette de 0,01 olarak ayarlanmış minimum zorlanmış eğim.

Havzalar doldurulduktan sonra, sonuçtaki ızgaralardaki farklılıkları belirlemek için raster hesap makinesini kullandım - bu farklılıklar sadece iki algoritmanın farklı davranışlarından kaynaklanmalıdır.

Farklılıkları veya farklılıkları temsil eden görüntüler (temel olarak hesaplanan fark tarama) aşağıda sunulmuştur. Farklılıkların hesaplanmasında kullanılan formül: (((PD_Filled - WL_Filled) / PD_Filled) * 100) - hücre bazında hücre bazında yüzde farkını verir. Rengi gri olan hücreler artık farklılık gösterir, sonuçta ortaya çıkan PD yükselmesinin daha büyük olduğunu gösteren renklerin daha kırmızı olması ve sonuçta ortaya çıkan WL yükselmesinin daha büyük olduğunu gösteren renklerin daha yeşil olması gerekir.

1. Havza: Berrak Havza, Wyoming resim açıklamasını buraya girin

İşte bu görüntüler için efsane:

resim açıklamasını buraya girin

Farklılıklar sadece% -0.0915 ila +% 0.0910 arasındadır. WL algoritması kanallarda biraz daha yüksek ve PD lokalize pikler etrafında biraz daha yüksek olmak üzere, farklılıklar pikler ve dar akış kanalları etrafında odaklanmış gibi görünmektedir.

Temiz Havza, Wyoming, Zoom 1 resim açıklamasını buraya girin

Berrak Havza, Wyoming, Zoom 2 resim açıklamasını buraya girin

2. Havza: Winnipesaukee Nehri, NH

resim açıklamasını buraya girin

İşte bu görüntüler için efsane:

resim açıklamasını buraya girin

Winnipesaukee Nehri, NH, Zoom 1

resim açıklamasını buraya girin

Farklılıklar yalnızca% -0.323 ile +% 0.315 arasında değişir. Farklılıklar pikler ve dar akış kanalları etrafında odaklanmış gibi görünmektedir, WL algoritması kanallarda biraz daha yüksek ve PD lokalize pikler etrafında biraz daha yüksektir.

Sooooooo, düşünceler? Bana göre, farklar önemsiz gibi görünüyor muhtemelen daha fazla hesaplamayı etkilemez; kabul eden var mı? Bu altı havza için iş akışımı tamamlayarak kontrol ediyorum.

Edit: Daha fazla bilgi. WL algoritmasının daha az belirgin kanallara yol açtığı ve yüksek topografik indeks değerlerine (nihai türev veri setim) neden olduğu görülmektedir. Aşağıdaki soldaki görüntü PD algoritması, sağdaki görüntü WL algoritmasıdır.

resim açıklamasını buraya girin

Bu görüntüler, aynı konumlardaki topografik indeksteki farkı gösterir - sağdaki WL resminde daha geniş ıslanan alanlar (daha fazla kanal - daha kırmızı, daha yüksek TI); soldaki PD resminde daha dar kanallar (daha az ıslak alan - daha az kırmızı, daha dar kırmızı alan, alanda daha düşük TI).

resim açıklamasını buraya girin

Ek olarak, PD'nin bir depresyonu nasıl ele aldığı (solda) ve WL'yi nasıl ele aldığı (sağda) - WL dolgulu çıktıdaki depresyondan yükseltilmiş turuncu (alt Topografik indeks) segment / çizgi geçişini fark ettiniz mi?

resim açıklamasını buraya girin

Bu nedenle, küçük farklar da olsa, ek analizler sonucunda akıcı görünüyor.

Eğer ilgilenen varsa benim Python betiğim:

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

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

Bu sorunla ilgili olarak SAGA bakıcılarıyla görüştünüz mü?
reima

3

Algoritmik düzeyde, iki algoritma aynı sonuçları verecektir.

Neden farklılıklar yaşıyor olabilirsiniz?

Temsili veri

Algoritmalarınızdan biri float(32 bit) ve diğeri double(64 bit) kullanıyorsa , aynı sonucu vermelerini beklememelisiniz. Benzer şekilde, bazı uygulamalar kayan nokta değerlerini temsil ederek tamsayı veri türlerini temsil eder ve bu da farklılıklara neden olabilir.

Drenaj Uygulama

Bununla birlikte, her iki algoritma da akış yönlerini belirlemek için yerelleştirilmiş bir yöntem kullanılırsa tahliye edilmeyen düz alanlar üretecektir.

Planchon ve Darboux, drenajı zorlamak için düz alanın yüksekliğine küçük bir artış ekleyerek bunu ele alır. Barnes ve ark. (2014) kağıdı "Raster dijital yükseklik modellerinde düz yüzeyler üzerinde etkili bir drenaj yönü ataması" bu artışın eklenmesi, artışın çok büyük olması durumunda düz bir alanın dışındaki drenajın doğal olmayan bir şekilde yeniden yönlendirilmesine neden olabilir. Bir çözüm, örneğin nextafterişlevi kullanmaktır.

diğer düşünceler

Wang ve Liu (2006), "Öncelikli sel: Dijital yükseklik modelleri için optimal bir depresyon doldurma ve havza etiketleme algoritması" makalemde tartışıldığı gibi Öncelik-Sel algoritmasının bir varyantıdır .

Priority-Flood, tamsayı ve kayan nokta verileri için zaman karmaşıklıklarına sahiptir. Makalemde, hücreleri öncelik sırasına yerleştirmekten kaçınmanın algoritmanın performansını arttırmanın iyi bir yolu olduğunu belirttim. Gibi başka yazarlar Zhou ve ark. (2016) ve Wei ve diğ. (2018) bu fikri algoritmanın verimliliğini daha da artırmak için kullanmıştır. Tüm bu algoritmalar için kaynak kodu burada mevcuttur .

Bunu akılda tutarak, Planchon ve Darboux (2001) algoritması bilimin başarısız olduğu bir yerin hikayesidir. Öncelik-Sel çalışır iken O (N) tam sayı verileri ve zaman O (N günlük H) kayan noktalı veri zaman, P & D O (N çalışır 1.5 ) zaman. Bu, DEM'in büyüklüğü ile katlanarak büyüyen büyük bir performans farkına dönüşür:

Jenson ve Domingue, Öncelik-Sel depresyonunun doldurulması için Planchon ve Darboux'a karşı Wang ve Liu'ya karşı

2001 yılına gelindiğinde Ehlschlaeger, Vincent, Soille, Beucher, Meyer ve Gratin birlikte Öncelik-Sel algoritmasını detaylandıran beş makale yayınladılar. Planchon ve Darboux ve yorumcuları bütün bunları kaçırdılar ve daha yavaş büyüklükte bir algoritma icat ettiler. Şimdi 2018 ve hala daha iyi algoritmalar geliştiriyoruz, ancak P&D hala kullanılıyor. Bence bu talihsiz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.