ฉันเขียน ArcGIS VBA Automations ในโรงเรียนระดับบัณฑิตศึกษาหลายแห่ง อย่างไรก็ตามพวกมันขึ้นอยู่กับส่วนขยาย ArcGIS Spatial Analyst ซึ่งไม่เพียง แต่เป็นแหล่งข้อมูลปิด แต่มีราคาแพงจนถึงจุดที่ต้องยับยั้ง
เนื่องจาก VBA เลิกใช้แล้วและเนื่องจากนักวิจัยบางคนที่ U ยังคงใช้เครื่องมือ VBA ของฉันฉันคิดว่ามันคงจะสนุกที่จะเขียนมันใหม่ใน. Net แต่ตอนนี้ด้วยประสบการณ์ที่มากขึ้นฉันก็ตระหนักดีว่ามันจะเหมาะสมกว่าสำหรับการใช้งานด้านวิชาการหากยูทิลิตี้เหล่านั้นใช้อัลกอริทึมแบบเปิด
ด้วยสิ่งนี้ในใจฉันกำลังพิจารณาWhitebox GATว่าเป็นเครื่องมือที่มีศักยภาพสำหรับเครื่องมืออุทกวิทยา Spatial Analyst และฉันอยากรู้ว่ามีเรื่องราวความสำเร็จหรือการ "gotchas" ประหยัดเวลาเกี่ยวกับการรวม ArcGIS / Whitebox
ฉันคาดว่าหลายคนจะต้องการที่จะตอบโต้การแนะนำการใช้ Saga, GRASS, R, และอื่น ๆ หากนี่คือตำแหน่งของคุณโปรดอธิบายว่าเพราะเหตุใดการติดตามการรวม Whitebox จึงไม่ฉลาด ตัวอย่างเช่นรองรับเฉพาะรูปแบบอินพุตบางรูปแบบหรือไม่รองรับไฟล์ขนาดใหญ่ (1-2 GB +) เป็นต้น
ฉันได้เล่นกับ Whitebox UI และด้วยความช่วยเหลือจากบทเรียนของพวกเขาก็ไม่ยากที่จะประมวลผล DEM 30 เมตรที่ฉันวางไว้ก่อน ต่อไปหลังจากที่เรียงแถวแรสเตอร์พลังน้ำแล้วฉันก็สร้างจุดไหลรินและสร้างสันปันน้ำขึ้นมา นี่เป็นการเพียงพอที่จะรับรู้ถึงประสบการณ์การใช้งาน Whitebox
Whitebox สามารถขยายได้และ / หรือสิ้นเปลืองโดยใช้. Net หรือ Python หลังจากประสบความสำเร็จขั้นพื้นฐานบางอย่างใน Whitebox UI ฉันคิดว่าฉันจะเชื่อมโยงงานการประมวลผลล่วงหน้า DEM ทั่วไปเข้ากับการทำงานอัตโนมัติ. Net แบบง่าย (ยังไม่มี ArcMap อยู่) การประมวลผลล่วงหน้า DEM มักจะหมายถึงสิ่งต่อไปนี้:
- ตั้งค่าข้อมูลไม่ (Whitebox ต้องการสิ่งนี้ แต่ Arc ไม่เคยทำ)
- เติมอ่างล้างมือ
- สร้างแรสเตอร์ทิศทางการไหล
- สร้างแรสเตอร์การไหลสะสม
ฉันรวบรวม "แอปพลิเคชัน" แบบฟอร์ม Windows ต่อไปนี้ (aka WhiteboxDaisyChain
) ใช้ไดเรกทอรีระบบที่ประกอบด้วย ArcGIS Grid (.FLT) และทำงานตามที่ระบุไว้ข้างต้น หากคุณต้องการที่จะลองนี้คุณจะต้องดาวน์โหลดไบนารีรวบรวม , เครื่องรูดจากนั้นคัดลอกทุก.dll
ไฟล์จาก..\WhiteboxGAT_1_0_7\Plugins
ในโครงการของคุณ - ..\WhiteboxDaisyChain\Whitebox
ฉันใส่ทุกอย่างใน อย่างไรก็ตามตัวอย่างนี้ต้องการเพียงสี่สิ่งที่DLLs
กล่าวถึงที่ด้านบนของตัวอย่างโค้ด
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();
}
}
}
จนถึงตอนนี้ฉันกำลังขุดสิ่งนี้ แต่ฉันยังไม่มีเรื่องราวความสำเร็จที่แท้จริงหรือนักแสดงโชว์คนใดที่จะอธิบาย .. เป้าหมายต่อไปของฉันคือการส่งจุดไหลจาก ArcMap แบบโต้ตอบ โดยพื้นฐานแล้วฉันต้องการคลิกแผนที่ .. ไปสู่ลุ่มน้ำ