Как создать свою ГИС с помощью GIS ToolKit Active

Урок 4. Получение информации о выделенных объектах карты

Автор: Дарья Лунченко

Любое ГИС-приложение содержит в себе определенный набор функции анализа пространственных данных. А для этого ГИС-приложение должно уметь извлекать из записей объектов информацию об их метрике и семантике. Мы уже умеем выделять на карте объекты, отвечающие определенным условиям. В этом уроке мы на нескольких примерах рассмотрим, как получить из выделенных объектов информацию, необходимую для выполнения расчетных и аналитических операций.

После прохождения данного урока наше новое приложение будет уметь:

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

Пример того, как выглядит наше новое приложение на рис.1.

Рисунок 1 – Внешний вид приложения
 

Скачать рабочий образец программы и ее исходный код можно на страничке "Дополнительные материалы к уроку 4". Если у вас не установлен GIS ToolKit Active, то для запуска приложения вам потребуется загрузить библиотеки GIS ToolKit и выполнить их регистрацию. Все необходимые библиотеки и короткая инструкция размещены на этой же станице.

 

1. Получение информации о площади, периметре и длине выбранных объектов

При решении самых разных задач нам часто нужно знать такие характеристики объектов, как площадь, периметр или длина. Рассмотрим, как получить данные характеристики для группы выделенных на карте объектов. Получаемые данные отобразим в виде таблицы (рис. 2), в которую для всех выделенных площадных объектов мы записывем площадь и периметр, а для линейных - длину. В последней строки таблицы выводится подсчет сумм площадей, периметров и длин всех выделенных площадных и линейных объектов. Объекты других типов локализации, выделенные пользователем на карте, в этой задаче игнорируются.

Рисунок 2 – Справка о характеристиках выбранных объектов
 

  • добавляем на созданную нами ранее панель инструментов «Анализ данных», кнопку для вызова справки о характеристиках выбранных объектов
  • добавляем в созданный ранее проект новую форму Windows Form, на которой размещаем стандартный элемент отображения данных в табличном формате DataGridView, кнопку Button – для закрытия диалога, и переключатель RadioButton, которые позволят изменять единицы измерения площади и периметра (рис.3);

Рисунок 3 – Добавление на форму DataGridView, Button и RadioButton
 

  • создаем глобальный список SemantSquare, в котором будем хранить данные о площади, периметре и длине объектов, которые были выделены посредством клика мыши;
  • в событии, отвечающем за отжатие кнопки мыши OnMapMouseUp, используем методы MapObj1.SquareInMap – площадь объекта в проекции карты, MapObj1.Perimetr – периметр объекта, MapObj1.LengthInMap – длина объекта в проекции карты, и добавляем соответствующие характеристики в список SemantSquare;

  • в событии по нажатию на созданную нами кнопку «Анализ площади выбранных объектов», инициализируем форму, созданную нами ранее, для отображения характеристик объектов ForSemantic FormSquareSem = new ForSemantic();
  • если объекты выбирались по клику мыши, то проходим по всем объектам содержащимся в списке SemantSquare и добавляем в первые две ячейки строки созданного DataGridView значения номер и тип объекта;
  • далее проверяем, если объект является площадным, то отображаем только его площадь и периметр, если же линейный или векторный – то длину;
  • оставшиеся ячейки заполняем значениями соответствующей площади, периметра, длины и подсчитываем сумму соответствующих значений для вывода их в нижней строки таблицы;

  • если объекты выбирались любым другим способом, то формируем цикл в котором переходим от первого найденного объекта MapFind1.First() к последующему MapFind1.Next() и заполняем строки таблицы DataGridView характеристиками номер, тип, площадь, периметр, длина объекта;

  • для того, чтобы изменять значения единиц измерения площади и периметра, используя созданные нами RadioButtons: м2, км2, га для площади и м, км для периметра, создадим событие при нажатии на RadioButton, в котором умножаем полученные значения площади, периметра или длины объекта на соответствующие коэффициенты;

 

2. Анализ наличия подобъектов у выбранных объектов

Для создания на карте сложных объектов, к примеру с "дырками" внутри (река с островами, лес с полянами и т.д.), могут использоваться подобъекты. В этом примере мы рассмотрим, как получить информацию о наличии у объекта подобъектов и их количестве. Результат выполнения операции отобразим в виде таблицы, показанной на рисунке 4.

Рисунок 4 – Анализ наличия подобъектов

  • добавляем на созданную нами ранее панель инструментов «Анализ данных», кнопку «Анализ наличия подобъектов»
  • добавляем в созданный ранее проект новую форму Windows Form, на которой размещаем DataGridView с колонками «Номер», «Тип», «Количество подобъектов», и кнопку «Закрыть»;
  • создаем глобальный список SubObjList, в котором будем хранить данные о количестве подобъектов выбранных объектов;
  • в событии, отвечающем за отжатие кнопки мыши OnMapMouseUp, используем свойство MapObj1.Metric.SubjectCount, заполняем список SubObjList соответствующими значениями;
  • в событии по нажатию на созданную нами кнопку «Анализ наличия подобъектов», инициализируем форму, созданную нами ранее для отображения количества подобъектов ForSubObj SubObjForm = new ForSubObj();
  • аналогично с созданием справки характеристик объектов п.1, добавляем в созданную нами ранее таблицу данные о номере, типе объекта из списка KeyObj (создан в прошлом уроке), и количество подобъектов из списка SubObjList.

 

3. Извлечение характеристик из указанных семантик

Как правило, объекты карты содержат разнообразное число семантических характеристик, к примеру дорога может содержать такие характеристики как: тип покрытия, состояние дороги, ширина или максимальная допустимая скорость движения. Давайте научимся извлекать из записей объектов нужную нам семантическую информацию. Чтобы сравнить между собой объекты по какой-либо одной выбранной семантике создадим диалог «Анализ по выбранной семантике» (рис. 5).

Рисунок 5 – Вывод справки «Анализ по выбранной семантике»

  • добавляем на созданную нами ранее панель инструментов «Анализ данных», кнопку «Анализ по выбранной семантике»
  • добавляем в созданный ранее проект новую форму Windows Form, на которой размещаем DataGridView с колонками «Номер», «Тип», «Название выбранной семантики», и кнопку «Закрыть»;
  • добавляем ещё одну форму Windows Form, на которой размещаем стандартный элемент для выбора данных из списка ListBox, и кнопки Button (рис.6)

Рисунок 6 – Добавление элементов на форму выбора семантики
 

  • создаём списки ListBox GetSemantName, GetSemantName1 – для хранения наименования семнтик, GetSemantValue – для хранения значений соответствующих семантик, и UnikSemant – для получения уникальных названий семантик;
  • в событии, отвечающем за отжатие кнопки мыши OnMapMouseUp, при выделении по клику, заполняем созданные списки, используя методы MapObj1.Semantic.SemanticName_get – название семантической характеристики, MapObj1.Semantic.SemanticValue_get – значение семантической характеристики, GetSemantName1.Distinct() – для определения уникальных значений списка;

  • в событии по нажатию на созданную нами кнопку «Анализ по выбранной семантике», инициализируем форму, созданную нами ранее для отображения списка семантик SelectSemantic SemantList = new SelectSemantic();
  • если объекты выбирались по клику мыши, то проходим по всем элементам списка уникальных семантик UnikSemant, и добавляем их в ListBox, используя функцию SemantList.SemanticListBox.Items.Add();
  • если объекты выбирались любым другим способом, то проходим в цикле по всем найденным объектам, и добавляем их наименования семантик и значения в соответствующие списки GetSemantName, GetSemantValue, UnikSemant, далее добавляем уникальные семантики в ListBox, как это было описано выше;

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

  • для отображения объектов с выбранной семантикой создадим функцию SetViewObjSemantic в коде основной формы Form1.cs;
  • инициализируем форму для отображения выбранной семантики выделенных объектов ForStringSemant StringSemantForm = new ForStringSemant();
  • в цикле проходим по каждому объекту и всем его семантикам из GetSemantName, и сравниваем с значением выбранной семантики item, если значения равны то добавляем номер, тип и значение выбранной семантики данного объекта в таблицу;


 

4. Статистика числовой семантики

Мы разобрались, как выделить из множества семантик разных объектов нужные нам семантики, и как просмотреть список объектов с выбранной семантикой. Теперь научимся использовать семантики для выполнения расчетных операций. Многие объекты карты имеют семантики, в которых информация хранится в числовом виде, такие как: количество путей, максимальная глубина, абсолютная и относительная высота и т.д. Рассмотрим, как использовать выбранную числовую семантику выделенных объектов карты для получения статистики: сумма значений, среднее, минимальное и максимальное значения (рис.7).

Рисунок 7 – Анализ числовой семантики
 

  • добавляем на созданную нами ранее панель инструментов «Анализ данных», кнопку «Анализ числовой семантики»
  • добавим на созданную нами ранее форму для отображения объектов по выбранной семантике стандартный элемент TextBox, для отображения в нём статистики по числовой семантике (рис. 8)

Рисунок 8 – Добавление TextBox на форму

  • создаем новый список для хранения уникальных значений числовой семантики UnikNumerSem, далее в событии по отжатию мыши заполняем список семантиками как описано в п.3;

  • переходим к событию, которое происходит по нажатию на кнопку «Анализ числовой семантики», аналогично с п.3 добавляем уникальные семантики в список UnikNumerSem, если объекты выбирались не по клику, и используем уже заполненный список в другом случае;
  • для того чтобы определить является ли семантика числовой, создаем еще два списка SemantCode – для определения кода семантики, TypeSemant – для определения типа семантики;
  • используем свойства MapView1.MapSemantics.Semantic CodeName_get – код семантической характеристики по её названию, MapView1.MapSemantics.TypeByCode_get – тип семантики по её коду, для определения является ли семантика числовой;
  • свойство MapView1.MapSemantics.TypeByCode_get = 1, означает, что семантика числовая, следовательно, оставляем её в списке UnikNumerSem, остальные удаляем;
  • заполняем используемый ранее ListBox - список семантик для выбора;

  • для вывода объектов с выбранной числовой семантикой в таблицу DataGridView, воспользуемся созданным ранее методом SetViewObjSemantic;
  • создаем список NumSemValue – для хранения числовых значений выбранной семантики, переменную NumerSemanClick - флаг выбора кнопки «Анализ по числовой семантике»;
  • если значение NumerSemanClick = true, рассчитываем сумму значений семантик, и добавляем в список NumSemValue – значения семантик, используя свойства списка NumSemValue.Average(), NumSemValue.Max(), NumSemValue.Min() - определяем среднее, максимально и минимальное значения;
  • полученные значения выводим в TextBox;

Теперь наше ГИС-приложение умеет получать нужную информацию об объектах карты и содержит несколько простых аналитических инструментов. В дальнейшем мы еще вернемся к этой теме и рассмотрим более сложные задачи пространственного анализа. А в следующих уроках мы начнем создавать собственный редактор векторных карт.

Смотреть: Дополнительные материалы к уроку 4 >>