Whitebox GAT(無料でオープン)をArcMap UIと統合しますか?[閉まっている]


11

ホワイトボックス地理空間分析ツール

私は大学院で多くのArcGIS VBAオートメーションを書きました。ただし、ArcGIS Spatial Analystエクステンションに完全に依存しています。これは、クローズドソースであるだけでなく、抑止の点で高価です。

VBAは非推奨であり、Uの一部の研究者はまだ私のVBAツールを使用しているため、.Netでそれらを書き換えることは楽しいと思いました。しかし今、より多くの経験があれば、これらのユーティリティがオープンアルゴリズムを消費する場合、アカデミックな使用により適していることをさらに認識しています。

これを念頭に置いて、私はホワイトボックスGATをSpatial Analyst水文学ツールの潜在的な代役として検討しています。

いくつかの人々が、Saga、GRASS、Rなどの実装に反提案したいと思うと思います。これがあなたの立場なら、ホワイトボックスの統合を追求することが賢明ではない理由を説明してください。たとえば、いくつかの入力形式のみをサポートしているか、大きな(1-2 GB +)ファイルの処理が悪いかなどです。


Whitebox UIで遊んでみましたが、チュートリアルの助けを借りて、30メートルのDEMを前処理するのは難しくありませんでした。次に、ハイドロラスタを並べた後、流動点を作成し、その分水界をレンダリングしました。これで、Whiteboxのユーザーエクスペリエンスを十分に把握できました。

Whiteboxは、.NetまたはPythonを使用して拡張可能または消費可能です。Whitebox UIでいくつかの基本を達成したので、典型的なDEM前処理タスクを単純な.Netオートメーション(ArcMapはまだありません)でつなげると思いました。DEMの前処理は通常、次のことを意味します。

  1. データ値を設定しない(Whiteboxはこれを必要としますが、Arcは必要としませんでした)
  2. シンクを埋める
  3. 流れ方向ラスターを作成する
  4. フロー累積ラスターを作成する

次のWindowsフォーム「アプリケーション」(別名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から対話形式で流出点を送信することです。基本的に、地図をクリックします..分水界を取得します。


1
Whiteboxの最新バージョンでは、シェープファイルの流出点を画面上でデジタル化して流域ツールに入力できるようにしたかっただけです。それは非常にうまく機能します。JL

@JohnLindsay、ねえ、ホワイトボックスを作成したグエルフ教授としてあなたを認識しています。2012年1月にこのスレッドを開始したとき、Whiteboxは.Netで記述されていましたが、今ではJavaで理解されています。.Netの内容は維持されないため、このスレッドを削除することは無関係であると考えましたが、古いリリースがまだ利用可能である場合、保守されていない場合でも、価値があります。.Net WebServicesでWhiteboxを使用するフローティングファン向けのモバイルアプリを作成することを考えていましたが、それ以来、そのアイデアを表明しました。ダウンロード中の「アーカイブ」を見落としていませんか?
elrobis

回答:


3

Spatial Analyst以外のアプリケーションを検討する場合は、SEXTANTEライブラリの検討を検討してください。私は個人的に使用していませんが、このビデオクリップを見ると、ラスタを操作する方法を示していることがわかります。

なぜこのツールセットを検討するのでしょうか?彼らはすでに「SEXTANTE for ArcGISエクステンション」(無料)を構築しており、ユーザーはArcMapでSEXTANTEツールを使用できます。


それはいいヒントです、私はそれを調べます。
elrobis

SEXTANTE for ArcGISはもう存在しないことに注意してください。この質問をご覧ください。
フェスター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.