Grage okulunda bir dizi ArcGIS VBA otomasyonu yazdım; ancak, tamamen kapalı kaynak olmakla kalmayıp caydırma noktasına pahalı olan ArcGIS Uzamsal Analist uzantısına tamamen bağımlıdırlar.
VBA kullanımdan kaldırıldığından ve U'daki bazı araştırmacılar hala VBA araçlarını kullandığından, bunları .Net'te yeniden yazmanın eğlenceli olacağını düşündüm. Ancak şimdi, daha fazla deneyimle, bu yardımcı programlar açık algoritmalar tüketirse, akademik kullanım için daha uygun olacağını da anlıyorum.
Bunu akılda tutarak, Whitebox GAT'ı Mekansal Analist hidroloji araçları için potansiyel bir stand-in olarak görüyorum ve ArcGIS / Whitebox entegrasyonu ile ilgili herhangi bir başarı hikayesi veya zaman kazandıran "gotchas" olup olmadığını merak ediyorum.
Ben birkaç millet Saga, GRASS, R, et cetera uygulamak karşı önermek isteyeceğini tahmin ediyorum. Bu sizin konumunuzsa, lütfen Whitebox entegrasyonunu takip etmenin neden mantıklı olmayacağını açıklayınız. Örneğin, yalnızca birkaç giriş biçimini destekliyor mu, büyük (1-2 GB +) dosyaları vb.
Whitebox UI ile biraz oynadım ve eğitmenlerinin yardımıyla, 30 metre uzunluğundaki bir DEM'i önceden işlemek zor değildi. Sonra, hidro rasterleri sıraladıktan sonra, bir akma noktası oluşturdum ve havzasını oluşturdum. Bu, Whitebox kullanıcı deneyimi hakkında fikir edinmek için yeterliydi.
Whitebox .Net veya Python kullanılarak genişletilebilir ve / veya sarf edilebilir. Whitebox kullanıcı arayüzünde bazı temelleri tamamladıktan sonra, tipik bir DEM ön işleme görevlerini basit bir .Net otomasyonuyla (henüz ArcMap yok) birlikte zincirleyeceğimi düşündüm. DEM ön işleme genellikle şu anlama gelir:
- veri değeri belirlemez (Whitebox buna ihtiyaç duyar, ancak Arc hiçbir zaman gerektirmez)
- lavaboları doldur
- akış yönü taraması oluştur
- akış birikim rasteri oluştur
Aşağıdaki Windows Form "uygulamasını" (aka WhiteboxDaisyChain
) bir araya getirdim . ArcGIS Grid (.FLT) içeren bir sistem dizini alır ve yukarıda belirtilen görevleri gerçekleştirir. Bunu denemek istiyorsanız , derlenmiş ikili dosyaları indirmeniz, açmanız ve ardından tüm .dll
dosyaları ..\WhiteboxGAT_1_0_7\Plugins
projenize kopyalamanız gerekir - her şeyi koydum ..\WhiteboxDaisyChain\Whitebox
. Ancak, bu örnek yalnızca DLLs
kod örneğinin üstünde belirtilen dördüne ihtiyaç duyar .
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();
}
}
}
Şimdiye kadar bunu kazıyorum, ama henüz tanımlayacağım gerçek bir başarı hikayem ya da herhangi bir gösteri durdurucum yok .. Bir sonraki hedefim etkileşimli olarak ArcMap'tan akma noktaları sunmak olacak. Temel olarak, haritayı tıklamak istiyorum .. havza olsun.