Delphi programming blog
Источник: http://teran.karelia.pro/articles/item_4429.html
 

Рисование карт в Delphi

Опубликовано 24.06.2010 г. 00:46

Карт? Каких карт? - спросите вы. Географических. Не в прямом конечно смысле, что с дорогами и горами, но чтобы страна по регионам, реки и озера были. А добавок ко всему нанести диаграммы на эти регионы. Такая постановка задачи заставила меня очень сильно задуматься и было это чуть менее года назад.

Это наверное будет мой первый пост, касающийся непосредственно моей рабочей деятельности (: Суть задачи была следующая. В некоторых отчетных документах часто численные данные представляются в виде таблиц, и данные эти указаны, например, для регионов, или федеральных округов. Конечно, смотреть в таблицу это одно, и совсем другое видеть графическое представление этих данных. Но как же вообще подобное можно реализовать? Можно конечно заявить что надо использовать GDI или Direct2D или еще что нибудь, и отрисовывать карты самостоятельно и так далее, или найти GIS компонент для работы с Delphi. Или вообще спросить: а причем здесь delphi? Все вопросы и предложения, конечно, закономерны. ГИС системы для вывода данных это как из пушки по комарам. Самостоятельное рисование карт на тот момент времени для меня было что то из разряда "невыполнимая задача", ибо я всего два месяца как начал использовать delphi и вобще по сути разрабатывать windows приложения. Самое чтоб было интересное это откуда вообще взять эту самую карту? Выдвигалась даже идея сделать карту во flash и встроить ее в Delphi проект. Почему вообще Delphi? данные для карты необходимо было извлекать либо из БД, либо из Excel. Иногда проводить некоторые расчеты предварительные с этими данными. Что хотелось получить как результат? Примерно вот такое (компонента Dundas Map for .NET ):
 
Но поскольку данный продукт платный, то рассматривать его смысла нет. Немного изучив предметную область, я даже было зарегался на форумах vingrad.ru & sources.ru, в итоге правда там ничем мне не помогли. Оказалось что есть такой хороший открытый и широко используемый формат для хранения карт - ESRI Shape (ShapeFile), который поддерживается, наверное, всеми ГИС системами. При этом, наверное, любая ГИС система может экспортировать свои карты в данный формат. Далее выяснилось, что имеющийся в наличии TeeChart Pro (насчет Std не знаю, но вряд ли), умеет эти самые Shape-файлы загружать и отображать. В принципе, также можно при большом желании найти и сами карты, ну а если найти не получится, то купить. Стоимость карт в хорошем масштабе (1:1млн) может достигать 100 тыс. руб. (оО). Если вы хотите использовать ГИС систему еще для этого, то MapInfo, например, стоит еще 120 тыс. А если захотите MapInfo компоненты для встраивания в Delphi то выложите еще порядка 40 тыс. В общем бред :) Во время поисков карт, было найдено очень много всяких веселых вещей, вот например http://map.rin.ru/ с "Koreliya" в url региона на карте (привет составлявшему!) :) Конечный итог. Как удалось решить проблему:
  1. Найденная карта была успешно конвертирована в Shape-формат. Причем были созданы карты для регионов, рек, озер. Все одного масштаба, так что можно смело рисовать накладывая друг на друга.
  2. Использование TeeChart Pro + TMapSeries +ее загрузка с помощью метода LoadMap()
  3. Shape файл состоит из 3х файлов. сам shp - описывает геометрии, shx -индекс. И DBF файл (БД dBase), для хранения связей геометрий, и их нормальных названий и т.п. Для чтения файла использовался BDE поскольку через OLE Jet подключится у меня так и не получилось.
  4. Редактирование карты с помощью бесплатных ГИС - Quantum GIS и Map Window. Например, карта была актуализирована с учетом объединения некоторых субъектов, а также создана карта федеральных округов.
  5. Реализация класса TChartMapper, который непосредственно рисует диаграммы на карте или раскрашивает карту. Чтобы на карте нарисовать диаграммки, у TChart создавался отдельный слой TMapSeries, далее высчитывались нужные размеры и местоположение диаграммы, и она рисовалась, в виде прямоугольных или круговых диаграмм и т.п.
Остальные технические подробности я описывать не буду, а покажу результаты работы. Что же в итоге получилось. Карта немного была доработана в Photoshop, на предмет добавления подписей стран и морей, нанесения городов и т.п. Вариант №1. Столбчатые диаграммы для федеральных округов. Все значения (высоты) нормированы максимальным значением. Подобное рисование для субъектов выходит весьма плохо, так как размеры субъектов весьма малы (: Можно сопоставлять количественные оценки, сравнивая размеры диаграмм в ФО.

Вариант №2. Вариация первого, но данные представлены не столбиками, и в виде круговых диаграмм. В результате можно сравнивать долевое соотношение внутри региона.

Вариант №3 Раскраска субъекта в зависимости от "статуса", например красный - хорошо, зеленый - плохо :)

и Вариант №4. Цвет формируется по шкале градиента цвета в зависимости от количественого показателя для данного региона.

Поэтому знайте, если вам прийдется когда нибудь столкнуться с рисованием карт - это не так сложно, как может показаться на первый взгляд. Если будет у кого то интерес, то можно будет написать статью, о сложностях и премудростях с которыми пришлось столкнуться непосредственно при реализации, и какие моменты следует учитывать.
Метки:  Charts  |  Maps 

Комментарии

13-ый
24.06.2010 в 11:10
Не могу сказать, что мне нужно рисовать карты, но сама тема заинтересовала,
жалко как обычно времени нету :) (дежурная отмазка), а то можно было бы попробовать реализовать тоже, ну н-р для отображения процента посетителей сайта по регионам на основе анализа IP из логов сайта.
ter
24.06.2010 в 11:21
ага, когда пост написал, тоже подумал что можно на сайте отображать посещаемость :)
DmLam
25.06.2010 в 07:10
Отличная статья
ter
25.06.2010 в 11:05
tnx
Simon Kroik
25.06.2010 в 10:05
Прошел по Вашей ссылке на сайт MapWindow и обнаружил там MapWinGIS ActiveX Control.
Наверно, весьма интересная альтернатива TeeChart'u для отображения карты в своей программе.
ter
25.06.2010 в 11:59
Действительно появилось такое. год назад, когда я занимался данной проблемой такого не было (:

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


но если задача требует реализации более сложных вещей, то скорее всего данный компонент будет очень удачным началом для работы.
apk
25.06.2010 в 16:50
Крайне интересно, много раз приглядывался к ТeeChart, но каждый раз отступался - так и не понял, как отобразить карту в стереографической проекции. Судя по всему, Вам это удалось. Если не секрет, то как?
ter
25.06.2010 в 18:41
эм.. отображение карты соответствует ее исходной проекции. какая она есть, так и отображается. Проекцию карты можно поменять, например, в приведенных ГИС системах (да в прочем наверное в любой ГИС). Можно ли это делать в процессе выполнения, используя TeeChart, то скорее всего нет.
- Имя
- e-mail*
- Сайт
вы можете использовать теги [i],[b],[code],[quote]
Дополнительно