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:
- ne définissez aucune valeur de données (Whitebox en a besoin, mais Arc ne l'a jamais fait)
- remplir les éviers
- créer un raster de direction d'écoulement
- 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 .dll
fichiers de ..\WhiteboxGAT_1_0_7\Plugins
dans votre projet - je mets tout dedans ..\WhiteboxDaisyChain\Whitebox
. Cependant, cet exemple n'a besoin que des quatre DLLs
mentionné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.