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

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

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

На данном этапе наше приложение уже содержит в себе функции по созданию карты и объектов на ней. Теперь разберемся с функциями по редактированию объектов.

После прохождения урока мы получим редактор карт, позволяющий:

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

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

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

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

1. Добавление кнопок на панель инструментов

Для создания собственного редактора карт, добавим на левую панель инструментов следующий набор кнопок: "Создать объект по типу", "Создать подобъект", "Переместить объект", "Изменить тип объекта", "Удалить подобъект", "Удалить все подобъекты", "Удалить объект", "Редактировать метрику", "Добавить точку метрики", "Переместить точку метрики", "Удалить точку метрики" (рис. 2).

Рисунок 2 - Внешний вид панели инструментов редактора

2. Описание событий, соответствующих кнопкам на панели инструментов

2.1 Создание объектов по типу

Создание объектов по типу позволяет создать объект с кодом (видом) уже существующего объекта. Для этого пользователю необходимо выбрать объект-эталон, и приступить к созданию нового объекта.

А мы, чтобы обеспечить пользователя такой операцией, должны проделать следующее:

  • в событии, созданном нами в предыдущем уроке для создания объекта ButtonAction, используем свойство MapEditMetric1.MetEditMode = axGisToolKit.TxEditMode.emCreate, для включения режима создания нового объекта;

  • в событии по нажатию на кнопку мыши в области карты axcMapView_OnMapMouseDown, выбираем объект, по типу которого необходимо создать новый;

  • нажатие на правую кнопку мыши, определяет место начала создания нового объекта. Если создается объект-подпись, то вводим текст подписи в поле формы, созданной нами ранее;

2.2 Создание подобъектов и перемещение объектов

Подобъекты могут понадобиться при создании сложных объектов. Например, необходимо создать лес с полянами, океан с островами и т.д (рис. 3).

Рисунок 3 - Создание подобъектов у объекта "лес"

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

  • в событии ButtonAction используем свойства axGisToolKit.TxEditMode.emCreateSubj и axGisToolKit.TxEditMode.emMove, для включения режима создания объекта;

  • это-же свойство axGisToolKit.TxEditMode.emMove можем использовать и для включения режима перемещения объекта;

  • как и при создании объекта по типу, выбираем объект для редактирования, и используем функцию MapEditMetric1.StartAction() для активизации режима редактирования;
     
    Примечание: подключение компонента редактирования метрики объекта axMapEditMetric описано в уроке №5.
  • после двойного щелчка на поле карты, вызываем событие MapEditMetric1.OnExecute, и используя метод MapObj1.Commit() или MapObj1.CommitAsNew(), записываем изменения объекта в карту или же записываем объект как новый;

  • при завершении режима редактирования, вызываем событие MapEditMetric1.OnStopAction, в котором сбрасываем идентификатор объекта карты и устанавливаем значение флага редактирования объекта NewObj = false;

2.3 Изменение типа объекта

Данная функция позволяет изменить тип уже существующего объекта на другой, посредством выбора его из классификатора карты (рис. 4). К примеру, мы можем заменить площадной объект река на линейный и т.д. Если же преобразование невозможно, то объект останется без изменений. После изменения типа объекта вы можете редактировать его семантику и удалить несоответствующие типу объекта поля.

Рисунок 4 - Изменение типа объекта

Реализация:

  • в событии по нажатию мыши на карте axcMapView_OnMapMouseDown проверяем нажата ли кнопка "Изменить тип объекта", и объявляем структуру axGisToolKit.TxMapObjectInfo - описание выбранного объекта карты;
  • передаем в функцию MapSelectObjRsc.Execute ссылку на структуру axGisToolKit.TxMapObjectInfo, для получения выбранных пользователем из классификатора классификационного кода объекта ExCode и характера локализации Local на которые необходимо изменить в выбранном объекте;
  • в классе для импорта функций MAPAPI вызываем из gisacces.dll функции mapGetObjectNumber - запрос порядкового номера объекта в карте, mapDeleteObjectByNumber - удалить объект карты по его номеру, описанные в mapapi.h;

  • используем импортируемые функции для удаления объекта с порядковым номером, соответствующим выбранному объекту;
  • с помощью функции MapObj1.SetObjectByExcode, устанавливаем описание выбранного объекта карты, передавая в него новые код объекта ExCode и характер локализации Local;
  • записываем изменения объекта в карту, методом MapObj1.CommitAsNew();

2.4 Удаление подобъекта, удаление всех подобъектов объекта

При создании сложных объектов с подобъектами может возникнуть вопрос о удалении какого-либо выбранного подобъекта или же удалении всех подобъектов объекта (рис. 5).

Рисунок 5 - Удаление подобъекта

  • Добавляем на форму компонент выбора точки на объекте карты GetMapPoint, и связываем его свойствами cMapView, cMapObj с компонентами axcMapView, axcMapObj соответственно;
  • при нажатии мыши на карте проверяем, что нажата кнопка "Удалить подобъект", и включаем режим выбора точки GetMapPoint.StartAction();

  • импортируем функцию MAPAPI mapDeleteSubject, для удаления выбранного подобъекта;

  • при нажатии левой кнопки мыши на подобъекте, вызываем событие, происходящее после выбора точки GetMapPoint1.OnPointSelect, в котором используем свойство GetMapPoint1.PointSubj для определения номера выбранного подобъекта и mapDeleteSubject для его удаления;

  • для удаления всех подобъектов выбранного объекта, с помощью функции mapDeleteSubject, определяем тип локализации объекта: площадной, линейный или подпись(данные типы объектов могут содержать подобъекты), и используя свойство MapObj1.Metric.SubjectCount - количество подобъектов, удаляем их.

2.5 Удаление объекта

Для того чтобы удалить объект карты, в событии axcMapView_OnMapMouseDown, проверяем нажата ли кнопка "Удаление объекта", и используя свойство MapObj1.Delete(), удаляем объект, спрашивая перед этим пользователя подтверждение.

 

2.6 Редактирование метрики объекта, работа с контуром объекта

После того как объект уже создан пользователю может понадобиться его изменить, например при ошибочном создании его контура, или же просмотреть подробную информацию о метрике объекта (рис. 6).

Рисунок 6 - Диалог "Редактирование метрики выбранного объекта"

  • Для перемещения, добавления, удаления точки контура объекта в событии ButtonAction устанавливаем соответствующие свойства axGisToolKit.TxEditMode.emEdit, axGisToolKit.TxEditMode.emAddPoint axGisToolKit.TxEditMode.emRemPoint;

  • далее по аналогии с п. 2.2, начинаем редактирование с помощью функции MapEditMetric.StartAction();
  • для подключения диалога редактирования метрики объекта, добавляем на форму компонент axMetricDialog, и связываем его свойствами cMapView, cMapObj с компонентами axcMapView, axcMapObj соответственно;
  • в событии axcMapView_OnMapMouseDown, используем метод axMetricDialog.Execute для вызова диалога редактирования метрики;

3. Сохранение параметров работы после закрытия приложения

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

  • Правой кнопкой мыши откроем свойства проекта и перейдём на вкладку "Параметры", зададим переменные для настройки и их тип : MapFileName - имя карты, MapLeft , MapTop, - левый верхний угол окна просмотра карты в текущем масштабе, ViewScale - текущий масштаб (рис.7);

Рисунок 7 - Параметры настроек приложения

  • создаём событие, происходящее во время закрытия формы Form1.FormClosing, и сохраняем параметры приложения, заданные ранее;

  • создаём событие, происходящее при загрузке главной формы приложения Form1.Load, и восстанавливаем сохранённые параметры;

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

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