Смекни!
smekni.com

Разработка модуля для поиска информации в MapInfo с помощью Delphi (стр. 5 из 6)

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)') ;

Создание подписей для домов и улиц

Для создание подписей в обработчике событий кнопки «Подписать» напишем следующий код:

begin

try

layerStr := ComboBox1.Items[ComboBox1.ItemIndex]; // выбор слоя для подписи улицы

layerHom := ComboBox3.Items[ComboBox3.ItemIndex]; // выбор слоя для подписи дома

PoleStr := ComboBox2.Items[ComboBox2.ItemIndex]; // выбор поля для подписи улицы

PoleHom := ComboBox4.Items[ComboBox4.ItemIndex]; // выбор поля для подписи дома

OleMapInfo.Do('Set Map Layer '+layerStr+' Label Font ("Arial CYR",1,9,16711680) With '+PoleStr+''); // посылаем команду ( подписать на слое улицы шрифтом Arial CYR, жирным красным цветом) информацию для подписи взять из поля подписи улицы

OleMapInfo.Do('Set Map Layer '+layerStr+' Label Auto On'); // включить подпись

OleMapInfo.Do('Set Map Layer '+layerHom+' Label Font ("Arial CYR",1,9,255) With '+PoleHom+''); // посылаем команду ( подписать на слое дома шрифтом Arial CYR, жирным синим цветом) информацию для подписи взять из поля подписи домов

OleMapInfo.Do('Set Map Layer '+layerHom+' Label Auto On'); // включить подпись

Close;

except

end;

Получение списка улиц и списка домов принадлежащей данной улице

Для получения списка в обработчике событий для кнопки «Список» напишем следующий код:

var

sMsgString : String;

sWinHand,s : String;

d,i : byte;

begin

ListBox1.Items.Clear;

sMsgString:='Select '+ComboBox2.Items[ComboBox2.ItemIndex]+' from '+ComboBox1.Items[ComboBox1.ItemIndex]+' group by '+ComboBox2.Items[ComboBox2.ItemIndex]+' order by '+ComboBox2.Items[ComboBox2.ItemIndex]+' into TMP';

oleMapInfo.Do(sMsgString); // запрос на получение списка из таблицы и поля, результат отсортировать по имени

s:=olemapinfo.eval('TableInfo("TMP", '+inttostr(8)+')');

d:=strtoint(s);

for i:=1 to d do

begin

oleMapInfo.Do('Fetch Rec '+ IntToStr(i) +' From TMP');

sMsgString := 'tmp.'+ComboBox2.Items[ComboBox2.ItemIndex]+'';

S := oleMapInfo.Eval(sMsgString);

listbox1.Items.Add(s); // вывести результат запроса в таблицу

end;

2.3. Инструкция пользователя

Для поиска необходимого дома выбираем на панели инструментов кнопку

. В открывшемся окне указываем в поле «Таблица» указываем нужную таблицу, по которой мы будем искать нужный нам дом. В «Поле улицы» указываем нужную улицу. Затем указываем «Поле дома». В значениях мы пишем «Название улицы» и «Номер дома». Затем нажимаем кнопку «Найти» и у нас отображается найденный дом выделенным цветом. (Рис. 10.)

Рис. 10 Окно с найденным домом

Для поиска необходимой улицы выбираем кнопку

и в открывшемся окне в поле «Таблица» указываем таблицу. Затем указываем поле улицы по которому мы будем искать. В значениях указываем улицу. Далее нажимаем кнопку «Найти» и на экране у нас отображается найденная улица в центре окна. (Рис. 11.)

Рис. 11. Окно с найденной улицей

Для того чтобы подписать улицы и дома нажимаем кнопку

. Указываем в настройках шрифта таблицу с улицами. Затем указываем поле в которой которой хранится информация для подписей. Для подписей домов узазываем таблицу с домами и указываем из какого поля будут подписываться дома. Затем нажимаем кнопку «OK» и мы видим, что улицы подписываются красным цветом, а дома синим. При повторном нажатии на кнопку подписи исчезают. (Рис. 12.)

Рис. 12. Окно с подписями

Чтобы вывести список улиц, нажимаем кнопку

, затем указываем с какого слоя нам брать список, и указываем поле. После этого в списке выбираем любую улицу, и она отображается у нас на экране. (Рис. 13.)

Рис. 13. Окно со списком улиц

Для того чтобы вывести список с домами также нажимаем кнопку

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

Рис. 14. Окно со списком домов

Вывод:

Пакетом MapInfo можно управлять, используя языки программирования, отличные от языка MapBasic (встроенного в MapInfo языка программирования). Написать интегрированное приложения можно на нескольких языках программирования, например, C/C++, Visual Basic, Borland Delphi.

Можно создать интерфейс пользователя, радикально отличающийся от интерфейса MapInfo. Внешний вид на экране приложения с интегрированной картой определяется разработчиком.

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

Заключение

Геоинформационные технологии бурно развивающееся направление современных информационных технологий.

С помощью ГИС решается ряд задач:

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

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

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