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

Урок 1. Создание простого ГИС приложения на основе GIS Toolkit Active

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

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

Наше первое приложение будет уметь: открывать карты в форматах *.map, *.sit, *.sitx, созданные средствами «Панорама», растры в формате *.rsw, матрицы в формате *.mtw.

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

Рисунок 1. Пример работы приложения

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

1. Создание проекта и панели инструментов

О том как установить GIS ToolKit Active и подключить его к среде Microsoft Visual Studio уже было рассказано в аннотации к курсу. Теперь перейдем к созданию нашего первого ГИС-приложения.

 

1.1 Создание нового проекта «Windows Forms»

Чтобы создать новое приложение запустим Microsoft Visual Studio, и нажмем «Файл»-> «Создать проект»-> «Приложение Windows Forms Visual C#»-> «Создать» (рис.2). В результате чего у нас появится проект, содержащий пустую форму Windows Form (рис.3), готовую для добавления на неё компонентов.

Рисунок 2. Создание проекта

Рисунок 3. Вид полученной формы и обозревателя решений

1.2 Добавление компонента доступа к электронной карте

Для того, чтобы открыть карту, и начать с ней работу давайте добавим на форму компонент доступа к электронной карте – axcMpView, приставка axc означает что это визуальный объект, а ax – соответственно не визуальный, по своему назначению он похож на стандартный компонент PictureBox (рис.4).

Рисунок 4. Добавление компонента axcMapView

При работе с GIS ToolKit ActiveX важно знать, что доступ к базовому классу объекта-интерфейса компонентов осуществляется через свойство C_CONTAINER. В компонентах, работа которых зависит от других компонент присутствует свойство cMapXXX. Таким образом, каждый новый добавленный компонент необходимо при инициализации формы связывать с теми компонентами от которых он зависит.

 

1.3 Добавление панели инструментов

Для работы с картой нам понадобится панель инструментов с кнопками «Открыть карту», «Состав отображения», «Список данных карты», «Увеличить изображение», «Уменьшить изображение», «Исходный масштаб», «Вся карта в окне», «Закрыть карту» (рис.5).

Рисунок 5. Панель инструментов

1.3.1 Выбираем стандартный компонент в «Панель элементов» -> «ToolStrip», и размещаем его над axcMapView. Далее нажимаем на иконки и в свойствах компонента добавляем ранее подготовленные картинки кнопок (рис.6).

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

2. Обработка событий при нажатиях на кнопки меню "ToolStrip"

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

2.1 Открыть карту

  • добавляем на форму компонент axaxOpenMapDialog <рис.dl010109.png>- диалог открытия пространственных данных;
  • используем метод axcMapView.MapOpen для открытия карты и axcMapView.AppendData для добавления данных к уже открытой карте.

Более подробную информацию о методах используемых компонентов и их параметрах можно получить в Gis ToolKitAX 11 Руководство программиста

2.2 Уменьшить или увеличить изображение по нажатию мыши

Для того, что бы было удобно пользоваться картой добавим возможность её масштабирования в точке нажатия мыши:

  • объявим компонент работы с координатами axMapPoint

  • свяжем его с axcMapView свойством axMapPoint.cMapView при инициализации формы

  • для того, чтобы координаты изображения были в пикселях, при инициализации формы, установим MapView1.PlaceOut = axGisToolKit.TxPPLACE.PP_PICTURE;
  • создадим событие axcMapView.OnMapMouseUp, и зададим систему координат для перемещения точки масштабирования в центр, MouseXY.PlaceInp = axGisToolKit.TxPPLACE.PP_PICTURE (координаты точек в системе изображения в пикселях);
  • используем метод MouseXY.SetPoint, устанавливаем координаты точки метрики в системе координат установленной ранее свойством PlaceInp;
  • в зависимости от того увеличить или уменьшить масштаб, оперируем методами axcMapView.ViewScale (текущий масштаб отображения) и axcMapView.ScaleInPoint (установить текущий масштаб отображения и переместить центр в указанную точку), масштабируем изображение.

2.3 Состав отображения

Обычно карта состоит из множества различных линейных, точечных и площадных объектов. Зачастую пользователю необходимо для работы выбрать только один слой объектов, к примеру слой гидрографии. Это нам позволит сделать диалог «Состав карты» (рис.7).

Рисунок 7. Диалог «Состав карты»

  • добавим на форму компонент выбора условий поиска/отображения axMapSelectDialog
  • свяжем его с axcMapView свойством axMapSelectDialog.cMapView при инициализации формы

  • при обработке события нажатия на кнопку используем метод MapSelectDialog1.Execute в который передаем свойство axcMapView.ViewSelect, предоставляющее доступ к свойствам экземпляра класса условий поиска/отображения aiMapSelect (ai – наименования COM объектов).

2.4 Список данных карты

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

Рисунок 8. Диалог «Список данных карты»

  • добавим на форму компонент axMapDataList , и свяжем его свойством axMapDataList.сMapView с axcMapView

  • при обработке события нажатия на кнопку используем метод MapDataList1.stdExecute(), который вызывает стандартный диалог отображения и изменения состава данных электронной карты.

2.5 Исходный масштаб

Позволяет быстро перейти к базовому масштабу карты (в котором карта была создана), для этого при обработке события нажатия на кнопку воспользуемся методом axcMapView.MapScale.


2.6 Вся карта в окне

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


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

  • добавим на форму компонент поиска объектов векторной карты axMapFind , и свяжем совйством axMapFind.cMapView с с axcMapView.
  • добавим компонент объекта электронной карты axMapObj , для доступа к базе данных электронной карты.
  • образуем связку поиск-объект axMapFind с axMapObj свойством axMapFind.cMapObj при инициализации формы.

  • при обработке события axcMapView.OnMapMouseUp, которое ранее мы использовали для масштабирования добавим метод axMapObj.SelectObjectInPoint – выбрать объект карты в точке используя форму диалога, в который передаем координаты мыши при нажатии на объект и радиус поиска.

2.8 Закрыть карту
Если вдруг пользователь ошибся с выбором карты, то чтобы ему заново не открывать приложение, используем кнопку закрыть карту. Для этого воспользуемся свойством axcMapView.MapClose().

3 Вывод информации о карте в строке состояния

Чтобы дать дополнительную информацию пользователю о названии карты, текущем масштабе, основном масштабе и координатах при передвижении мыши создадим информационную строку (рис.9).

Рисунок 9. Информационная строка

  • для отображения текущего масштаба и координат мыши добавим в низ формы стандартный элемент StatusStrip на котором нажатием мыши, создадим три ToolStripStatusLabel
  • создадим событие axcMapView.OnMapMouseMove, отвечающее за передвижение мыши.
    в первый ToolStripStatusLabel выведем информацию о текущем масштабе axcMapView.ViewScale

  • в оставшиеся ToolStripStatusLabel соответственно координаты X и Y в метрах. Для этого, используя метод axMapPoint.SetPoint - устанавливаем координаты в системе координат PlaceIn (в пикселях).


  • получаем координаты для вывода методом axMapPoint.GetPoint в системе координат заданной свойством PlaceOut (в метрах)


  • далее выводим информацию в ToolStripStatusLabel



  • для отображения названия карты и ее основного масштаба добавим на форму еще один стандартный элемент StatusStrip
  • используем методы axcMapView.MapName и axcMapView.MapScale, которые размещаем в событии «Открыть карту».

4. Кнопки «Справка» и «Помощь»

Любая программа удобна, если в ней уже содержится необходимая справочная информация. Так как добавленные нами ранее диалоги работы с картой содержат кнопки «Помощь» или «Справка», то воспользуемся уже готовыми справками «Панорама». Пример расположения данных кнопок в диалоге показан на рис. 10.

Рисунок 10. Пример расположения кнопки «Помощь»

  • добавим файлы «mapselec.chm» и «panorama.chm», находящиеся в С:\…\Panorama\GIS ToolKit Active\Dll\gislib11\Help в директорию с приложением
  • добавим компонент предназначенный для настройки параметров работы ГИС-ядра axGisProperty
  • при инициализации формы, используем метод axGisProperty.mapSetPathShell, для того чтобы установить в ГИС ядре путь к директории приложения.

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

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