Автор работы: Пользователь скрыл имя, 01 Ноября 2010 в 17:43, Не определен
Разработка и применение прикладных приложений на базе MapInfo
Для
интеграции в программе должна присутствовать
инструкция, запускающая MapInfo в фоновом
режиме. Например, в программе на языке
Borland Delphi можно запустить MapInfo вызовом
функции CreateObject()/
OleMapInfo:=
CreateOLEObject('MapInfo.
Программа MapInfo запускается в фоновом режиме незаметно для пользователя, не выводя заставку на дисплей.
Разрабатываемое приложение осуществляет управление программой MapInfo, конструируя строки, представляющие операторы языка MapBasic, которые затем передаются в MapInfo посредством механизма управления объектами OLE (OLE Automation) или динамического обмена данных (DDE). MapInfo выполняет эти операторы точно так же, как если бы пользователь вводил их с клавиатуры в окно MapBasic.
Если
необходимо открыть окно Карта, нужно
использовать оператор Map языка MapBasic точно
таким же образом, как в обычной MapBasic-программе.
Однако в приложении с интегрированной
картой должны также использовать дополнительные
операторы (например, Set Next DocumentParent), чтобы
окно Карта могло стать подчиненным (порожденным)
окном Вашего приложения. Этот процесс
известен как «переподчинение» окна. Можно
переподчинить окна Карты, Списка, Графика,
Отчета и Легенды.
Рис.7. Интерфейс
пользователя разработанный в Borland Delphi
Для отображения карты в приложении необходимо использовать оператор Set Application Window. Этот оператор объявляет, какое окно будет окном приложения. Для всех последующих окон диалогов MapInfo будет считаться, что они порождены этим другим окном. Этот пример используется в интегрированной картографии, когда окна MapInfo показываются из других приложений.
Обычно программа, написанная на Borland Delphi, сначала создаёт объект MapInfo Object и затем посылает MapInfo оператор Set Application Window, после чего приложение на Borland Delphi становиться порождающим окном для диалогов MapInfo. Если оператор Set Application Window не был прописан, то становиться очень трудно координировать передачу фокуса между MapInfo и Borland Delphi.
Пересылка команд в программу MapInfo
После запуска программы MapInfo необходимо сконструировать текстовые строки, представляющие операторы языка Map Basic. Если установлена связь с MapInfo, используя механизм управления объектами OLE (OLE Automation), командная строка передаётся программе MapInfo методом Do.
Например:
OleMapInfo.Do ('здесь команда MapBasic');
В компоненте это реализовано процедурой ExecuteCommandMapBasic, но, в сущности, вызывается OleMapInfo.Do.
При использовании метода Do программа MapInfo исполняет командную строку точно, так как если б ее ввели в окне команд MapBasic. Возможно передать оператор в программу MapInfo, если этот оператор допустим окне MapBasic. Не возможно переслать MapBasic-оператор Dialog, поскольку его использование не разрешено в окне MapBasic.
Технические аспекты интегрированной картографии
Системные требования
- Интегрированная картография возможна только в операционной среде Windows. Можно использовать 16-битовую среду (Windows 3.1, Windows for Workgroups) или 32-битовую среду (Windows 95, Windows NT 3.51 или более поздние версии).
- Интегрированная картография требует наличия программы MapInfo 4.0 или более поздней версии. Можно использовать полную копию MapInfo или исполнительный (runtime) модуль MapInfo (специальная «усеченная» версия MapInfo, поставляемая только в качестве основы для специализированных приложений).
- Компьютер пользователя должен иметь достаточно свободной памяти для одновременной работы Вашей программы-клиента и программы MapInfo.
- Программа-клиент должна быть способна действовать в качестве контроллера механизма управления объектами OLE (OLE Automation controller) или клиента динамического обмена данных (DDE-клиента). Рекомендуется применение механизма управления объектами OLE как более быстрого и надежного метода по сравнению с динамическим обменом данных.
- Программа-клиент должна быть способна создать интерфейсные элементы (окна, формы и т.п.), в которые можно поместить окно Карты и определять Windows HWND окна
Другие технические замечания
- Для разработки приложения с интегрированной картой необходимо написать программу на языке, отличном от MapBasic, называемую в дальнейшем программа-клиент. Можно написать программу-клиент, используя различные популярные среды программирования, такие как Visual Basic (версия 3.0 или более поздняя), C, PowerBuilder или Delphi.
- Интегрированная Картография использует механизм управления объектами OLE (OLE Automation), но не использует Внедрение OLE. Когда Вы хотите поместить окно Карта MapInfo в приложение, не осуществляется его внедрение (embedding); напротив, происходит переподчинение окна посредством пересылки программе MapInfo серии командных строк. В результате окна MapInfo отображаются на дисплее как порожденные окна приложения.
- Интегрированная Картография не использует специализированные элементы управления VBX (Visual Basic Custom Control) или OCX. MapInfo Corporation не предоставляет какие-либо заголовочные файлы или библиотеки. (Программное обеспечение MapInfo включает в себя несколько динамически подключаемых библиотек (файлы .DLL), но к ним не обращаются непосредственно; эти библиотеки предназначены для внутреннего использования программой MapInfo).
Объектная модель механизма управления объектами OLE
На
следующей диаграмме приведена схема
объектной модели MapInfo (Рис. 8.).
Рис.8.
Схема объектной модели MapInfo.
- Объект Application (Приложение) представляет работающий экземпляр MapInfo.
- Семейство MBApplications (MapBasic-Приложения) представляет список MapBasic-приложений, работающих в данный момент.
- Семейство MBGlobals (Глобальные переменные в среде MapBasic) представляет список глобальных переменных, декларированных одним из работающих MapBasic-приложений.
Пример простейшей программы
Следующая программа на Borland Delphi даст представление о том, как легко встроить окно MapInfo в другую программу.
Сначала, создадим новый проект Delphi. В процедуре FormCreate добавим следующие строки:
Const
SW_SHOWNORMAL = 1;
var
OleMapInfo: Variant;
MsgString : String;
sWinHand : String;
begin
OleMapInfo := CreateOLEObject('MapInfo.
Str(pnlMap.Handle, sWinHand);// Указываем место где будет отображаться карта.
MsgString := 'Set Next Document Parent ' + sWinHand + ' Style 1';// переподчинение окна.
OleMapInfo. Do(MsgString); //Пересылка команд в программу MapInfo
MsgString := 'Set Application Window ' + sWinHand; // становление порождающего окна для диалогов MapInfo.
OleMapInfo.Do(MsgString); //Пересылка команд в программу MapInfo
OleMapInfo.Do('Set Window Info Parent '+IntToStr(frmGis_Spravka.
OleMapInfo.Do('Set
Window Ruler Parent '+IntToStr(frmGis_Spravka.
end;
Как
только запустили программу на Delphi, она
запускает MapInfo, которая создает окно Карты.
При этом MapInfo действует как «скрытый»
сервер, а окно Карты ведет себя, как порожденное
программой Delphi. [3]
2.2. Разработка ГИС
Для разработки интегрированной среды будем использовать язык программирования Borland Delphi 7 и геоинформационную систему MapInfo.
Delphi является среди широкого круга пользователей популярной системой объектно-ориентированного программирования, основу которой составляет язык Object Pascal.
Delphi – это система объектно-ориентированного визуального программирования. Приложения (прикладные программы) Delphi являются интерактивными системами, в которых для организации взаимодействия между пользователем и программой используются методы (подпрограммы), управляемые событиями.
MapInfo
Professional – географическая
Разрабатываемая ГИС на основе MapInfo будет решать следующие задачи:
- находить улицы;
- находить дома;
- подписывать дома и улицы;
- выдавать список улиц и список домов принадлежащей улице.
Главным достоинством разрабатываемой программы является, то, что она может производить поиск, подписывать, выдавать список из любых слоёв, т.е. является универсальной.
Для интеграции MapInfo и Delphi создадим новый проект Delphi. В процедуре FormCreate добавим следующие строки:
Const
SW_SHOWNORMAL = 1;
var
OleMapInfo: Variant;
MsgString : String;
sWinHand : String;
begin
OleMapInfo := CreateOLEObject('MapInfo.
Str(pnlMap.Handle, sWinHand);// Указываем место где будет отображаться карта.
MsgString := 'Set Next Document Parent ' + sWinHand + ' Style 1';// переподчинение окна.
LoadMap
:= ExtractFilePath(Application.
OleMapInfo.
Do('Run Application"'+LoadMap+'map\
OleMapInfo. Do(MsgString); //Пересылка команд в программу MapInfo
MsgString := 'Set Application Window ' + sWinHand; // становление порождающего окна для диалогов MapInfo.
OleMapInfo.Do(MsgString); //Пересылка команд в программу MapInfo
OleMapInfo.Do('Set Window Info Parent '+IntToStr(frmGis_Spravka.
OleMapInfo.Do('Set
Window Ruler Parent '+IntToStr(frmGis_Spravka.
end;
После
создания процедуры FormCreate, запускаем
приложение (Рис. 9.).
Рис.
9. Готовое приложение
Интегрированные
приложения создаются для каких-то
определённых целей и служат для улучшения
уже имеющихся функций ГИС, а также созданию
уникального и простого в использовании
интерфейса пользователя. Наше разрабатываемое
приложение не исключение, по сколько
оно носит информационно-поисковой характер,
значит, и функции в нём будут исключительно
для поиска и получения информации.
Поиск улиц, зданий
Искать дом или улицу будем посредством SQL-запроса в атрибутивных данных карты. К примеру, для поиска улицы напишем следующий код в обработчике событий для кнопки «Найти»:
var
NameStreet: String;
CentroidX: String;
CentroidY: String;
Layer: String;
Street: String;
Hom: String;
begin
Try
NameStreet := Edit1.Text; //информацию введённую в поле поиска улицы внесём в переменную
Layer := ComboBox1.Items[ComboBox1.
Street := ComboBox2.Items[ComboBox2.
Информация о работе Разработка модуля для поиска информации в MapInfo с помощью Delphi»