Integrazione di Whitebox GAT (gratuito e aperto) con l'interfaccia utente di ArcMap? [chiuso]


11

Strumenti di analisi geospaziale di Whitebox

Ho scritto una serie di automazioni ArcGIS VBA a scuola di specializzazione; tuttavia, dipendono completamente dall'estensione ArcGIS Spatial Analyst, che non è solo di tipo chiuso ma costoso al punto di dissuasione.

Poiché VBA è deprecato e poiché alcuni ricercatori della U usano ancora i miei strumenti VBA, ho pensato che sarebbe stato divertente riscriverli in .Net. Ma ora, con più esperienza, mi rendo conto inoltre che sarebbe più appropriato per l'uso accademico se quelle utilità consumassero algoritmi aperti.

Con questo in mente, sto considerando Whitebox GAT come un potenziale sostituto per gli strumenti di idrologia dell'analista spaziale, e sono curioso di sapere se ci sono storie di successo o "trucchi" che fanno risparmiare tempo in relazione all'integrazione ArcGIS / Whitebox.

Prevedo che molte persone vorranno contro-suggerire di implementare Saga, GRASS, R, eccetera. Se questa è la tua posizione, descrivi perché perseguire un'integrazione di Whitebox non sarebbe saggio. Ad esempio, supporta solo pochi formati di input, ha una scarsa gestione di file di grandi dimensioni (1-2 GB +), ecc.


Ho provato a giocare con l'interfaccia utente di Whitebox e, con l'aiuto dei loro tutorial , non è stato difficile pre-elaborare un DEM di 30 metri che avevo in giro. Successivamente, dopo aver allineato gli idro raster, ho creato un punto di scorrimento e reso il suo spartiacque. Questo è bastato per avere un'idea dell'esperienza utente di Whitebox.

Whitebox è estensibile e / o consumabile utilizzando .Net o Python. Avendo realizzato alcune nozioni di base nell'interfaccia utente di Whitebox, ho pensato di concatenare le tipiche attività di pre-elaborazione DEM con una semplice automazione .Net (ancora nessuna ArcMap). Pre-elaborazione DEM generalmente significa quanto segue:

  1. non impostare alcun valore dati (Whitebox ne ha bisogno, ma Arc non l'ha mai fatto)
  2. riempire i lavandini
  3. creare un raster di direzione del flusso
  4. creare un raster di accumulo di flusso

Ho messo insieme la seguente "applicazione" di Windows Form (aka WhiteboxDaisyChain). Prende una directory di sistema contenente una griglia ArcGIS (.FLT) ed esegue le attività sopra indicate. Se vuoi provare questo, dovrai scaricare i binari compilati , decomprimere, quindi copiare tutti i .dllfile dal ..\WhiteboxGAT_1_0_7\Pluginstuo progetto - Ho inserito tutto ..\WhiteboxDaisyChain\Whitebox. Tuttavia, questo esempio richiede solo i quattro DLLscitati all'inizio dell'esempio di codice.


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();
        }
    }
}

Finora sto scavando questo, ma non ho ancora una vera storia di successo o alcuno spettacolo da descrivere .. Il mio prossimo obiettivo sarà l'invio interattivo di punti di scorrimento da ArcMap. Fondamentalmente, voglio fare clic sulla mappa ..get lo spartiacque.


1
Volevo solo sottolineare che le ultime versioni di Whitebox consentono di digitalizzare sullo schermo un punto di scorrimento dello shapefile da inserire nello strumento spartiacque. Funziona abbastanza bene. JL

@JohnLindsay, ehi, ti riconosco come il professore di Guelph che ha creato Whitebox. Quando ho iniziato questa discussione nel gennaio 2012, Whitebox è stato scritto in .Net, ma ora capisco che è in Java. Ho considerato la cancellazione di questo thread come irrilevante, dal momento che le cose .Net non sono mantenute, ma se la vecchia versione è ancora disponibile, anche se non mantenuta, è comunque preziosa. Avevo pensato di creare un'app mobile per gli appassionati di mobile che consumava Whitebox in .Net WebServices, ma da allora ho presentato l'idea. Ho trascurato un "archivio" tra i download?
elrobis,

Risposte:


3

Se si desidera prendere in considerazione altre applicazioni al di fuori di Analista spaziale, è possibile esaminare la libreria SEXTANTE . Anche se non l'ho usato personalmente, se guardi questo video , puoi vedere che dimostrano come lavorare con i raster.

Perché potresti prendere in considerazione questo set di strumenti? Hanno già creato " SEXTANTE per l'estensione ArcGIS " (gratuito), che consente agli utenti di utilizzare gli strumenti SEXTANTE in ArcMap.


È un bel consiglio, lo esaminerò.
elrobis,

Nota, SEXTANTE per ArcGIS non esiste più. Vedere questa domanda .
Fezter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.