나는 대학원에 많은 ArcGIS VBA 자동화를 썼습니다; 그러나 이들은 ArcGIS Spatial Analyst 확장에 전적으로 의존합니다. ArcGIS Spatial Analyst 확장은 폐쇄 소스 일뿐만 아니라 억제력까지 비쌉니다.
VBA는 더 이상 사용되지 않으며 U의 일부 연구원은 여전히 내 VBA 도구를 사용하기 때문에 .Net에서 다시 작성하는 것이 재미있을 것이라고 생각했습니다. 그러나 이제는 더 많은 경험을 바탕으로 유틸리티가 개방형 알고리즘을 사용하는 경우 학업에 더 적합하다는 것을 알았습니다.
이를 염두에두고 Whitebox GAT 를 Spatial Analyst 수 문학 도구의 잠재적 인 표준으로 고려 하고 있으며 ArcGIS / Whitebox 통합과 관련된 성공 사례 나 시간을 절약 할 수있는 "gotchas"가 있는지 궁금합니다.
여러 사람들이 Saga, GRASS, R 등의 구현을 반대 제안하기를 기대합니다. 이것이 당신의 입장이라면, Whitebox 통합을 추구하는 것이 현명하지 못한 이유를 설명하십시오. 예를 들어, 몇 가지 입력 형식 만 지원합니까, 대용량 (1-2GB +) 파일 처리가 좋지 않은 경우 등
Whitebox UI를 가지고 놀았 으며 튜토리얼을 사용 하여 30 미터 DEM을 사전 처리하는 것은 어렵지 않았습니다. 다음으로 하이드로 래스터를 정렬 한 후 유동점을 만들고 유역을 렌더링했습니다. 이것은 Whitebox 사용자 경험을 느끼기에 충분했습니다.
Whitebox는 .Net 또는 Python을 사용하여 확장 가능하거나 소모품입니다. Whitebox UI에서 몇 가지 기본 사항을 달성 한 후, 일반적인 DEM 사전 처리 작업을 간단한 .Net 자동화 (아직 ArcMap 없음)로 연결한다고 생각했습니다. DEM 전처리는 일반적으로 다음을 의미합니다.
- 데이터 값을 설정하지 않음 (화이트 박스에 필요하지만 Arc는 절대 사용하지 않음)
- 싱크대 채우기
- 흐름 방향 래스터 생성
- 흐름 축적 래스터 생성
다음 Windows Form "application"(일명 WhiteboxDaisyChain
)을 정리했습니다 . ArcGIS Grid (.FLT)가 포함 된 시스템 디렉토리를 사용하여 위에서 언급 한 작업을 수행합니다. 이것을 시도 하려면 컴파일 된 바이너리 를 다운로드하고 압축을 푼 다음 모든 .dll
파일을 ..\WhiteboxGAT_1_0_7\Plugins
프로젝트로 복사해야합니다 ..\WhiteboxDaisyChain\Whitebox
. 그러나이 예제 DLLs
는 코드 샘플 맨 위에 언급 된 4 개만 필요합니다 .
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에서 타설 점을 제출하는 것입니다. 기본적으로지도를 클릭하고 싶습니다.