Tôi đã viết một số tự động hóa VBA ArcGIS ở trường học; tuy nhiên, chúng hoàn toàn phụ thuộc vào phần mở rộng Phân tích không gian ArcGIS, không chỉ là nguồn đóng mà còn đắt đến mức răn đe.
Vì VBA không được dùng nữa và vì một số nhà nghiên cứu tại U vẫn sử dụng các công cụ VBA của tôi, tôi nghĩ sẽ rất vui khi viết lại chúng trong .Net. Nhưng bây giờ, với nhiều kinh nghiệm hơn, tôi nhận ra rằng nó sẽ phù hợp hơn cho việc sử dụng học thuật nếu những tiện ích đó sử dụng thuật toán mở.
Với suy nghĩ này, tôi đang xem Whitebox GAT như một công cụ tiềm năng cho các công cụ thủy văn Phân tích Không gian, và tôi tò mò liệu có câu chuyện thành công hay "gotchas" nào tiết kiệm thời gian liên quan đến tích hợp ArcGIS / Whitebox không.
Tôi dự đoán một số người sẽ muốn phản đối đề xuất thực hiện Saga, GRASS, R, et cetera. Nếu đây là vị trí của bạn, vui lòng mô tả lý do tại sao theo đuổi tích hợp Whitebox sẽ không khôn ngoan. Ví dụ: nó chỉ hỗ trợ một vài định dạng đầu vào, xử lý kém các tệp lớn (1-2 GB +), v.v.
Tôi đã thực hiện một số trò chơi với Giao diện người dùng Whitebox và với sự trợ giúp của các hướng dẫn của họ , không khó để xử lý trước một DEM dài 30 mét mà tôi đã đặt xung quanh. Tiếp theo, sau khi xếp hàng các raster thủy điện, tôi đã tạo một điểm rót và đưa ra lưu vực của nó. Điều này là đủ để có được cảm giác về trải nghiệm người dùng Whitebox.
Whitebox có thể mở rộng và / hoặc tiêu hao bằng cách sử dụng .Net hoặc Python. Đã hoàn thành một số điều cơ bản trong Giao diện người dùng Whitebox, tôi nghĩ rằng tôi sẽ kết hợp các tác vụ tiền xử lý DEM điển hình với tự động hóa .Net đơn giản (chưa có ArcMap). Tiền xử lý DEM thường có nghĩa như sau:
- không đặt giá trị dữ liệu (Whitebox cần điều này, nhưng Arc không bao giờ làm thế)
- bồn rửa
- tạo ra một raster hướng dòng chảy
- tạo ra một raster tích lũy dòng chảy
Tôi kết hợp "ứng dụng" Windows Form sau (aka WhiteboxDaisyChain
). Nó nhận một thư mục hệ thống chứa ArcGIS Grid (.LT) và thực hiện các tác vụ được ghi chú ở trên. Nếu bạn muốn thử điều này, bạn sẽ cần tải xuống các tệp nhị phân đã biên dịch , giải nén, sau đó sao chép tất cả các .dll
tệp từ ..\WhiteboxGAT_1_0_7\Plugins
dự án của bạn - Tôi đặt mọi thứ vào ..\WhiteboxDaisyChain\Whitebox
. Tuy nhiên, ví dụ này chỉ cần bốn DLLs
đề cập ở đầu mẫu mã.
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();
}
}
}
Cho đến nay tôi đang đào cái này, nhưng tôi chưa có câu chuyện thành công thực sự hay bất kỳ điểm dừng chương trình nào để mô tả .. Mục tiêu tiếp theo của tôi sẽ là gửi điểm tương tác từ ArcMap. Về cơ bản, tôi muốn nhấp vào bản đồ .. quên đầu nguồn.