Создание инструмента геообработки под ArcGIS на примере инструмента "Моделирование зон атмосферного загрязнения"

Материал из GIS-Lab
Версия от 09:54, 22 мая 2012; Bishop (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску
Эта страница является черновиком статьи.


Введение

TODO: написать что это за инструмент и для чего нужен Разработку инструмента геообработки в ArcToolbox (молоточек в красном ящике) будем производить при помощи VisualStudio 10 Professional для ArcGIS 10.0. Указанный код может работать и под другие версии ArcGIS, но не тестировался.

Настройка проекта

Создадим новый проект типа ATL Project с именем AGConcentrate.Создадим новый проект типа ATL Project с именем AGConcentrate.

1000000000000320000001C2036C6689.png

После нажатия "ОК" запустится мастер. Оставляем все по-умолчанию.

100000000000027100000212CC7A2A0B.png

100000000000027100000212C309B6D7.png

После завершения мастера будет открыт созданный проект. На рисунке ниже приведена структура проекта в окне Visual Studio и как этот же проект выглядит в окне проводника Windows.

10000000000001BC000002370E639F33.png

Откроем файл 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.

1000000000000320000001C214B8FA87.png

Заполняем поле Short name открывшегося диалога.

100000000000027100000212502B006E.png

На следующем шаге ничего не трогаем.

1000000000000271000002129D575D52.png

Выставляем настройки как показано ниже и жмем "Finish".

100000000000027100000212DE0105E8.png

Жмем F7 и проверяем что все скомпилировалось. До этого мы работали со стандартными ATL компонентами. Настал момент подключения ArcGIS. Для этого необходимо вызвать контекстное меню на созданном классе и выбрать Add->Implement Interface...

100000000000029E0000015AFB2ABD38.png

И заполнить открывшийся диалог.

10000000000002710000021282C825E1.png

В сам класс будет добавлен новый родительский класс 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 ) и проверяем что все скомпилировалось. Добавляем класс нашего инструмента геообработки.

Инструмент геообработки

Добавление класса инструмента геообработки аналогично фабрике инструментов.

100000000000027100000212E8818AAE.png

Добавляем интерфейсы для геообработки.

1000000000000271000002126DD17954.png

Удаляем из 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. Для автоматической регистрации после удачной сборки допишем.

100000000000029D000000648BE098F0.png

Пропишем программу в которой будет исполнятся наш инструмент геообработки.

100000000000029E0000015A03334F6C.png

Проверяем наш инструмент запуская на исполнение (F5).

10000000000001870000022B8DEE0453.png