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

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

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

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

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

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

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

 

1. Панель инструментов

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

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

 

2. Описание событий при нажатии на кнопки функций поиска

2.1 Общий поиск

Данный вид поиска предоставляет пользователю возможность установить критерии поиска, выбрав из списка необходимые для анализа слои и типы объектов. Реализуется поиск на основе диалога «Поиск объектов карты», который по своей структуре похож на диалог «Состав карты», использованный нами ранее для установки условия отображения объектов на карте (рис.2).

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

  • используем добавленный нами ранее компонент выбора условий поиска/отображения axMapSelectDialog , для подключения диалога «Поиск объектов карты».
  • воспользуемся методом MapSelectDialog1.Execute, в который передаем свойство axMapFind.cMapSelect, предоставляющее доступ к свойствам экземпляра класса условий поиска aiMapSelect, а также значение true, означающее что форма будет отображаться для выбора условий поиска, иначе для выбора условий отображения.
  • для определения кода завершения диалога используем свойство MapSelectDialog1.ModalResult, если значение равно 1, значит нажали кнопку «Найти».
  • для отображения диалога с информацией о каждом объекте axMapObj.ExecuteDlgFind, подходящем под условия поиска, воспользуемся созданным ранее объектом электронной карты axMapObj , содержащим в себе результаты поиска, связанным при инициализации формы с axMapFind.

 

2.2 Поиск по названию

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

Рисунок 3 - Диалог «Поиск по названию»
 

Функция поиска по названию реализуется на основе интерфейса доступа "MAPAPI" к ГИС-ядру "ПАНОРАМА".

  • для импорта функции поиска по названию создадим новый класс, нажав "Проект"->"Добавить новый элемент"->"Класс"->"Добавить" (рис.4) ;

Рисунок 4 - Добавление нового класса
 

  • далее добавим в класс и в форму пространство имен System.Runtime.InteropServices ;
  • осуществим импорт функции поиск по названию selSearchName, посредством вызова неуправляемого кода из библиотеки gisforms.dll с помощью атрибута Dllimport;

  • данная функция содержит в себе ссылки ref на две структуры, которые необходимо задать, используя атрибут StructLayout, в котором LayoutKind.Sequential означает, что члены объекта располагаются последовательно в порядке своего появления при экспортировании в неуправляемую память;

TASKPARMEX - содержит текущие системные параметры:

ARRAYNAME - содержит адрес массива названий семантических характеристик для поиска:

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

  • при нажатии на кнопку «Поиск по названию» вызываем функцию поиска selSearchName из класса Semantic_DLG, передавая в неё идентификатор открытой карты MapView1.MapHandle, идентификатор контекста поиска объектов MapFind1.MapSelectHandle, и ссылки на структуры ref TASKPARMEX param, ref ARRAYNAME arname ;
  • записываем возвращаемое значение функции в переменную semparam, если значение равно 1, значит пользователь нажал кнопку «Найти»;
  • вызываем диалог отображения данных о найденном объекте, используя объект электронной карты axMapObj.

 

2.3 Поиск по выделенной области

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

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

  • добавим на форму компонент выбора области карты в заданной системе координат axMapSelectRect ;
  • свяжем его свойством axMapSelectRect.cMapView с компонентом доступа к электронной карты axMapView ;

  • при обработке события нажатия на кнопку «Выбор области», используем метод MapSelectRect1.StartAction(), для того чтобы включить режим выбора области;
  • далее переходим к событию, происходящему после нажатия мыши на карте - axcMapView.OnMapMouseUp, так как это событие уже содержит код, отвечающий за выбор информации на карте, а также за масштабирование, введем переменную SelectRect, которая принимает значение true при нажатии на кнопку выбор области;
  • создадим новый объект карты MapObjForSelect и свяжем его с axMapView

  • проверим свойством MapSelectRect1.Selection наличие выделенной области, и создадим пустой объект типа OL_SQUARE - площадной, используя метод axMapObj.CreateObjectByExcode в который передаем: порядковый номер карты, тип метрики, тип объекта определяемый внешним кодом, и характером локализации;

  • добавим на форму компонент работы с координатами axMapPoint и свяжем его с axMapView ;
  • зададим систему координат для MapSelectRect1 и MapPoint1 в метрах

  • установим метрику созданного объекта методом MapObjForSelect.Metric.Append, который поочередно добавляет точку в конец метрики;
  • используя структуру - точка метрики axGisToolKit.TxDoublePoint mypoint, а также свойство MapSelectRect1.SelectedRect - возвращающее координаты выделенной области устанавливаем метрику созданного объекта

  • свойством MapObjForSelect.Commit() записываем изменения в метрике в базу данных электронной карты;
  • устанавливаем методом MapFind1.cMapSelect.SelectSeekArea параметры поиска объектов по области, задав такие основные параметры как, номер карты и область поиска, которая содержится в объекте карты MapObjForSelect

  • вызываем диалог отображения данных о найденных объектах внутри области, используя объект электронной карты MapObjForSelect

2.4 Продолжить поиск

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

Для восстановления поиска воспользуемся стандартным диалогом отображения данных о найденных объектах axMapObj.ExecuteDlgFind, в который передадим данные о выбранных объектах MapFind1.cMapSelect и параметр true - поиск будет продолжен с того объекта, на котором он был закончен.

 

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

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