Delphi работа с картами

Есть ли для Дельфей какие-либо компоненты для работы с такими картами?

В общем, что требуется.
Если карты местности в векторном формате (*.MAP, *.img).
Есть база данных с GPS-данными (MsSQL).
Хотелось бы наложить на карту маршруты автомобилей, стоянки и т. д. с возможностью масштабирования выбранных участков.

В нете нашел библиотеку DataMAP, но насколько я понял из коротенького описания, с ее помощью можно только рисовать карту, а подгрузить готовую не получится. Может еще плохо искал такую опцию, может демо-версия виновата, незнаю.

Есть еще какие-либо библиотеки? Или как еще можно такую задачу реализовать? Рисовать карту с нуля просто нереально, область довольно большая.


Jeer © ( 2010-02-16 09:35 ) [1]

Опять за велосипед ?

Чем Ozi не устроил ?
Или тот же SAS-planet ?


DimonS ( 2010-02-16 10:01 ) [2]


> Чем Ozi не устроил ?
> Или тот же SAS-planet ?

Сейчас гляну что это такое, не слышал даже.


DimonS ( 2010-02-16 10:16 ) [3]

Навскидку, что вычитал с инета.

Ozi — работает только с рисунками, формат BMP и некоторые другие. Сомневаюсь, что можно сделать такой рисунок в приемлемом качестве для нескольких тысяч кв. км. Сколько он весить будет?

SAS-planet грузит карты с инета. Если бы в том же гугле были бы карты наших районов в нормальном разрешении, то можно было бы и использовать ее. Но таких нет, есть только нарисованные вручную, которые можно подправить при необходимости.

Ну и предназначены они в первую очередь для GPS-модулей.

Может где-то и ошибся.


Jeer © ( 2010-02-16 11:54 ) [4]

Слушая Вас можно подумать, что img это не гарминовский формат и он не для GPS.


DimonS ( 2010-02-16 13:50 ) [5]

Понятно, что гарминовский.
Но у меня нет навигатора, он не нужен.
Данные уже хранятся в БД. Вот и нужно каким-либо способам нанести эти треки на карту. А на ней уже высчитывать длину и количество рейсов автомобиля, смотреть где он катался и т. д.

Карта уже готовая есть и не одна. Дорисовать ее я могу и в стороннем приложении, благо их полно.


Jeer © ( 2010-02-16 15:16 ) [6]

А причем тут карта ?
Трек и так дает максимум информации о протяженности, скорости и тп.

Задача непонятна — как всегда, начинает народ думать с зада.


DimonS ( 2010-02-16 16:02 ) [7]


> Трек и так дает максимум информации о протяженности, скорости
> и тп.

Естественно, не спорю.
Меня устраивает и просто трек на черном фоне.
И отчеты по скорости и стоянкам.

Но попробуй объяснить юзеру, который с компами только на-игрушках, что машина проехала там-то и там-то? И что сегодня работала в одном НП, а завтра проехала через десять и свернула в том месте, где не надо?

Что еще непонятного? Вот и хотелось карту привязать к программе.

PS. Навигаторов нету, данные накапливаются в накопителях, а затем по радиоканалу сбрасываются в БД.


Jeer © ( 2010-02-16 17:01 ) [8]

Кури SAS-planet, создай кэш нужного региона от нужного веб-гео-сервиса.
У тебя будет файловая структура тайлов (256*256 px).
Грузи их хоть в PaintBox и накладывай на Canvas трек в виде линий, точки в виде точек.
Накладывай дополнительно любую декорацию.
Проблем вообще не вижу.


Jeer © ( 2010-02-16 17:11 ) [9]

Вот наложение трека на yandex-sat
Куда еще подробнее 🙂


DimonS ( 2010-02-16 18:56 ) [10]


> Jeer ©

Это все понятно.
Можно обойтись и сторонней утилитой.

Вопрос другой — где взять карты под эти утилиты? Ну НЕТУ ни на Яндексе, ни на Гугле таких карт нашего региона! Но есть сделанные вручную. Их как-то можно привязать?

Конкретно стоит такая задача.
Автомобиль выехал в 8:07 утра из гаража, вернулся в 19:37 обратно. Нужно именно это время выбрать из БД (не проблема) и наложить эти данные на карту. На подробную карту.

Я не спец в программах по GPS-навигаторам, если подскажите название или ссылку на такие, то просмотрю.


> Кури SAS-planet, создай кэш нужного региона от нужного веб-
> гео-сервиса.

Еще раз уточню — ну нет там подробных карт нашего региона (Амурская область).


Jeer © ( 2010-02-16 20:12 ) [11]

Векторная карта делается "на раз" с помощью соответствующих инструментов и специалистов.
Векторизаторов (ПО) — пруд-пруди.
Важно иметь основу — откуда ее взять ?

Если для частного применения, то вопросы более-менее обходимы.
Публичных сервисов — есть.

Можешь мне на мыло скинуть граничные координаты интересующей тебя области ( только не надо от Амура и до Амура через шарик )


Jeer © ( 2010-02-16 20:24 ) [12]

И, вообще-то, надо разговаривать инженерным языком — языком цифр и технических деталей.

Например, если тебе хочется знать, пропустил ли шофер люк между колес или объехал его — это тоже решаемая задача. Вопрос цены.

Надеюсь, что по прериям у вас автотранспорт не в состоянии "переть", а более-менее значимые дороги скорее всего "засвечены" 🙂


Jeer © ( 2010-02-16 21:50 ) [13]

В общем..посмотрел я вашу Амурскую область.
Карты есть.

yandex-карты дает до 11-го уровня
космоснимки-карты — до 12-го
гугл-спутник дает до 1..3 м/pix — куда еще лучше (древность — 1999 г)
(однако я не думаю, что там за 10 лет резко измениласть инфраструктура)
OpenStreetMap дает карты разной тематики — дороги, изолинии,рельеф, etc
EAtlas-карты дает до 11-13 уровень
Navitel-карты дает аж до 15-го уровня, хотя подробность на уровне 11-12

Короче, мое резюме — Вы просто не хотите начать думать масштабно.
А без этого..

Если вопросы остались — обращайтесь, как-то чем-то помогу.


Jeer © ( 2010-02-17 21:47 ) [14]

Значит вопросов и нет, а на ф.а тут постил, жаловался на отсутствие карт каких-то..


DimonS ( 2010-03-19 10:50 ) [15]


> Jeer © (17.02.10 21:47) [14]
> Во — как.
>
> Значит вопросов и нет, а на ф.а тут постил, жаловался на
> отсутствие карт каких-то..
>
> Суета, однако.

Был в отъезде, а инет такая штука, что есть не везде. Вечером скажу точные координаты местности.


DVM © ( 2010-03-19 11:10 ) [16]


> Есть еще какие-либо библиотеки?

MapInfo и все что с ним связано — MapX, MapXtreme и т.д. Можно и к Delphi при крутить. Но это все платное. И денег стоит немалых. Яндекс карты основаны на этих разработках насколько мне известно.


DVM © ( 2010-03-19 11:13 ) [17]


> Jeer ©

Зачем ты ему впариваешь растровые карты, когда у него уже есть GIS данные в формате MapInfo.


DVM © ( 2010-03-19 11:17 ) [18]


> DimonS

Кстати, стоимость серьезных векторных карт может варьироваться от 5000 до 30000$. Карта автомобильных дорог весьма дорогая кстати.


Плохиш © ( 2010-03-19 11:25 ) [19]


> DimonS (16.02.10 08:43)

Я задал ваш вопрос гуглю и он выдал 986 ссылок, думается достаточно для начала.


Anatoly Podgoretsky © ( 2010-03-19 13:37 ) [20]

> Плохиш (19.03.2010 11:25:19) [19]

У тебя Гугль неправильный, у меня 129 000 ответов.


Плохиш © ( 2010-03-19 17:11 ) [21]


> Anatoly Podgoretsky © (19.03.10 13:37) [20]

Поймал 🙂
Я вопрос задавал в том виде в котором ему действительно надо. В первых трёх ссылках были три разные библиотеки по требуемой тематике.


test © ( 2010-03-19 18:22 ) [22]

Профессиональная ГИС Карта 2008 — универсальная геоинформационная система, имеющая средства создания и редактирования электронных карт в многопользовательском режиме, выполнения различных измерений и расчетов, оверлейных операций, построения 3D моделей, обработки растровых данных, построения ортофотопланов, создания матриц высот, качеств, многослойных (геологических) матриц, средства тематического картографирования, подготовки карт к изданию, работы с GPS-приемниками, а также инструментальные средства для работы с базами данных (конструкторы форм, запросов, отчетов). Содержит SDK c примерами встроенных прикладных задач.

От себя
Есть компоненты для работы с картой из Дельфи, есть что и для Визуал студии.


Anatoly Podgoretsky © ( 2010-03-19 19:29 ) [23]


> Поймал 🙂

Не стремился, так уж получилось.
Но в любом случае ты меняю удивил, гугл и так мало ссылок, я не поверил.

Читайте также:  Размеры экрана nexus 7 2013


Плохиш © ( 2010-03-19 19:36 ) [24]


> гугл и так мало ссылок, я не поверил.

Главное вопрос правильно сформулировать 😉


test © ( 2010-03-19 20:37 ) [25]

Anatoly Podgoretsky © (19.03.10 19:29) [23]
по запросу ЫЫЫЫ у Гугла вообще Вингард выходит третьей ссылкой))


Виктор Щербаков © ( 2010-03-19 20:45 ) [26]

Перечисленные тобой форматы (из бесплатного) понимает GDAL/OGR http://www.gdal.org/
Есть сишное API. Нарисовать картинку, думаю, найдешь родные компоненты.


Anatoly Podgoretsky © ( 2010-03-19 21:36 ) [27]

> test (19.03.2010 20:37:25) [25]

А при УУУУ гугл начинает выть


Jeer © ( 2010-03-19 22:10 ) [28]


> DVM © (19.03.10 11:13) [17]
>
>
> > Jeer ©
>
> Зачем ты ему впариваешь растровые карты, когда у него уже
> есть GIS данные в формате MapInfo.

Я ничего и никому никогда не "впариваю" — это раз.

Если и рекомендую какие-то "самопальные" решение — только проверенные лично — два.

Создать "систему" наложения на растр треков — как два пальца.. — три

Этих растров (карты/спутник) по Миру — вполне хватает, чтобы сделать "примитив" наложения на растр треков. — четыре


GDI+ ( 2010-03-20 11:52 ) [29]


> DimonS (16.02.10 08:43)
>
> Есть ли для Дельфей какие-либо компоненты для работы с такими
> картами?

Есть для С++ http://www.gdal.org/ogr/

Можешь попробовать переконвертировать в dll и подключить к Delphi


GDI+ ( 2010-03-20 11:55 ) [30]

О!. Хидеры для дельфи можно отсюда драть
http://trac.osgeo.org/gdal/wiki/GdalOgrInCsharp

С C# проще всего хидеры на Делфи переводить.


GDI+ ( 2010-03-20 12:00 ) [31]


> DimonS (16.02.10 13:50) [5]
>
> Понятно, что гарминовский.
> Но у меня нет навигатора, он не нужен.
> Данные уже хранятся в БД. Вот и нужно каким-либо способам
> нанести эти треки на карту. А на ней уже высчитывать длину
> и количество рейсов автомобиля, смотреть где он катался
> и т. д.

Дешевые GPS дают ошибку позиционирования в 10-50 метров, причём скачущую. Так что будешь иметь секс, если руководство решило "канарейку за копейку".

Привет дорогие друзья. Сегодня наша статья будет связана с одной интересной библиотекой, которая имеет название GMLib (Google Maps Library). В состав данной библиотеки входят компоненты, которые работают с Google Maps API, способные администрировать карту, расставлять различные маркеры, полигоны, прямоугольники, а также различные ломанные и кривые линии. Компоненты данной библиотеки легко устанавливаются на Delphi или C++ Builder, которые управляют Google картами, а результат выводят в браузер (TWebBrowser).

Данную библиотеку я рассматривал, так как хотел сравнить ее с MapWindow GIS, хотя сравнивать их глупо, так как в MapWindow GIS мы можем создать собственную карту, с собственной структурой, а используя данную библиотеку, мы будем работать только лишь с картами Google, то есть уже существующей местности. Одним преимуществом GMLib является то, что с помощью данной библиотеки можно хорошо управлять картой от Google, причем все это можно делать в интерактивном режиме.

Скачать библиотеку можно на странице библиотеки GMLib. Устанавливать ее легко, в принципе, как и большинство библиотек и компонент, поэтому тут вопросов возникнуть не должно (инструкцию по установке можно найти в файле Install.txt). После установки у Вас появится новая вкладка с компонентами GoogleMaps, на которой будут присутствовать следующие компоненты:

  • TGMMap – непосредственно для работы с Google Maps. Для отображения карт, используется компонент браузера, например TWebBrowser или же TChronium.
  • TGMMarker – компонент, с помощью которого проставляются маркеры на карте.
  • TGMPolyline – данный компонент предназначен для рисования полигональных линий на карте.
  • TGMPolygon – предназначен для рисования полигонов на карте.
  • TGMRectangle – компонент, с помощью которого рисуются прямоугольники на карте.
  • TGMCircle – компонент, с помощью которого можно рисовать круги (окружности) на картах Google Maps.
  • TGMDirection – компонент для определения маршрутов.
  • TGMGeoCode – компонент геокодирования.

Вместе с библиотекой поставляется документационная справка, в формате CHM на двух языках:

Кроме этого, в проекте присутствует демонстрационные проекты, которые Вы можете посмотреть, как работает библиотека.

Библиотека GMLib совместима с FireMonkey, а также по умолчанию скомпилирована под компонент TWebBrowser, это, наверное, в первую очередь связано с тем, что именно данный компонент браузера поставляется в Delphi по умолчанию. Последняя версия библиотеки – 1.0.0, которая была выпущена 15 апреля 2013 года.

В сети довольно много демонстрационных проектов, в которых показано как работать с картами Google в проектах Delphi, но с помощью данных компонент, Вы сможете облегчить себе задачу.

Рассказывать про все классы и подробно компоненты я не буду, так как в библиотеке присутсвует отличная документация, вообще в состав библиотеки входит следующее:

  • ChangesLog.txt
  • Install.txt=> инструкция по установке
  • ProjectGroup
  • Demos=> папка с демонстрационными проектами
  • Docs => документация классов, которые учавствуют в создании компонентов
  • Classes => UML-диаграммы классов
  • GMDoc => документация в формате CHM
  • dpk => пакет компонент
  • lib
  • Licence => лицензия, лицензионное соглашение
  • Resources => ресурсы проекта: картинки, файлы ресурсов, HTML-карты
  • src => компоненты

Данная библиотека скомпилирована и доступна для следующих версий сред разработки:

  • Delphi 6
  • Delphi 7
  • Delphi 2007
  • Delphi 2009
  • Delphi 2010
  • Delphi и C + + Builder XE
  • Delphi и C + + Builder XE2
  • Delphi и C + + Builder XE3

Если Вы хотите быстро и просто использовать карты Google в проекте Delphi, то данная библиотека специально для Вас, если Вы хотите создавать свои собственные географические данные, то оставайтесь верны MapWindow GIS, либо же другой системе. Что касается библиотеки GMLib, то я бы мог выпускать уроки по ней, в стили MapWindow GIS, если есть необходимость такая, но, наверное, такой нет необходимости, так как в поставке с библиотекой присутствуют демонстрационные проекты, показывающие суть работы с данными компонентами. Еще я думаю включить данную библиотеку в свой проект по MapWindow GIS, который позволит работать с интерактивными картами Google, чтобы не мучиться со статическими картами, как это было с Яндексом.

Copyright © Panorama Group 1991 — 2019
Политика конфиденциальности

Cтатьи и комментарии

Разработка ГИС-приложений в среде Delphi/Kylix

Фукс этот — клад, а не матрос: прекрасно разбирается в картах!

Когда мы хотим узнать, где находится нужный нам дом, как проехать по некоторому адресу, мы ищем это по карте. К картам обращаются многие организации при составлении областей загрязнения окружающей среды, расположения природных ресурсов. С картами работают военные, МЧС, МВД, геологи, моряки, экологи, строители и многие другие специалисты. Трудно представить себе нашу жизнь без географических карт и без науки об их создании — картографии.

Конечно, эта весьма важная область деятельности, связанная со сложными математическими расчетами над большими объемами информации и отображением пространственных данных, не может развиваться без применения компьютеров. Поэтому в индустрии программного обеспечения был создан целый класс программных систем, называемый геоинформационными системами, или сокращенно ГИС.
ГИС служат для графического построения карт и получения информации как об отдельных объектах, так и пространственных данных об областях, например о расположении запасов природного газа, плотности транспортных коммуникаций или распределении дохода на душу населения в государстве. Отмеченные на карте области во многих случаях гораздо нагляднее отражают требуемую информацию, чем десятки страниц отчетов с таблицами.
В настоящее время наряду с разработками крупных западных производителей успешно применяются отечественные ГИС. Особенно следует отметить GeoGraph и GeoDraw, разработанные Институтом географии РАН ( http://geocnt.geonet.ru ) и ГИС "Карта 2000" (http://www.gisinfo.ru), разработанную Национальной картографической корпорацией (проект "Панорама").
Еще несколько лет назад большинство ГИС болели "замкнутостью", то есть для пользователя являлись некоей "вещью в себе". Система позволяла подготовить или открыть уже готовую карту, привязать ее к одной или нескольким таблицам в базе данных и с помощью встроенного оконного интерфейса ввести запрос на получение данных. По введенному запросу ГИС могла выдать в окне данные об объектах, показать их на карте, закрасить области различными видами штриховки, построить графики и отчеты. Фактически ГИС являлись средством создания карты и большим справочником по ней.
Однако потребности рынка диктовали свои условия разработчикам геоинформационных систем, и просто системы, отображающей на карте справочные данные с их элементарным анализом, стало явно недостаточно. Программистам, разрабатывающим сложные программные комплексы и системы поддержки принятия решений с использованием электронных карт, требовались инструменты для управления картой из своей программы. Требовался интерфейс программиста к геоинформационной системе (API), позволяющий из программы делать с картой то же, что делает с ней и сама ГИС.
Спрос рождает предложение, и такие средства разработчики геоинформационных систем стали предоставлять. Но подходы у разных фирм-производителей к этой проблеме были различными. Например, очень распространенная ГИС MapInfo предоставляет разработчикам язык MapBasic для написания собственных модулей, расширяющий ее функциональность подобно тому, как в текстовый процессор Microsoft Word входит WordBasic для написания макросов. Другие продукты решали эту проблему предоставлением программистам компонента OCX или ActiveX, умеющих работать с картами, созданными в их системе. Все это было не совсем удобно для работы. Наилучший способ — предоставление программистам, кроме ГИС, также и функциональной библиотеки работы с картами, созданными с ее помощью.
Такие средства стали появляться на рынке ПО в виде библиотек под конкретный язык программирования, чаще всего Microsoft Visual C++ или Visual Basic. Когда Borland создала мощную систему разработки приложений Delphi, которая стремительно завоевала популярность, разработчики ГИС стали также выпускать для нее свои библиотеки.
Задача выбора ГИС для реализации приложений очень непростая. Здесь приходится исходить не только из стоимости, возможностей и назначения, но также и из того, насколько хорошо ее библиотека согласуется с используемыми средствами программирования, достаточно ли предоставляет возможностей для обработки картографической информации, имеет ли средства подготовки данных, насколько быстро работает и какие требования предъявляет к ресурсам компьютеров. Однако обзор имеющихся на рынке геоинформационных систем — это отдельный и долгий разговор. По этим вопросам можно получить исчерпывающую информацию в журнале "ГИС — обозрение" или в ГИС-ассоциации ( http://www.gisa.gubkin.ru ).
Давайте рассмотрим одну из наиболее удачных отечественных разработок в области геоинформационных систем — ГИС "Карта 2000" (рис. 1).
Кроме развитых средств создания и редактирования электронных карт и библиотек условных знаков здесь имеется полнофункциональная библиотека программиста. Под Delphi и C++ Builder существует масса компонентов, набор функций API доступен не только из этих программных сред разработки, но и из Microsoft Visual C++, Borland C++, Watcom C++ и других.

Читайте также:  Станок для затачивания сверл

Рис. 1. ГИС "Карта 2000"

Информация об объектах в системе "Карта 2000" хранится не только в значке, который его обозначает, но и в наборе параметров. Например, объект дорога может иметь семантики ширина, тип покрытия; объект река — семантики глубина, ширина, скорость течения, а также и другие характеристики. Объекты карты могут быть точечными, линейными, площадными и векторными. От значения некоторых полей семантики может зависеть вид этого объекта на карте. Например, если дорога была нанесена на карту как грунтовая, то после реконструкции с заменой ее типа покрытия в поле семантики достаточно занести код "асфальтобетон" и значок ее тут же изменится на соответствующий. Это, как мы дальше увидим, можно делать не только из "Карты 2000", но и из своего приложения. Вид информации по объекту показан на рис. 2.

Рис. 2. Семантика объекта

"Карта 2000" также позволяет по заданным высотам строить трехмерные модели выбранного участка местности. Высоты задаются для ряда точечных объектов в определенной семантике. Эта семантика указывается ГИС, и она автоматически строит матрицу высот, по которой показывает трехмерную модель местности (рис. 3).

Рис. 3. Построение трехмерной модели местности по матрице высот

Чтобы иметь возможность из своей программы, разрабатываемой на Delphi, работать с картами, требуется установить пакет GisToolKit. Сам пакет, как и ГИС, можно бесплатно получить на сайте http://panorama.lvl.ru , но создавать и использовать его в этом случае можно только для небольших карт, состоящих из одного листа масштаба 1:100 000. Чтобы использовать пакет в полной мере, нужно приобрести у производителей или дистрибьюторов и установить электронный ключ для LPT-порта.
Для инсталляции пакета GisToolKit в Delphi достаточно запустить программу Setup.exe из установочного пакета. Если версия Delphi не поддерживается программой установки, она не полностью завершается. В этом случае нужно завершить процесс инсталляции вручную. Для этого в среде Delphi откройте файл mappack.dpk из каталога, в который был установлен пакет, затем нажмите кнопку Install. В диалоге Tools — Environment Options — Library — Library Path добавьте в список путь к модулям пакета. Для установки справочной системы нужно выбрать в меню Help пункт Customize и добавить файл gis.hlp во всех закладках диалога настройки справочной системы Delphi.
Итак, установив набор компонентов GisToolKit, мы можем приступать к разработке своего ГИС-приложения. Приведенный ниже пример был реализован на Delphi 6; для других версий возможны незначительные изменения. Сначала ознакомимся с компонентами, которые появились в палитре Delphi на закладке GISToolKit (рис. 4).

Рис. 4. Компоненты GISToolKit

Окно, которое отображает карту, — это компонент MapView. Перенесем его с палитры на форму. Остальные компоненты, которые работают с ним, должны ссылаться на него через свойства MapView. То есть, когда мы помещаем компонент с палитры на форму, нужно "привязать" его к экземпляру MapView1, который находится на форме, указав в инспекторе объектов его имя.
Чтобы указать MapView1, какую карту нужно открыть, зададим его свойству MapFileName путь до файла карты. Это можно сделать прямо в Object Inspector, нажав на кнопку редактирования свойств. При этом откроется диалог выбора карты (рис. 5). Для примера выберем демонстрационную карту части Москвы и Московской области, прилагаемую к пакету. Она открывается, не требуя аппаратного ключа.

Рис. 5. Диалог выбора карты

Чтобы закрыть карту и освободить занимаемую ею память, свойству MapFileName нужно присвоить пустую строку. Это рекомендуется делать перед завершением работы программы.
Итак, карта выбрана, но в окне ее не видно. Чтобы показать карту, свойство MapView1.MapView нужно установить как True. Значение False гасит карту, но не закрывает ее, поэтому при последующей установке значения True она опять появится.
В процессе работы программы может потребоваться открывать различные карты. Для этого достаточно в коде присвоить свойству путь до другого файла карты, например "MapView1.MapFileName:= ‘D:MAPSMYMAP.MAP’;". Если мы хотим дать пользователю возможность самому выбирать карту, воспользуемся диалогом открытия файла.
Для выбора карты существует компонент OpenMapDialog. Вместо него можно воспользоваться и обычными средствами выбора файла, но этот компонент позволит выбрать карту в том же диалоге с просмотром и информацией о ней, который показан на рис. 5. Кроме того, код получится короче — всего одна строка:

procedure TForm1.OpenMapExecute(Sender: TObject);
begin
OpenMapDialog1.Execute; // загрузить карту
MapView1.MapView := True; // показать ее
end;

OpenDialog имеет свойство MapView, которое в инспекторе объектов должно быть присвоено тому компоненту MapView, которому он будет передавать выбранный файл карты, в данном случае MapView1.
Первое, что пользователь захочет, после того, как увидит карту, это изменить ее масштаб. MapView предоставляет два свойства — ViewScale для просмотра карты и PrintScale для вывода карты на печать. Оба свойства целые. В простейшем случае нажатием кнопки можно изменять ViewScale. Вболее сложном варианте можно определить переменную MouseAction, по нажатии кнопки активизировать код, обозначающий операцию смены масштаба в сторону увеличения или уменьшения, и затем по щелчку мыши на карте менять масштаб и центрировать карту в точке нажатия. Рассмотрим подробнее простой способ:

procedure TForm1.actZoomInExecute(Sender: TObject);
begin
MapView1.ViewScale := MapView1.ViewScale div 2;
end;

procedure TForm1.actZoomOutExecute(Sender: TObject);
begin
MapView1.ViewScale := MapView1.ViewScale * 2;
end;

При нажатии на одну из кнопок смены масштаба, связанных с действиями actZoomIn и actZoomOut, карта будет изменять масштаб в два раза.
Теперь разберемся с координатами и точками на карте. Точка на карте тоже имеет свой компонент MapPoint. Он предназначен для преобразования координат из одной системы в другую или для работы с точкой как с объектом. GISToolKit поддерживает четыре системы представления координат, обозначаемые константами:
PP_PLANE — прямоугольная система в метрах;
PP_GEO — геодезическая система в радианах;
PP_PICTURE — экранная система в пикселях;
PP_MAP- система карты в дискретах.
Для преобразования координат точки из одной системы в другую в классе TMapPoint и других классах пакета есть свойства PlaceIn (система координат на входе) и PlaceOut (система на выходе). Перенесем компонент MapPoint с палитры на форму и привяжем его к MapView1 установкой свойства MapPoint1.MapView в значение MapView1. Будем использовать этот компонент для перевода координат из экранной системы в метровую, и показывать их в статус-строке при обработке события OnMouseMove.
Установим его свойство PlaceIn в значение PP_PICTURE, а PlaceOut — в значение PP_PLANE. Теперь свойствам X и Y присвоим значения координат в одной системе, а считаем с них же уже преобразованные:

Читайте также:  Freenas установка на флешку

procedure TForm1.MapView1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
MapPoint1.X := MapView1.MapLeft + X; // с учетом скроллинга
MapPoint1.Y := MapView1.MapTop + Y;
StatusBar1.Panels[0].Text := Format(‘X : %d Y : %d’,[Trunc(MapPoint1.X),Trunc(MapPoint1.Y)]);
end;

Свойства MapView MapLeft и MapTop содержат координаты положения текущего окна карты от ее левого и верхнего края в пикселях. Поэтому, когда преобразовываются экранные координаты, обязательно нужно учитывать эти значения, чтобы точка позиционировалась правильно. Обратите внимание, что в геодезической системе координат ось X направлена снизу вверх, а ось Y справа налево.
Теперь перейдем к двум очень важным компонентам: MapObj — объект карты и MapFind — поиск объекта. О них нужно рассказать особо, так как именно эти компоненты и позволяют использовать в полной мере возможности ГИС.
Карта представляет собой "слоеный пирог" из множества наложенных друг на друга слоев, например слой рек и озер, слой лесов, слой дорожной сети, слой городских кварталов и т. п.
Каждый объект принадлежит одному определенному слою. Для указания, к какому слою принадлежит объект, MapObj имеет свойство ExCode. В нем содержится номер учетной записи этого слоя в классификаторе карты. Классификатор содержит записи обо всех слоях, включая то, какими значками они отображаются и какие семантики они могут содержать.
Свойство "код локализации" Local содержит информацию о типе объекта: точечный, линейный, площадной. Свойство Style задает вид отображения — нормальный, выделенный, невидимый. Свойства ColorImage и ColorImageUp определяют цвета, которыми объект будет "мигать" при выделении. Сам способ выделения задается свойствами StyleSelect и Interval.
Чтобы найти объект на карте по координатам, например по нажатию мышкой, и получить по нему информацию, содержащуюся в карте, напишем обработчик нажатия левой кнопки, используя метод SelectObjectInPoint:

procedure TForm1.MapView1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
MapObj1.SelectObjectInPoint(X,Y,10,dlMaxSemantic); // объект ищется в радиусе 10 пикселей вокруг курсора
end;

Вот как будет выглядеть наше ГИС-приложение, если мы нажмем мышкой на путепровод в нижнем левом углу около Качалово (рис. 6).

Рис. 6. Пример работы простейшего ГИС-приложения

Одним из важных свойств объекта карты TMapObj является его уникальный номер на карте Key и имя листа карты ListName. Эти два свойства — ключ для поиска объекта местности на электронной карте.
Уникальный номер Key система назначает объекту автоматически при добавлении его в лист карты, и он служит его ключом для поиска в конкретной карте, так же как уникальный ключ записи в базах данных. В общем случае этого номера достаточно для организации взаимосвязи объекта карты с записью в базе данных, с которой работает приложение. Найдя объект в карте, по значению его свойства Key можно найти запись в базе данных, содержащую о нем нужную информацию, обычным SQL-запросом. И наоборот, если мы выбрали из базы данных запись о некоем объекте на карте, мы сможем его найти по этому значению и показать. Поиск объекта по его ключу является самым быстрым способом поиска, так как "Карта 2000" организована по принципу базы данных и все объекты в ней индексированы по их ключам. Если в приложении используется проект, состоящий из нескольких карт, или одна карта, включающая несколько стандартных планшетов (листов), в качестве уникальных данных для поиска объекта на карте необходимо обязательно использовать ГИС имя листа карты ListName вместе с номером объекта.
Допустим, некая фирма, владеющая сетью автозаправочных станций, имеет свою базу данных, в которой есть таблица fillingstations с адресами ее АЗС и количеством колонок на них:

id Name address num_pumps
1 АЗС № 14 ул. 1-я Парковая, 18 12
2 АЗС № 22 ул. 2-я Парковая, 8 10
3 АЗС № 23 ул. 3-я Парковая, 3 12
4 АЗС № 56 ул. 4-я Парковая, 22 16

Руководство фирмы решает улучшить свое программное обеспечение и предлагает программистам подключить электронную карту города. Предположим, готовая карта города куплена уже в формате ГИС "Карта 2000", и в ее слое "Заправочные станции", где есть все городские АЗС, те станции, которые принадлежат фирме, имеют ключи 16796116, 16796117, 16796126 и 16796148 соответственно (номера объектов взяты с демонстрационной карты). В таблицу fillingstations программисты добавили колонку key_map, заполнили ее, и теперь таблица выглядит следующим образом:

id name address num_pumps key_map
1 АЗС № 14 ул. 1-я Парковая, 18 12 16796116
2 АЗС № 22 ул. 2-я Парковая, 8 10 167961173 АЗС № 23 ул. 3-я Парковая, 3 12 167961264 АЗС № 56 ул. 4-я Парковая, 22 16 16796148

Дальнейшее очевидно. Если нам нужно найти на карте АЗС с максимальным количеством колонок, то мы выполняем SQL-запрос, в результате которого получаем, что ее > Далее нужно найти такой объект на карте из приложения. Поставим на форму компонент MapFind и привяжем его к MapView1. Результат поиска MapFind помещает в объект MapObj. Поместим на форму еще один компонент MapObj2 и укажем его имя в свойстве MapFind1.MapObj. В нем будет содержаться информация о найденном в результате поиска объекте.
Для задания условий поиска MapFind имеет свойство MapSelect. Этот класс имеет множество настроек, которые задают, где и как искать нужные объекты — в каких слоях, каких типов, в какой области, с какими номерами или содержащие в семантике нужные значения. Диалог настройки вызывается при редактировании этого свойства (рис. 7).

Рис. 7. Настройка поисковой системы

Методы объектов позволяют настроить поиск непосредственно из приложения. Давайте найдем нужный нам объект по известному ключу. Поисковая система позволяет искать объекты в диапазоне ключей от минимального заданного до максимального заданного, но если нам нужно найти только один, значит, он будет и максимальным, и минимальным:

procedure TForm1.actSearchExecute(Sender: TObject);
begin
MapFind1.Active := False; // выключить поиск
MapFind1.MapSelect.MinKey := 16796148; // установить ключи поиска
MapFind1.MapSelect.MaxKey := 16796148;
MapFind1.Active := True; // включить поиск
MapFind1.Center; // передвинуть карту, чтобы найденный объект был в центре
end;

В приведенном примере кода будет найден один объект, поэтому нам не требуется организовывать цикл прохода по найденным объектам. В остальных случаях работа компонента MapFind аналогична работе компонента Query. Если найденных объектов много, то можно пройтись по ним таким же способом, как и по выбранным записям из базы данных:

MapFind1.Active := True;
while not MapFind1.Eof do begin
// Обработать объект MapFind1.MapObj;
MapFind1.Next;
end;
MapFind1.Active := False;

В заключение рассмотрим еще один пример, показывающий возможности GISToolKit. Нам может потребоваться нарисовать что-то свое на карте. Сделать это можно несколькими способами. Первый — добавить новый объект в карту. Второй — нарисовать поверх карты изображение средствами графической библиотеки Delphi. Третий — создать пользовательскую карту поверх основной и добавить в нее объекты из основного или собственного набора условных знаков.
Чтобы добавить новый объект, нужно воспользоваться методами класса TMapObj. По классификатору демонстрационной карты код слоя автозаправочных станций 51220000. Вот пример, который добавляет новую АЗС (рис. 8):

procedure TForm1.actInsertNewObjectExecute(Sender: TObject);
begin
MapPoint2.X := 6169253; // в точке с этими координатами открывается новая станция
MapPoint2.Y := 7411283;
MapObj2.CreateObjectByExcode(0,KM_IDFLOAT2,51220000,OL_MARK);
MapObj2.Metric.Append(0,MapPoint2.Point);
MapObj2.Commit;
// далее нужно записать в базу данных значение MapObj2.Key, если оно больше 0
end;

После операции Commit ГИС помещает новый объект в карту и генерирует ему уникальный ключ, который становится доступным через свойство Key. Если в результате операции Commit MapObj2.Key равен 0, то объект не создался и в карту добавлен не был. Новый объект на демонстрационной карте получил номер 16800828.

Рис. 8. Добавление новой автозаправочной станции