Интеграция Whitebox GAT (бесплатно и открыто) с пользовательским интерфейсом ArcMap? [закрыто]

11

Инструменты геопространственного анализа Whitebox

Я написал несколько автоматизаций ArcGIS VBA в аспирантуре; однако они полностью зависят от расширения ArcGIS Spatial Analyst, которое не только с закрытым исходным кодом, но и дорого с точки зрения сдерживания.

Поскольку VBA устарела и некоторые исследователи в U по-прежнему используют мои инструменты VBA, я подумал, что было бы интересно переписать их в .Net. Но теперь, с большим опытом, я также понимаю, что было бы более подходящим для академического использования, если бы эти утилиты использовали открытые алгоритмы.

Имея это в виду, я рассматриваю Whitebox GAT в качестве потенциального заменителя для гидрологических инструментов Spatial Analyst, и мне любопытно, есть ли какие-либо истории успеха или экономия времени, связанная с интеграцией ArcGIS / Whitebox.

Я ожидаю, что некоторые люди захотят противопоставить внедрение Saga, GRASS, R и так далее. Если это ваша позиция, пожалуйста, опишите, почему было бы неразумно проводить интеграцию с Whitebox. Например, поддерживает ли он только несколько форматов ввода, имеет ли он плохую обработку больших (1-2 ГБ +) файлов и т. Д.


Я немного поигрался с интерфейсом Whitebox, и с помощью их уроков было нетрудно предварительно обработать 30-метровую ЦМР, которую я лежал вокруг. Затем, после выравнивания гидро растров, я создал точку застывания и сделал ее водоразделом. Этого было достаточно, чтобы почувствовать пользовательский опыт Whitebox.

Whitebox расширяется и / или расходуется с помощью .Net или Python. Пройдя некоторые основы в пользовательском интерфейсе Whitebox, я решил связать воедино типичные задачи предварительной обработки DEM с помощью простой автоматизации .Net (пока нет ArcMap). Предварительная обработка DEM обычно означает следующее:

  1. не указывать значения данных (Whitebox нуждается в этом, но Arc никогда этого не делал)
  2. заполнить раковины
  3. создать растр направления потока
  4. создать растр накопления потока

Я собрал следующую форму Windows "приложение" (иначе 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. В основном, я хочу нажать на карту ... получить водораздел.

elrobis
источник
1
Я просто хотел отметить, что последние версии Whitebox позволяют оцифровывать точку заливки шейп-файла на экране для ввода в инструмент водораздела. Это работает довольно хорошо. JL
@JohnLindsay, привет, я узнаю тебя как профессора Гвельфа, который создал Whitebox. Когда я начал эту тему в январе 2012 года, Whitebox был написан на .Net, но теперь я понимаю, что он на Java. Я считал удаление этой темы неуместным, поскольку материал .Net не поддерживается, но если старый выпуск все еще доступен, даже не поддерживается, он по-прежнему полезен. Я думал о создании мобильного приложения для плавающих энтузиастов, которое использует Whitebox в .Net WebServices, но с тех пор я высказал эту идею. Я пропустил "архивы" среди загрузок?
elrobis

Ответы:

3

Если вы хотите рассмотреть другие приложения за пределами Spatial Analyst, вы можете изучить библиотеку SEXTANTE . Хотя я лично не использовал его, если вы посмотрите этот видеоклип , вы увидите, что они демонстрируют способы работы с растрами.

Почему вы можете рассмотреть этот набор инструментов? Они уже создали « расширение SEXTANTE для ArcGIS » (бесплатно), которое позволяет пользователям использовать инструменты SEXTANTE в ArcMap.

RyanKDalton
источник
Это хороший совет, я посмотрю на это.
elrobis
Обратите внимание, что SEXTANTE для ArcGIS больше не существует. Смотрите этот вопрос .
Фезтер