Создание инструмента геообработки под ArcGIS на примере инструмента "Моделирование зон атмосферного загрязнения"
Введение
TODO: написать что это за инструмент и для чего нужен Разработку инструмента геообработки в ArcToolbox (молоточек в красном ящике) будем производить при помощи VisualStudio 10 Professional для ArcGIS 10.0. Указанный код может работать и под другие версии ArcGIS, но не тестировался.
Настройка проекта
Создадим новый проект типа ATL Project с именем AGConcentrate.Создадим новый проект типа ATL Project с именем AGConcentrate.
После нажатия "ОК" запустится мастер. Оставляем все по-умолчанию.
После завершения мастера будет открыт созданный проект. На рисунке ниже приведена структура проекта в окне Visual Studio и как этот же проект выглядит в окне проводника Windows.
Откроем файл targetver.h.
#pragma once
// Including SDKDDKVer.h defines the highest available Windows platform.
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
#include <SDKDDKVer.h>
Из текста понятно, что если мы хотим компилировать для предыдущих платформ, то необходимо определить _WIN32_WINNT и включить заголовочный файл WinSDKVer.h до файла SDKDDKVer.h.
Изменим targetver.h следующим образом:
#pragma once
#include <WinSDKVer.h>
#define _WIN32_WINNT 0x0501
#include <SDKDDKVer.h>
На этом этапе можно откомпилировать (F7). Если регистрация не удалась, можно перезапустить студию с правами администратора и попробовать снова. Проект пустой и должен компилироваться и регистрироваться.
1>Time Elapsed 00:00:00.19 2>------ Skipped Build: Project: AGConcentratePS, Configuration: Debug Win32 ------ 2>Project not selected to build for this solution configuration ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 1 skipped ==========
Создание классов инструмента геообработки
Далее создаем фабрику инструментов геообработки (у нас он будет один). Для этого вызываем контекстное меню на имени проекта и выбираем Add->Class... Откроется диалоговое окно, в котором выбираем ATL->ATL Simple Object и нажимаем Add.
Заполняем поле Short name открывшегося диалога.
На следующем шаге ничего не трогаем.
Выставляем настройки как показано ниже и жмем "Finish".
Жмем F7 и проверяем что все скомпилировалось. До этого мы работали со стандартными ATL компонентами. Настал момент подключения ArcGIS. Для этого необходимо вызвать контекстное меню на созданном классе и выбрать Add->Implement Interface...
И заполнить открывшийся диалог.
В сам класс будет добавлен новый родительский класс IGPFunctionFactory и его методы. В файл stdafx.h будет добавлена строчка:
#import "C:\Program Files (x86)\ArcGIS\Desktop10.0\com\esriGeoprocessing.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids, auto_search
которую предлагаю заменить на
#import "libid:C031A050-82C6-4F8F-8836-5692631CFFE6" raw_interfaces_only raw_native_types no_namespace named_guids
что бы не зависеть от путей в системе (удобно при переносе кода с машины на машину). Опять делаем Build ( F7 ) и проверяем что все скомпилировалось. Далее заполним методы класса CAGConcGPFunctionFactory и внесем изменения в файл AGConcGPFunctionFactory.rgs для регистрации нашей фабрики в ArcToolbox
HKCR
{
NoRemove CLSID
{
ForceRemove {797B145E-DDAE-4194-BF30-2F3460864F40} = s 'AGConcGPFunctionFactory Class'
{
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
TypeLib = s '{D8888BDD-960E-477C-871B-C056D7428551}'
Version = s '1.0'
'Implemented Categories'
{
{FD939A4A-955D-4094-B440-77083E410F41}
}
}
}
}
Опять делаем Build ( F7 ) и проверяем что все скомпилировалось. Добавляем класс нашего инструмента геообработки.
Инструмент геообработки
Добавление класса инструмента геообработки аналогично фабрике инструментов.
Добавляем интерфейсы для геообработки.
Удаляем из stdafx.h дописанную туда мастером строчку.
#import "C:\Program Files (x86)\ArcGIS\Desktop10.0\com\esriGeoprocessing.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids, auto_search
Далее заполняем сформированные методы интерфейсов IGPFunction и IGPFunction2. Для автоматической регистрации после удачной сборки допишем.
Пропишем программу в которой будет исполнятся наш инструмент геообработки.
Проверяем наш инструмент запуская на исполнение (F5).