Czy integrujesz Whitebox GAT (darmowy i otwarty) z ArcMap UI? [Zamknięte]

11

Narzędzia analizy geoprzestrzennej Whitebox

Napisałem wiele automatyzacji ArcGIS VBA w szkole podstawowej; są jednak w pełni zależne od rozszerzenia ArcGIS Spatial Analyst, które jest nie tylko zamknięte, ale drogie do odstraszania.

Ponieważ VBA jest przestarzałe, a ponieważ niektórzy badacze z U nadal używają moich narzędzi VBA, pomyślałem, że fajnie byłoby przepisać je w .Net. Ale teraz, z większym doświadczeniem, dalej zdaję sobie sprawę, że byłoby bardziej odpowiednie do użytku akademickiego, gdyby te narzędzia wykorzystywały otwarte algorytmy.

Mając to na uwadze, rozważam Whitebox GAT jako potencjalną alternatywę dla narzędzi hydrologicznych Spatial Analyst i jestem ciekawy, czy istnieją jakieś historie sukcesu lub oszczędzające czas „gotchas” związane z integracją ArcGIS / Whitebox.

Przewiduję, że kilku ludzi będzie chciało przeciwwskazać do wdrożenia Saga, GRASS, R i tak dalej. Jeśli to twoje stanowisko, opisz, dlaczego realizacja integracji z Whitebox byłaby nierozsądna. Na przykład, czy obsługuje tylko kilka formatów wejściowych, ma słabą obsługę dużych plików (1-2 GB +) itp.


Zrobiłem trochę zabawy z interfejsem Whitebox i przy pomocy ich samouczków nie było trudno wstępnie przetworzyć 30-metrowy DEM, który miałem wokół. Następnie, po ustawieniu rastrów hydro, stworzyłem punkt krzepnięcia i wykonałem przełom. To wystarczyło, aby poczuć wrażenia użytkownika Whitebox.

Whitebox jest rozszerzalny i / lub eksploatacyjny przy użyciu .Net lub Python. Po osiągnięciu pewnych podstaw w interfejsie Whitebox pomyślałem, że połączę typowe zadania przetwarzania wstępnego DEM z prostą automatyzacją .Net (jeszcze nie ArcMap). Wstępne przetwarzanie DEM oznacza zwykle:

  1. nie ustawiaj żadnej wartości danych (Whitebox tego potrzebuje, ale Arc nigdy tego nie zrobił)
  2. wypełnić zlewy
  3. stworzyć raster kierunku przepływu
  4. stworzyć raster akumulacji przepływu

Złożyłem następującą „aplikację” Windows Form (aka WhiteboxDaisyChain). Pobiera katalog systemowy zawierający ArcGIS Grid (.FLT) i wykonuje zadania wymienione powyżej. Jeśli chcesz tego spróbować, musisz pobrać skompilowane pliki binarne , rozpakować, a następnie skopiować wszystkie .dllpliki z ..\WhiteboxGAT_1_0_7\Pluginsprojektu - włożę wszystko ..\WhiteboxDaisyChain\Whitebox. Jednak ten przykład wymaga tylko czterech DLLswymienionych na górze próbki kodu.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

// 1) Create a new Windows Form
// 2) Put all these in a Whitebox folder in the C# project root.
// 3) Add project references to the following and create using statements:

using Interfaces;       // requires Add Reference: Interfaces.dll
using ImportExport;     // requires Add Reference: ImportExport.dll
using ConversionTools;  // requires Add Reference: ConversionTools.dll
using flow;             // requires Add Reference: flow.dll


namespace WhiteboxDaisyChain
{
    // 4) Prepare to implement the IHost interface.
    // 5) Right-click IHost, select "Implement interface.."
    public partial class UI : Form, IHost
    {

        // 6) Add a BackgroundWorker object.
        private BackgroundWorker worker;

        public UI()
        {
            InitializeComponent();

            // 7) Instantiate the worker and set "WorkerReportsProgress".
            worker = new BackgroundWorker();
            worker.WorkerReportsProgress = true;
        }


        // 8) Use some event to set things in motion.. i.e. Button click.
        private void button1_Click(object sender, EventArgs e)
        {
            progressLabel.Text = "Running..";

            // This is the path containing my ArcGrid .FLT.
            // All processing will unfold to this directory.
            string path = "C:\\xData\\TutorialData\\DemWhitebox\\";

            string[] fltArgs = new string[1];
            fltArgs[0] = path + "greene30.flt";                 // in: Arc floating point grid

            // creates a raster in Whitebox data model
            ImportArcGrid importAG = new ImportArcGrid();
            importAG.Initialize(this as IHost);
            importAG.Execute(fltArgs, worker);                  // out:  path + "greene30.dep"

            // set the nodata value on the DEM
            string[] noDataArgs = new string[2];
            noDataArgs[0] = path + "greene30.dep";              // in: my raw DEM
            noDataArgs[1] = "-9999";                            // mine used -9999 as nodata value

            SetNoData setNoData = new SetNoData();
            setNoData.Initialize(this as IHost);
            setNoData.Execute(noDataArgs, worker);              // out:  path + "greene30.dep"

            // fill sinks in the DEM
            string[] fillSinksArgs = new string[4];
            fillSinksArgs[0] = path + "greene30.dep";           // in: my DEM with NoData Fixed
            fillSinksArgs[1] = path + "greene30_fill.dep";      // out: my DEM filled
            fillSinksArgs[2] = "50";                            // the dialog default
            fillSinksArgs[3] = "0.01";                          // the dialog default

            FillDepsBySize fillSinks = new FillDepsBySize();
            fillSinks.Initialize(this as IHost);
            fillSinks.Execute(fillSinksArgs, worker);

            // create a flow direction raster
            string[] flowDirArgs = new string[2];
            flowDirArgs[0] = path + "greene30_fill.dep";        // in: my Filled DEM
            flowDirArgs[1] = path + "greene30_dir.dep";         // out: flow direction raster

            FlowPointerD8 flowDirD8 = new FlowPointerD8();
            flowDirD8.Initialize(this as IHost);
            flowDirD8.Execute(flowDirArgs, worker);

            // create a flow accumulation raster
            string[] flowAccArgs = new string[4];
            flowAccArgs[0] = path + "greene30_dir.dep";         // in: my Flow Direction raster
            flowAccArgs[1] = path + "greene30_acc.dep";         // out: flow accumulation raster
            flowAccArgs[2] = "Specific catchment area (SCA)";   // a Whitebox dialog input
            flowAccArgs[3] = "false";                           // a Whitebox dialog input

            FlowAccumD8 flowAccD8 = new FlowAccumD8();
            flowAccD8.Initialize(this as IHost);
            flowAccD8.Execute(flowAccArgs, worker);

            progressLabel.Text = "";
            progressLabel.Text = "OLLEY-OLLEY-OXEN-FREE!";
        }



        /* IHost Implementation Methods Below Here */

        public string ApplicationDirectory
        {
            get { throw new NotImplementedException(); }
        }

        public void ProgressBarLabel(string label)
        {
            this.progressLabel.Text = "";
            this.progressLabel.Text = label;                    // This is the only one I used.
        }

        public string RecentDirectory
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }

        public bool RunInSynchronousMode
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }

        public void RunPlugin(string PluginClassName)
        {
            throw new NotImplementedException();
        }

        public void SetParameters(string[] ParameterArray)
        {
            throw new NotImplementedException();
        }

        public void ShowFeedback(string strFeedback, string Caption = "GAT Message")
        {
            throw new NotImplementedException();
        }
    }
}

Do tej pory kopie to, ale nie mam jeszcze prawdziwej historii sukcesu ani żadnego show-stoppera do opisania. Moim następnym celem będzie interaktywne przesłanie punktów nalewania z ArcMap. Zasadniczo chcę kliknąć mapę ... wejść do zlewni.

elrobis
źródło
1
Chciałem tylko wskazać, że najnowsze wersje Whitebox pozwalają na digitalizację na ekranie ekranu punktu krzepnięcia pliku kształtu, aby wprowadzić dane do narzędzia zlewni. Działa całkiem dobrze. JL
@JohnLindsay, hej, rozpoznaję cię jako profesora Guelpha, który stworzył Whitebox. Kiedy zacząłem ten wątek w styczniu 2012 roku, Whitebox został napisany w .Net, ale teraz jest w Javie, rozumiem. Uważałem, że usunięcie tego wątku jest nieistotne, ponieważ rzeczy w sieci .Net nie są utrzymywane, ale jeśli stara wersja jest nadal dostępna, a nawet nieobsługiwana, nadal jest cenna. Myślałem o stworzeniu aplikacji mobilnej dla pływających entuzjastów, którzy konsumowali Whitebox w .Net WebServices, ale od tego czasu zgłosiłem ten pomysł. Czy przeoczyłem „archiwa” wśród pobranych plików?
elrobis

Odpowiedzi:

3

Jeśli chcesz rozważyć inne aplikacje poza Spatial Analyst, możesz zajrzeć do biblioteki SEXTANTE . Chociaż nie korzystałem z niego osobiście, jeśli obejrzysz ten klip wideo , zobaczysz, że pokazują sposoby pracy z rastrami.

Dlaczego warto rozważyć ten zestaw narzędzi? Stworzyli już „ rozszerzenie SEXTANTE dla ArcGIS ” (bezpłatne), które pozwala użytkownikom korzystać z narzędzi SEXTANTE w ArcMap.

RyanKDalton
źródło
To dobra wskazówka, przyjrzę się temu.
elrobis
Uwaga, SEXTANTE dla ArcGIS już nie istnieje. Zobacz to pytanie .
Fezter