Пример простейшей программы
Следующая программа на Borland Delphi даст представление о том, как легко встроить окно MapInfo в другую программу. Сначала, создадим новый проект Delphi. В процедуре FormCreate добавим следующие строки: Const SW_SHOWNORMAL = 1; var OleMapInfo: Variant; MsgString : String; sWinHand : String; begin OleMapInfo := CreateOLEObject('MapInfo.Application');// запуск 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.handle)); // Подключение окна диалога Информация. OleMapInfo.Do('Set Window Ruler Parent '+IntToStr(frmGis_Spravka.Handle)); // Подключение окна диалога Рулетка 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.Application');// запуск MapInfo. Str(pnlMap.Handle, sWinHand);// Указываем место где будет отображаться карта. MsgString := 'Set Next Document Parent ' + sWinHand + ' Style 1';// переподчинение окна. LoadMap := ExtractFilePath(Application.ExeName); OleMapInfo. Do('Run Application"'+LoadMap+'map\map.wor'+'"'); // загрузка рабочего набора OleMapInfo. Do(MsgString); //Пересылка команд в программу MapInfo MsgString := 'Set Application Window ' + sWinHand; // становление порождающего окна для диалогов MapInfo. OleMapInfo.Do(MsgString); //Пересылка команд в программу MapInfo OleMapInfo.Do('Set Window Info Parent '+IntToStr(frmGis_Spravka.handle)); // Подключение окна диалога Информация. OleMapInfo.Do('Set Window Ruler Parent '+IntToStr(frmGis_Spravka.Handle)); // Подключение окна диалога Рулетка 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.ItemIndex]; //слой в котором будет производиться поиск Street := ComboBox2.Items[ComboBox2.ItemIndex]; // поле в котором буде производиться поиск OleMapInfo.Do ('Select * From '+Layer+' Where '+Street+' Like "%'+NameStreet+'%" Into Selection'); // SQl запрос на поиск улицы (Выбрать всё из слоя где поле = значению Edit1) frmStreetFind.Top := 25; // помещаем форму с выводом результата в правый верхний угол, чтобы она не мешала отображению найденного объекта frmStreetFind.Left := Screen.Width - frmStreetFind.Width; CentroidX := OleMapInfo.Eval('CentroidX(Selection.Obj)'); //определяем центр найденного объекта по оси Х CentroidY := OleMapInfo.Eval('CentroidY(Selection.Obj)'); // определяем центр найденного объекта по оси У OleMapInfo.Do('Set Map Center ('+'"'+CentroidX+'",'+'"'+CentroidY+'")'); // перемещаем найденный окно карты в центр найденного объекта OleMapInfo.Do('Set Map Scale 1 Units "cm" For 35 Units "m"'); Except MessageDlg('Указанной улицы нет!', mtInformation, [mbOk], 0); End; frmGisFind.StatusBar1.Panels[1].Text := 'Найдено объектов: ' + OleMapInfo.Eval('SelectionInfo(3)') ; // в строку состояния выводим информацию о том сколько объектов найдено end;
Для поиска здания используем следующий код в обработчике событий для кнопки «Найти»: var Ndom: String; NameStreet: String; CentroidX: String; CentroidY: String; Layer: String; Street: String; Hom: String; begin Try NameStreet := Edit1.Text; //значение улице присваиваем переменной Ndom := Edit2.Text; //значение дома присваиваем переменной Layer := ComboBox1.Items[ComboBox1.ItemIndex]; // выбираем слой с домами Street := ComboBox2.Items[ComboBox2.ItemIndex]; // выбираем поле улицы в слое с домами Hom := ComboBox3.Items[ComboBox3.ItemIndex]; // выбираем поле дома в слоек с домами OleMapInfo.Do ('Select * From '+Layer+' Where '+Street+' Like "%'+NameStreet+'%" and '+Hom+' = "'+Ndom+'" Into Selection'); // составляем SQL-запрос на поиск дома (Выбрать всё из слоя с домами где поле с улицей =Edit1 и поле с домом = Edit 2) frmSQLdom.Top := 25; // помещаем окно с найденной информацией в правый верхней угол frmSQLdom.Left := Screen.Width - frmSQLdom.Width; CentroidX := OleMapInfo.Eval('CentroidX(Selection.Obj)'); CentroidY := OleMapInfo.Eval('CentroidY(Selection.Obj)'); OleMapInfo.Do('Set Map Center ('+'"'+CentroidX+'",'+'"'+CentroidY+'")'); OleMapInfo.Do('Set Map Scale 1 Units "cm" For 5 Units "m"'); Except MessageDlg('Указанного дома нет!', mtInformation, [mbOk], 0); End; frmGisFind.StatusBar1.Panels[1].Text := 'Найдено объектов: ' + OleMapInfo.Eval('SelectionInfo(3)') ;
Популярное: Почему стероиды повышают давление?: Основных причин три... Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (217)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |