Intégration de Whitebox GAT (gratuit et ouvert) avec ArcMap UI? [fermé]


11

Outils d'analyse géospatiale Whitebox

J'ai écrit un certain nombre d'automatisations ArcGIS VBA à l'université; cependant, ils dépendent entièrement de l'extension ArcGIS Spatial Analyst, qui est non seulement de source fermée mais coûteuse au point de dissuasion.

Étant donné que VBA est obsolète et que certains chercheurs de l'U utilisent toujours mes outils VBA, j'ai pensé qu'il serait amusant de les réécrire en .Net. Mais maintenant, avec plus d'expérience, je réalise en outre qu'il serait plus approprié pour une utilisation académique si ces utilitaires consommaient des algorithmes ouverts.

Dans cet esprit, je considère Whitebox GAT comme un remplaçant potentiel pour les outils d'hydrologie de Spatial Analyst, et je suis curieux de savoir s'il y a des réussites ou des «pièges» de gain de temps liés à l'intégration d'ArcGIS / Whitebox.

Je prévois que plusieurs personnes voudront contre-suggérer la mise en œuvre de Saga, GRASS, R, et cetera. Si telle est votre position, veuillez expliquer pourquoi il serait imprudent de poursuivre une intégration dans la Whitebox. Par exemple, ne prend-il en charge que quelques formats d'entrée, a-t-il une mauvaise gestion des fichiers volumineux (1-2 Go +), etc.


J'ai joué avec l'interface utilisateur de la Whitebox, et avec l'aide de leurs tutoriels , il n'a pas été difficile de prétraiter un DEM de 30 mètres que j'avais autour. Ensuite, après avoir aligné les rasters hydro, j'ai créé un point d'écoulement et rendu son bassin versant. C'était suffisant pour avoir une idée de l'expérience utilisateur de la Whitebox.

Whitebox est extensible et / ou consommable en utilisant .Net ou Python. Après avoir accompli quelques notions de base dans l'interface utilisateur de la Whitebox, j'ai pensé que j'enchaînerais les tâches de prétraitement DEM typiques avec une simple automatisation .Net (pas encore d'ArcMap pour l'instant). Le prétraitement DEM signifie généralement ce qui suit:

  1. ne définissez aucune valeur de données (Whitebox en a besoin, mais Arc ne l'a jamais fait)
  2. remplir les éviers
  3. créer un raster de direction d'écoulement
  4. créer un raster d'accumulation de flux

J'ai assemblé l '"application" Windows Form suivante (aka WhiteboxDaisyChain). Il prend un répertoire système contenant une grille ArcGIS (.FLT) et effectue les tâches indiquées ci-dessus. Si vous voulez essayer cela, vous devrez télécharger les binaires compilés , décompressez, puis copiez tous les .dllfichiers de ..\WhiteboxGAT_1_0_7\Pluginsdans votre projet - je mets tout dedans ..\WhiteboxDaisyChain\Whitebox. Cependant, cet exemple n'a besoin que des quatre DLLsmentionnés en haut de l'exemple de code.


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

Jusqu'à présent, je suis en train de creuser cela, mais je n'ai pas encore de véritable histoire à succès ni de show-stoppers à décrire .. Mon prochain objectif sera de soumettre de manière interactive des points d'écoulement depuis ArcMap. Fondamentalement, je veux cliquer sur la carte ..get le bassin versant.


1
Je voulais juste souligner que les dernières versions de Whitebox vous permettent de numériser un point d'écoulement de fichier de formes à l'écran pour le saisir dans l'outil du bassin versant. Cela fonctionne plutôt bien. JL

@JohnLindsay, hé là, je vous reconnais comme le professeur de Guelph qui a créé Whitebox. Quand j'ai commencé ce fil en janvier 2012, Whitebox a été écrit en .Net, mais maintenant c'est en Java, je comprends. J'ai considéré la suppression de ce fil comme non pertinente, car le contenu .Net n'est pas conservé, mais si l'ancienne version est toujours disponible, même non entretenue, elle est toujours utile. J'avais pensé à créer une application mobile pour les amateurs flottants qui consommaient Whitebox dans les services Web .Net, mais j'ai depuis déposé cette idée. Ai-je oublié une "archive" parmi les téléchargements?
elrobis

Réponses:


3

Si vous souhaitez envisager d'autres applications en dehors de Spatial Analyst, vous pouvez envisager de consulter la bibliothèque SEXTANTE . Bien que je ne l'ait pas personnellement utilisé, si vous regardez ce clip vidéo , vous pouvez voir qu'ils montrent des façons de travailler avec les rasters.

Pourquoi pourriez-vous envisager cet ensemble d'outils? Ils ont déjà construit " SEXTANTE for ArcGIS extension " (gratuit), qui permet aux utilisateurs de consommer les outils SEXTANTE dans ArcMap.


C'est une bonne astuce, je vais l'examiner.
elrobis

Remarque: SEXTANTE for ArcGIS n'existe plus. Voir cette question .
Fezter
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.