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, вместо того чтобы писать большой запрос, где используются различные элементы, мы упрощаем ряд функций. Запрос встраивается в приложение. Это является большим преимуществом. Разработчик сам решает, что будет в его приложении.
Заключение
Геоинформационные технологии бурно развивающееся направление современных информационных технологий.
С помощью ГИС решается ряд задач:
- ГИС позволяют точнейшим образом учитывать координаты объектов и площади участков. Благодаря возможности комплексного (с учетом множества географических, социальных и других факторов) анализа информации о качестве и ценности территории и объектов на ней, эти системы позволяют наиболее объективно оценивать участки и объекты, а также могут давать точную информацию о налогооблагаемой базе.
- В области транспорта ГИС давно уже показали свою эффективность благодаря возможности построения оптимальных маршрутов, как для отдельных перевозок, так и для целых транспортных систем, в масштабе отдельного города или целой страны.
- ГИС позволяют вести мониторинг экологической ситуации и учет природных ресурсов. Они не только могут дать ответ, где сейчас находятся "тонкие места", но и благодаря возможностям моделирования подсказать, куда нужно направить силы и средства, чтобы такие "тонкие места" не возникали в будущем.