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

Урок 5. Создание карты, добавление объектов

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

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

В результате прохождения урока у нас появится возможность:

  • создания новой пользовательской карты, многолистовой карты, плана;
  • создания объектов с помощью стандартного диалога «ГИС Карта» через MAPAPI;
  • создания объектов с помощью функций GIS ToolKit Active;
  • создания объектов из .xml файла.

Внешний вид приложения представлен на рис. 1.

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

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

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

Многолистовая карта - это карта, которая состоит из отдельных фрагментов (листов), каждый из которых охватывает определенную территорию. Территория каждого листа ограничена рамкой. Нельзя создавать объект, выходящий за границы этой рамки. Если в ходе редактирования карты пользователь создает объект выходящий за рамки листа, то он будет обрезан по рамке. Если разные части объекта попадают в пределы разных листов, то объект будет разделен на соответствующие части, каждая из которых охраняется на своем листе. Листы не могу перекрываться, но между ними могут быть разрывы. Карты такого типа хорошо подходят для создания топографической основы территории, ведь в подавляющем большинстве стран используется понятие розграфки картируемой территории на номенклатурные листы. Для хранения многолистовых карт программа создает не одну, а несколько баз данных (по числу листов карты). Однако визуально для пользователя многолистовая карта выглядит как единая территория (если между листами нет разрывов). Хотя многолистовая карта состоит из нескольких баз, она имеет один общий паспорт карты (файл *.map) и один общий для всех листов классификатор. Нужно отметить, что важнейшим преимуществом многолистовых карт является более высокая скорость визуализации и обработки данных на большие территории. Это достигается за счет того, что информация распределена по отдельным базам и во многих случаях программа может ограничиться анализом и извлечением данных только одной-двух относительно небольших баз, вместо обработки одной огромной базы. В завершение заметим, что хотя этот тип карт называется многолистовой картой, мы конечно всегда можем создать карту на любую по размерам территорию, состоящую только из одного листа.

Второй тип карт - пользовательская карта - это безразмерная карта, покрывающая любую по площади территорию. Габариты этой карты изменяются системой по мере добавления или удаления пользователем данных. Такая карта имеет файл паспорта с расширением SIT или SITX (карта-хранилище). Важнейшее преимущество таких карт - это возможность накладывать их поверх многолистовой карты, плана или других пользовательских карт. Это полезное свойство определяет использование таких карт для отображения ситуативной информации.

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

Далее рассмотрим какие действия от пользователя ожидает наша программа для создания каждого типа карт.

1. Создание пользовательской карты

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

  • масштаб карты;
  • классификатор;
  • эллипсоид;
  • проекция, и её постоянные;
  • система высот;
  • система координат;
  • датум.

На рис. 2 представлен вид диалога создания карты.

Рисунок 2 – Диалог создания карты
 

1) Имя карты – в данном поле выбираем место на компьютере для хранения карты, при этом формат .sit, .sitx используется для создания пользовательской карты, а .map – для создания многолистовой карты ограниченной рамкой;

2) Классификатор – выбираем классификатор карты, представляющий собой описание слоев векторной карты, видов объектов и условных знаков;

Скачать уже готовые классификаторы различного назначения можно по ссылке http://www.gisinfo.ru/classifiers/classifiers.htm.

3) Тип карты – данное поле содержит набор видов карт (рис. 3), которые можно создать в приложении, при выборе некоторых из них, поля: «Эллипсоид», «Проекция», и отдельные параметры вкладки «Постоянные проекции» определены по умолчанию.

Рисунок 3 – Поле «Тип карты»
 

К примеру, при выборе типа карты «Топографическая 42 года» автоматически устанавливается проекция Гаусса-Крюгера равноугольная, эллипсоид Красовского 1940, а также смещение на Восток 500000 м. Выбрав данный вид карты, пользователь может изменять только осевой меридиан зоны, соответствующей выбранной для картографирования территории.

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

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

Больше информации о зависимости между типом карты и другими характеристиками паспорта вы можете получить по ссылке с.9. (http://gistoolkit.ru/download/doc/sxf4txt.pdf)

4) Система высот – в данном поле вы можете выбрать систему высот, к примеру, Балтийскую или же средний уровень мирового океана.

5) Датум – данная вкладка отображает параметры ориентирования эллипсоида определяемой системы координат, относительно эллипсоида WGS84, чаще всего данные параметры определены по умолчанию.

2. Создание многолистовой карты

Для создания многолистовой карты, т.е. карты, состоящей из номенклатурных листов ограниченных рамкой, необходимо выбрать формат .map, в результате диалог «Создание карты» приобретает дополнительную вкладку «Номенклатура листа» (рис. 4).

Рисунок 4 – Создание многолистовой карты
 

При нажатии кнопки «Добавить» появится диалог для ввода номенклатуры листа карты (рис. 5).

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

В результате получаем карту имеющую следующий вид (рис. 6).

Рисунок 6 – Вид многолистовой карты

3. Создание плана

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

Диалог создания плана выглядит следующим образом (рис. 7)

Рисунок 7 – Диалог создания плана
 

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

4. Добавление функций создания карт и планов в приложение

Теперь, когда мы разобрались с особенностями создания карт и планов, перейдем к реализации этих возможностей в нашем ГИС-приложении.

  • Добавим в выпадающее меню пункт «Создать» -> «Карту», «План» (рис.8);

Рисунок 8 – Добавление пунктов меню
 

  • в созданном нами ранее отдельном классе FMapAPI.cs, импортируем функцию MAPAPI paspCreateMap из библиотеки gispasp.dll (более подробное описание функций в paspapi.h);

  • используя параметры функции: hmap – идентификатор открытой карты, StringBuilder mapname – имя карты, int size – длина строки содержащей имя карты; TASKPARMEX parm – структура параметров для диалога, определенная нами ранее, вызываем диалог «Создание карты» в событии, при нажатии на пункт меню «Файл»->«Создать»->«Карту»;

  • для создания плана, также используем функцию MAPAPI paspCreatePlan с параметрами StringBuilder mapname – имя карты, int size – длина строки, содержащей имя карты; TASKPARMEX parm – структура параметров для диалога, определенная нами ранее;

  • в событии при нажатии на пункт меню «Файл»->«Создать»->«План», используем импортируемую функцию для вызова диалога «Создание плана».

5. Создание нового объекта карты

Так как карта состоит из набора объектов различного типа, то далее, мы рассмотрим, как создавать новые объекты на карте (рис. 9).

Рисунок 9 – Создание нового объекта
 

  • создадим новую панель инструментов ToolStrip, и разместим её слева на главной форме, добавив на неё две кнопки «Создать объект», «Создать объект из XML» (рис.10)

Рисунок 10 – Добавление панели инструментов

  • добавим на форму два новых компонента GIS ToolKit Active: axMapSelectObjectRsc – для выбора вида объекта из классификатора; axMapEditMetric – компонент визуального редактирования метрика объекта карты;
  • свяжем их свойством C_CONTAINER с axcMapView, а axMapEditMetric дополнительно свяжем с компонентом объекта электронной карты MapObj1;
  • для создания подписей добавим новую форму Windows Form на которой разместим textBox, и две кнопки Button «Ок», «Отмена» (рис. 11);

Рисунок 11 – Форма для добавления объектов-подписей
 

  • в событии при нажатии на кнопку «Создать объект», используем метод MapSelectObjectRsc1.ExecuteForMapObj, для выбора объекта карты из её классификатора (рис.12), axMapEdit.StartAction, и свойство MapEditMetric1.MetEditMode = axGisToolKit.TxEditMode.emCreate, для включения режима создания нового объекта;

Рисунок 12 – Выбор типа объекта из классификатора
 

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

  • в событии по нажатию кнопкой мыши на axcMapView axcMapView_OnMapMouseDown, проверяем включен ли режим редактирования, и создаем новый объект;

  • после создания объекта, вызываем событие MapEditMetric1_OnExecute – окончание редактирования метрики, метод axMapObj.Commit() для записи объекта в базу данных электронной карты, и axMapObj.Repaint() – для перерисовки объекта карты;

6. Создание объектов импортом из XML файла

Далее, мы рассмотрим, другой способ создания объектов - импортом данных из файла. Мы можем использовать как источник данных текстовые файлы, файлы Excel, dbf или файлы каких-то других форматов. В нашем примере мы выбрали в качестве источника данных XML файл, поскольку в последнее время формат XML стал очень популярным и все больше пространственных данных распространяются именно в файлах такого типа.

К примеру, существует XML файл, в котором содержится: ID объекта, тип локализации, классификационный код объекта, текст (для подписей) и координаты X, Y. Структура файла представлена на рис.13.

Рисунок 13 – Пример XML файла
 

  • в коде формы Form1.cs подключим пространство имен System.Xml.Linq, System.Xml, и создадим функцию get_tag_value для чтения XML файла и разбора значений его тегов;
  • используя класс XmlNodeList – предоставляет упорядоченную коллекцию узлов, а также свойство XmlNode.ChildNodes – возвращает все дочерние узлы данного узла, добавляем соответствующие значения атрибутов и значений тегов в список, возвращаемый функцией get_tag_value;

  • добавляем на главную форму стандартный компонент - диалог для открытия файла OpenFileDialog, и используем его при обработке события по нажатию на кнопку «Создать объект из XML», для выбора XML файла;

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

  • используя метод MapObj1.CreateObjectByExcode, создаем объекты из файла, передавая в него параметры:

    - SiteNumber – порядковый номер карты;
    - Kind – тип метрики;
    - ExCode – тип объекта из классификатора;
    - Local – тип локализации объекта.

  • если создаваемый объект является подписью, то используя свойство MapObj1.Text_set, устанавливаем текст подписи;
  • добавляем метрику созданному объекту с помощью метода MapObj1.Metric.Append, записываем в базу данных и перерисовываем объект методами axMapObj.Commit() и axMapObj.Repaint() соответственно;

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

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