Автор: Дарья Лунченко
Одной из важных задач ГИС является получение новых данных на основе анализа
пространственной информации. А поскольку многие явления окружающего мира
имеют непрерывный характер, то для представления данных о них нам нужно
использовать подходящие для этого модели данных. Одной из наиболее удобных
моделей представления непрерывных данных является матричная форма. Матрицы
дают возможность отобразить значение моделируемой характеристики в любой
точке. При этом, изменяя размер ячейки матрицы, можно управлять точностью
представления информации и объемом хранимых данных. С помощью матриц легко
представить, например, рельеф какой-то территории, распределение загрязняющего
вещества, характер расселения населения в пределах региона и многие другие
виды данных. Важным преимуществом матричных моделей является простота
работы с ними. Однако сначала матрицу нужно создать. При этом зачастую
источником данных для построения матрицы могут служить измерения исследуемой
величины лишь в отдельных точках выбранной территории, а для заполнения
всех ячеек матрицы приходится использовать какой-то алгоритм интерполяции.
В этом уроке мы рассмотрим, как создавать матричные модели средствами
GIS ToolKit и как получать из матриц данные для решения каких-то практических
задач.
Технология "Панорама" поддерживает несколько
типов матриц: матрицы высот, матрицы слоев (трехмерные матрицы) и матрицы
качеств (также называемые поверхностями), а также растры качеств (это
тоже матрицы, только в ячейках хранится значение цвета, а не значение
реальной величины). Мы рассмотрим работу с двумя типами матриц: с матрицами
качеств MTQ и матрицами высот MTW.
Созданное в этом уроке приложение позволит:
- создавать матрицу качеств на основе семантических характеристик объектов;
- создавать матрицу высот на основе объектов карты, содержащих абсолютную
высоту;
- получать данные из матриц для решения производных задач.
Внешний вид приложения представлен на рис. 1.

Рисунок 1 - Внешний вид приложения
Скачать рабочий образец программы, ее исходный код, а
также примеры данных, используемые в этом уроке, можно на страничке "Дополнительные
материалы к уроку 12". Если у вас не установлен GIS ToolKit Active,
то для запуска приложения вам потребуется загрузить библиотеки GIS ToolKit,
и выполнить их регистрацию. Все необходимые библиотеки и короткая инструкция
размещены на этой же странице.
1. Создание матрицы качеств по значениям семантик точечных объектов
Матрица качеств представляет собой поверхность значений
заданной моделируемой характеристики. Каждая ячейка матрицы содержит в
себе значение, вычисленное по характеристикам анализируемых объектов карты.
На примере построения матрицы распределения показателя кислотности почв,
мы разберем алгоритм создания матриц качеств, который можно использовать
и при работе с самыми разными моделируемыми характеристиками территории,
такими например, как температура воды, плотность населения, распределение
загрязняющих веществ, количество осадков, уровень радиации и многое другое.
Во всех этих случаях источником данных для построения матрицы служат измерения
исследуемой величины, записанные в семантику отдельных объектов (чаще
точечных) и каким-то образом распределенные по участку территории.
Мы в качестве исходных данных будем использовать карту
полей, в определенных точках которых были взяты пробы грунта и определен
водородный показатель почв - pH, характеризующий кислотность почв.
В соответствии со способом получения данных о pH применяется
следующая классификация почв по степени их кислотности и щелочности и
способ их представления на картах (табл.1).

Для создания матрицы качеств пользователь нашей ГИС будет
должен:
1) открыть карту с анализируемой характеристикой;
2) в диалоге параметров создания матрицы заполнить все необходимые поля;
3) нажать кнопку "Выполнить" (рис. 2).

Рисунок 2 - Диалог параметров для создания матрицы качеств
Переходим к решению поставленной задачи:
- создаем новую форму Windows Form CreateMTQParametrs.cs, на которую
помещаем стандартные компоненты textBox, comboBox, Button и т.д. (рис.3);

Рисунок 3 - Диалог создания матрицы качеств
- создаем класс CreateMTQ.cs, в котором будем определять функции для
работы с матрицами;
- в классе CreateMTQ.cs, определяем функцию по нажатию на меню главной
формы "Файл"->"Создать матрицу качеств", в которой активируем систему
поиска, проходим по всем объектам карты и определяем уникальные семантики;

- определяем семантики, которые имеют числовой тип и запоминаем их
код, заполняем на форме CreateMTQParametrs.cs выпадающий список полученными
семантиками;

- вызываем диалог заполнения параметров, для создания матрицы качеств;
- при нажатии на кнопку выбора имени матрицы, запускаем диалог сохранения
файла saveFileDialog1, при успешном выборе файла, запоминаем имя матрицы
в переменной MTQName, вставляем его в textBox и устанавливаем флаг "имя
матрицы выбрано" mtqNameFl=1;

- вводим в textBox значение размера элемента матрицы, проверяем является
ли введенное значение числом, и с помощью метода Convert.ToDouble переводим
его в тип double, устанавливаем флаг "размер задан" elemSizeFl = 1;

- аналогично проверяем, вводимые пользователем минимальное и максимальное
значения характеристики качества MinValue, MaxValue, устанавливаем соответствующие
флаги;

- при выборе семантики для построения, запоминаем номер семантики и
устанавливаем флаг "семантика выбрана" semantFl=1;

- при выборе метода построения поверхности, запоминаем номер метода
в соответствующую переменную Method, и устанавливаем флаг "метод выбран"
methodFl=1;

- при выборе области построения матрицы по габаритам карты, определяем
его функцией MapView1.GetRegionDFrame, и заполняем переменные начала
отсчета матрицы( юго-западный угол), высоту и ширину;

- при выборе области построения матрицы по прямоугольной области, активируем
режим выбора области MapSelectRect1.StopAction(), и на основе координат
выбранной области, определяем начало координат матрицы, высоту и ширину;

- при выборе области построения матрицы по объекту, с помощью MapFind1.FindPoint
включаем режим поиска в заданной точке, далее с помощью функции MAPAPI
mapObjectFrame определяем габариты объекта и рассчитываем параметры
матрицы;

- для формирования легенды матрицы пользователю предлагается 24 цвета,
представленные в виде кнопок, необходимо задать цвет первой, последней
кнопки и средней между ними, остальные цвета рассчитываются автоматически;
- добавляем на форму диалог выбора цвета colorDialog1, при нажатии
на кнопки легенды, вызываем этот диалог и запоминаем выбранные пользователем
цвета;

- далее проходим по всем кнопкам, находящимся между первыми двумя цветами
и рассчитываем шаг изменения цвета палитры, с помощью функции GetColorF
получаем последовательно новые цвета;

- аналогично поступаем для определения цветов легенды, находящихся
между вторым и третьим цветом, выбранным пользователем;

- при условии, что все поля диалога заполнены, активируем кнопку "Создать";

- в классе FMapAPI.cs импортируем функцию построения матрицы поверхности
mtrBuildMatrixSurface, а также структуру параметров для построения матрицы
- BUILDSURFACE;

- при нажатии на кнопку "Создать", определяем структуру параметров
создания матрицы BUILDSURFACE и устанавливаем:
1) значение флага расширения создаваемого файла FileMtw
= 0 (*.mtq);
2) значения начала матрицы, ширины и высоты, которые ввел пользователь
- BeginX, BeginY, Width, Height;
3) если выбран режим построения матрицы "по объекту", заполняем поле
Border идентификатором объекта;
4) минимальное, максимальное значения MinValue, MaxValue;
5) метод построения Method;
6) семантику для построения матрицы SemantCode;
7) количество цветов в палитре PalleteCount;
и другие параметры;

- в структуру также необходимо передать указатель на палитру цветов,
массив значений которых мы заполнили при определении легенды, для этого
выделяем дескриптор для объекта палитра handle, получаем адрес закрепленного
объекта и передаем его в структуру параметров BUILDSURFACE;

- вызываем функцию для построения матрицы качеств mtrBuildMatrixSurface,
добавляем созданную матрицу в проект, с помощью функции mapSetMtqShowRange
устанавливаем диапазон отображаемых элементов матрицы, mapSaveMtq -
сохраняем изменения матрицы;

2. Анализ матрицы качеств распределения показателя кислотности
На данном этапе у нас есть матрица качеств, которая отображает
распределение показателя кислотности почв. Области матрицы, где кислотность
почв высокая, видны в соответствии с цветом выбранной палитры и отображаются
оранжевым цветом (рис.4).

Рисунок 4 - Матрица качеств распределения показателя
кислотности почв
Теперь рассмотрим, как получать из матрицы качеств данные
для решения задач или формирования производных данных. В нашем примере
это будет получение новой матрицы качеств, показывающей сколько необходимо
внести нейтрализующего вещества на единицу площади для обработки участков
с высоким уровнем кислотности. Воспользуемся таблицей норм внесения CaCO3 для известкования кислых грунтов легкого гранулометрического состава по
M.В. Козлову, А. А. Плишко, в которой указано, что при показателе кислотности
5.1 -5.5 необходимо внести 2.4 т/га известняка, 4.5 - 5 - 4.5 т/га, <=4.5
- 5.5 т/га.
На основе этих данных, получаем новую матрицу качеств,
в ячейках которой записаны значения необходимого количества внесения известняка
(рис.5).

Рисунок 5 - Матрица качеств распределения необходимого
количества известняка
Данная частная задача может быть примером для решения
ряда других задач, например, оценка загрязнения территории и расчёт количества
нейтрализующих веществ при чрезвычайной ситуации и т.п.
Реализация данной функции:
- создаем новую форму Windows Form MatrixCalculateParam.cs, на которую
помещаем textBox, button, ComboBox (рис.6);

Рисунок 6 - Диалог параметров матрицы распределения
необходимого известняка
- при нажатии на кнопку выбора файла, вызываем диалог сохранения файла,
и запоминаем выбранное имя матрицы качеств;

- запоминаем введенное пользователем число pH, ниже которого необходимо
проводить известкование, значение по умолчанию составляет 5.5;

- при нажатии на кнопку "Выполнить", вызываем функцию MatrixPHCalculate,
в которой определяем габариты и размер элемента исходной матрицы качеств,
запрашиваем общие параметры проекции для документа;

- инициализируем структуру параметров создания матрицы BUILDMTW, определяем
начальную точку матрицы, ширину и высоту по полученным габаритам, устанавливаем
размер элемента матрицы, определяем палитру матрицы результата и вызываем
функцию MAPAPI mapCreateMtq;

- так как результирующая матрица имеет неравномерные диапазоны, необходимо
определить массив значений диапазонов, и с помощью функции mapSetMtqPaletteDiaoason
установить верхние значения диапазонов палитры;

- с помощью функций mapGetMtqWidthInElement, mapGetMtqHeightInElement,
запрашиваем высоту и ширину матрицы в элементах, проходим по всем элементам
матрицы и получаем их значения функцией MAPAPI mapGetMtqPoint;
- при условии, что значение элемента ниже порогового значения, установленного
пользователем, определяем текущие координаты элемента в метрах, и с
помощью функции MAPAPI mapPutMtqValue, записываем в матрицу результата
значение количества известняка, в зависимости от попадания в диапазоны
распределения pH;

3. Создание матрицы высот
Матрица высот рельефа представляет собой набор ячеек,
значения которых определяются по значениям абсолютных или относительных
высот, записанных в объектах карты. Матрица высот имеет формат MTW и позволяет
решать большой круг задач, например построение зон видимости, вычисление
длин и площадей объектов с учетом рельефа, моделирование зон затопления,
определение направлений склонов, построение трехмерных карт местности
и т.д (рис.6).

Рисунок 6 - Матрицы высот
Для того чтобы построить матрицу высот пользователю необходимо
задать ряд параметров ее описывающих:
1) имя матрицы высот (*.mtw);
2) размер элемента матрицы в метрах;
3) единицы измерения высоты: метры, дециметры, сантиметры, миллиметры;
4) метод построения поверхности : средневзвешенная интерполяция по 16
направлениям, по 8 направлениям, средневзвешенная интерполяция по 16
направлениям (сглаживание поверхности), линейная интерполяция по сетке
треугольников;
5) тип матрицы высот: по абсолютным высотам, по относительным высотам,
по суммарным высотам;
6) высота при попадании в элемент более одного объекта с высоты: заносить
среднюю высоту, заносить максимальную высоту, заносить минимальную высоту;
7) флаг формирования экстремумов;
8) ограничение габаритов при создании матрицы: ограничение не выполняется,
ограничивается габаритами района, ограничиваются габаритами области
расположения объектов;
9) область построения матрицы: по габаритам карты, по выделенной области,
по объекту (рис.7).

Рисунок 7 - Диалог параметров построения матрицы высот
Для создания матрицы высот:
- создадим новую форму Windows Form CreateMTWParametrs.cs, и добавим
на нее стандартные элементы textBox, comboBox, radioButton, Button;
- при нажатии на кнопку выбора файла, вызываем диалог сохранения файла
saveFileDialog1, при успешном выборе файла, запоминаем имя матрицы и
выводим его в textBox;

- определяем размер элемента матрицы, и устанавливаем флаг "размер
элемента выбран";

- при выборе пользователем из выпадающего списка единиц измерения высоты,
запоминаем единицу измерения и устанавливаем соответствующий флаг;

- при выборе метода построения поверхности, устанавливаем флаг "метод
построения выбран", и запоминаем номер метода, который выбрал пользователь;

- при выборе типа матрицы и высоты при наложении, определяем выбранный
пользователем индекс, который соответствует типу матрицы высот или типу
занесения высоты;

- устанавливаем флаги необходимости формирования экстремумов и ограничения
габаритов;

- при выборе области построения матрицы по габаритам карты, по выбранной
области, по объекту, аналогично с тем как мы делали это при создании
матрицы качеств, рассчитываем значения начала матрицы (юго-западный
угол), ширину высоту;
- при нажатии на кнопку "Создать", определяем структуру параметров
создания матрицы высот BUILDMTW, в которую помещаем переменные, которые
были заполнены при формировании пользователем параметров матрицы;

- вызываем функцию MAPAPI mapBuildMtw для построения матрицы высот
на заданный участок работ, добавляем матрицу в проект;

4. Построение зоны видимости
Научим наше ГИС-приложение использовать данные матрицы
высот для решения прикладных задач. В нашем примере такой задачей будет
оценка видимости территории с учетом рельефа. Построение зон видимости
может использоваться в разных задачах, связанных с размещение наблюдательных
постов при охране территории, размещение радиолокационных средств или
средств связи, подбор точек размещения оборудования при геодезических
работах и т.д.
Результатом анализа будет матрица видимости, представляющая
собой матрицу формата .*mtq, в которой цвет элемента ячейки устанавливается
в зависимости от того видны ли точки местности с вершины, для которой
строится зона видимости в пределах заданного радиуса.
Мы рассмотрим построение зоны видимости с вышек, которые
служат для наблюдения за охраняемой территорией.
Исходными данными является матрица высот, которая была
построена нами ранее и карта расположения вышек, содержащая в себе абсолютные
высоты (рис.8).

Рисунок 8 - Зоны видимости вышек
Реализация данной функции:
- создадим новую форму Windows Form CreateVisibleZoneParamF.cs для
ввода параметров создания матрицы видимости (рис.9);

Рисунок 9 - Диалог параметров построения зоны видимости
- при нажатии на кнопку выбора файла, открываем диалог сохранения файла,
запоминаем имя выбранного файла и выводим его в textBox;
- при выборе из выпадающего списка матрицы высот и карты с объектами
по которым строится зона видимости, определяем их идентификаторы;

- аналогично с построением матриц качеств и высот, определяем размер
элемента и радиус зоны видимости в метрах;
- определяем цвет отображения зоны видимости, вызываем диалог выбора
цвета colorDialog1;

- при нажатии на кнопку "Выполнить", инициализируем структуру параметров
построения матрицы зоны видимости BUILDVISIBLE, устанавливаем параметры
зоны видимости, и вызываем функцию MAPAPI для построения матрицы видимости
mtrBuildVisibleMtq;

В этом уроке мы научились работать с некоторыми из функций
GIS ToolKit, позволяющих анализировать пространственные данные и моделировать
непрерывные процессы.
Этот урок завершает цикл учебных материалов по работе
с GIS ToolKit Active для начинающих программистов. И, хотя в 12-ти уроках
трудно представить весь функционал пакета GIS ToolKit Active, мы надеемся,
что смогли показать самые важные функции, необходимые программисту для
создания собственного ГИС-приложения.
Смотреть: Дополнительные
материалы к уроку 12