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

Урок 3. Функции для выделения объектов карты

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

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

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

  • выделять объекты на карте, используя стандартный диалог «Состав отображения»;
  • выделять объекты на карте по названию (значению текстовой семантики);
  • выделять объекты по клику мыши на карте, и по выбранной области;
  • получать список выделенных объектов в виде таблицы с уникальным номером, ключом, типом и именем;
  • производить все операции, используя не только панель инструментов, а и пользовательское меню.

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

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

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

 

1. Выделение объектов с помощью стандартных диалогов

В предыдущем уроке, мы рассмотрели как производить поиск объектов, используя стандартные диалоги общего поиска и поиска по названию в семантике, возможно вы заметили, что на их панели кроме кнопки «Найти», есть кнопка «Выделить» (рис.2, 3). Далее мы рассмотрим, как сделать её активной:

Рисунок 2 - Диалог установления параметров общего поиска/выделения
 

Рисунок 3 - Диалог установления параметров поиска/выделения по названию семантики
 

  • в событии обрабатывающем «Общий поиск», используем свойство MapSelectDialog1.ModalResult - значение кода завершения диалога, где ModalResult = 8, означает, что нажали кнопку «Выделить»;
  • устанавливаем параметры группового выделения объектов карты, с помощью метода axcMapView.SetObjSelected, в который передаем условия поиска MapFind.cMapSelect, и цвет выделения TxColorRef aColor;

  • так как нам потребуется часто использовать структуру - значение цвета TxColorRef, вынесем её в отдельную структуру COLOR, в созданном ранее нами классе FMapAPI.cs

  • теперь добавим возможность выделения в диалог «Поиск по названию», для этого воспользуемся тем же методом группового выделения объектов карты, что и для общего поиска

 

2. Добавление элементов панели инструментов

Для работы с функциями выделения, кроме добавленных нами в предыдущем уроке кнопок поиска, нам понадобятся кнопки: «Произвольное выделение», «Выделение по области», «Снять выделение». Создадим их на панели инструментов нашего приложения (рис.4).

Рисунок 4 - Вид кнопок выделения на панели инструментов

 

3. Описание событий при нажатии на кнопки функций выделения

3.1 Произвольное выделение

Кнопка «Произвольное выделение» позволит нам выделить объекты кликом мыши последовательно выбирая их на карте. Данный вид выделения удобен, если пользователь четко знает какие объекты он хочет проанализировать, и их количество невелико (рис.5).

Рисунок 5 - Произвольное выделение объектов
 

  • создаём переменную SelectByClick, которая будет отвечать за выделение по клику, устанавливаем её значение в true, если нажата кнопка «Произвольное выделение»;
  • в созданном ранее событии, происходящем после нажатия мыши на карте - axcMapView.OnMapMouseUp, если значение SelectByClick= true, то используем свойство axMapFind.FindPoint = true, устанавливая активным режим поиска в заданной точке;
  • если axMapFind.FindPoint = true, то поиск объектов осуществляется в области с центром заданным свойствами axMapFind.X, axMapFind.Y и размером axMapFind.Radius;
  • для того чтобы создать список объектов для выделения, воспользуемся функцией MapView1.ViewSelect.SelectSample, которая добавляет в список выделенных объектов, объекты карты с уникальным номером MapObj1.Key, в листе с именем MapObj1.ListName;
  • напомню, что MapObj1 представляет собой компонент объекта электронной карты, и был добавлен нами ранее (см. урок 1), и связан с компонентом поиска axMapFind, и с axMapView;
  • далее выделяем выбранный объект методом axMapView1.SetViewSelected (true, SetColor.aColor), где true означает, что мы выделяем объекты, цветом SetColor.aColor;


 

3.2 Выделение по области

Выделение по области позволяет выделить объекты на карте внутри области, определенной пользователем. Данный вид выделения является достаточно простым и удобным для выделения объектов заданного участка работ.

Рисунок 6 - Выделение объектов по области
 

  • так как в предыдущем уроке уже был реализован выбор области на карте, то добавляем в событие при нажатии на кнопку «Выбор по области», код для включения режима выбора по области;

  • далее создадим функцию SelectionRect(), и перенесем в неё код из axcMapView.OnMapMouseUp, относящийся к выделению области и поиска по ней, а также добавим новый для выделения объектов внутри области;
  • для этого воспользуемся методом установления параметров поиска/выделения по области MapFind1.cMapSelect.SelectSeekArea, в который передаем:

    SiteNumber = -1 - номер карты в цепочке, для всех карт используют значение -1;
    MapObjForSelect.C_CONTAINER - объект карты (область поиска);
    aDistance = 0 - растояние от границы области поиска в метрах;
    aAction = 1 - предстоящее дествие 1 - выделение, 0 - поиск;
    aFilter = 2;
    aInside = 1 - поиск внутри области;
    aVisible = 0 - без учета видимости объектов на карте.

  • создадим цикл, в котором переходим от первого найденного объекта MapFind1.First() к последующему MapFind1.Next(), и учитывая пока MapFind1.Eof != true, т.е. пока не достигнут последний найденный объект, добавляем их в список объектов для выделения функцией MapView1.ViewSelect.SelectSample


 

3.3 Снятие выделения

Для того, чтобы снять выделение, при обработке события нажатия на кнопку, воспользуемся двумя методами: MapView1.ClearObjectSelected() - для отмены группового выделения объектов, и MapView1.ViewSelect.ClearSampleAll() - для сброса списка выделенных объектов.

 

4. Добавление пользовательского меню

Почти в любой программе кроме панели инструментов, существует пользовательское меню с перечислением тех же функций, которые доступны из панели инструментов. Это делает приложение более удобным и структурированным. Таким образом давайте добавим и в наше приложение такую возможность:.

  • откроем панель элементов, и перетащим из неё в верхнюю часть формы элемент MenuStrip (рис.7);

Рисунок 7 - Вид панели элементов
 

  • добавим в него основные пункты : "Файл", "Вид", "Поиск и выделение", "Задачи", "Справка" (рис. 8).

Рисунок 8 - Вид нового меню
 

  • теперь в основные пункты добавим такие подпункты как:
  • "Файл"-> "Открыть карту", "Добавить карту", "Закрыть карту";
    "Вид" -> "Список данных карты", "Состав отображения", "Увеличить масштаб", "Уменьшить масштаб", "Исходный масштаб", "Вся карта в окне";
    "Поиск и Выделение"->"Общий поиск", "Поиск по названию", "Поиск по области", "Произвольно выделение", "Выделение по области", "Снять выделение";
    "Задачи" -> "Анализ данных";
    "Справка" -> "Вызов справки", "О программе".

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

Остановимся более подробно на новых пунктах меню: "Анализ данных", "Вызов справки".

 

4.1 Анализ данных

Пункт меню "Задачи"->"Анализ данных" выполняет открытие новой панели инструментов, которая содержит кнопку: «Список выбранных объектов». Для добавления панели инструментов:

  • по аналогии с добавлением основной панели инструментов приложения, выберем в окне «Панель элементов» компонент ToolStrip. Добавим его на форму справа главного окна карты;
  • данная панель будет появляться и исчезать при нажатии на подпункт меню "Анализ данных", таким образом настроим первоначально её свойство Visible = false;

 

4.2 Вызов справки

При нажатии на пункт меню "Вызов справки" отобразит справку «Панорама», поместив вместе с файлом приложения файл Panorama.chm, и используя класс Help и его метод Help.ShowHelp отобразим окно справки (рис. 9).

Рисунок 9 - Вид окна справки

 

5. Список выделенных объектов

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

Для того чтобы получить таблицу с выделенными объектами, нам понадобится новая форма Windows Form, на которую мы добавим стандартный элемент отображения данных в табличном формате DataGridView (рис. 10).

Рисунок 10 - Добавление на форму DataGridView
 

  • далее нажимаем на DataGridView правой кнопкой мыши, и выбираем пункт меню "Правка столбцов", в котором нажав кнопку "Добавить", добавляем название необходимых столбцов (рис.11)

Рисунок 11 - Добавление столбцов таблицы
 

  • далее необходимо собрать список характеристик объектов, и отобразить их в таблице, для этого создадим функцию ObjectStatistic();
  • добавляем строки в таблицу, перебирая выделенные объекты, и используя метод SemGridView.Add();
  • в цикле проходим по строкам, и добавляем в ячейки таблицы соответствующие значения:
  • MapObj1.Key - номер объекта,
    MapObj1.KeyName - ключ,
    MapObj1.Local - характер локализации,
    MapObj1.ObjName - условное название объекта;


 

  • в результате получаем список выделенных объектов в виде таблицы (рис. 12).

Рисунок 12 - Список выделенных объектов
 

В данном уроке мы научились выделять объекты различными способами, тем самым подготовив основу для проведения анализа данных по их характеристикам. В следующем уроке мы попробуем разобраться как извлекать для обработки различные семантики объектов, а также получать статистику выделенных объектов.

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