Рендеринг карт в C++ Builder + работа с графом дорог.

Добрый день уважаемые обитатели форума.

Мне необходимо написать программку котора будет работать в оффлайн с картами. Остановился на OSM потому что почитав форум убедился в Вашей серьезной поддержке уважаемые форумчане.

Дано:
Есть приложение написанно на C++ Builder, туда нужно встроить поддержку карт. Не важно будет это компонент к билдеру или библиотека написанная на другом языке. Пользователь программы должен отмечать участки дорог по которым он проехал (скорее всего поставит точку на этом участке дороги), а программа должна посчитать какое расстояние водитель проехал.
Так же надо привязать к каждому участку дороги еще кое какую справочную информацию.
Все это должно работать в отсутствии интернета.

Этапы:

  1. Собственно отображение (отрисовка или рендеринг) карты в программе.
  2. Навигация по карте (зум, а так же возможность передвижения в право-влево-вверх-вниз).
  3. Постановка точек на интересующих участках дорог.
  4. Расчет расстояния между первой и последней точкой по дорогам.
  5. Ассоциация справочной информации к участкам дорог и досуп к ней.

На форуме очень много всего написанно, читаю целый день, думаю что быстрее будет если кто-то мне поможет найти информацию по этапам, т.к. многое уже обсуждалось. Либо кто-то вообще захочет персонально мне помочь на не безвозмездной основе.

Спасибо за понимание.

Так как нужна не Java и не .NET (или оно теперь в Builder интегрируется нормально? тогда надо посмотреть http://wiki.openstreetmap.org/wiki/SpatialLITE http://wiki.openstreetmap.org/wiki/OsmSharp ), и даже не Qt, то есть вероятность написания рендера руками или прикручивания к программе мапника или http://shtosm.ru/all/alacarte/ .

После этого отслеживание клика и определение дороги/окрестностей с вытаскиванием соответствующих данных из базы/файлов будет сделать сравнительно просто. А вот роутинг - это да, кромешный ужас (все помним про запреты поворотов, access и т.д.?). В силу отсутствия опыта не скажу, что легче - написать руками или прикрутить к билдеру OsmSharp, или, не к ночи будь помянут, локальный osrm: http://project-osrm.org/ .

Самой малой кровью можно отделаться, вставив в окошко браузер с лифлетом, который натравливается на папку с тайлами (хотя бы 1,2 решаются сразу).
А вот клики придётся обрабатывать уже всяко на C++ (поиск ближайшего отрезка по заботливо составленной базе/структуре, расстояния/пометки/подсветки поверх карты).

Надеюсь, кто-нибудь другой подскажет таки волшебную библиотеку или возьмётся помочь :slight_smile:

Ознакомился с сылками.

Меня почему-то привлек вариант локального OSRM, тут описано как скомпилировать OSRM:
https://github.com/DennisOSRM/Project-OSRM/wiki/Building%20OSRM

Однако описание только как компилировать для Linux и MacOS. На сколько я понимаю даже если я разверну его локально на машине (или на виртуалке), мне к нему надо обращаться через компонент ВЕББраузер. Получается что при модификации кода OSRM (добавление возможности прокладки маршрута через несколько точек и передача результатов) задача будет полностью решена. (Судя по возможностям ДЕМО http://map.project-osrm.org/))

Правильно ли я понимаю? Куда дальше копать? Пробовать перекомпилировать на винде? или поставить на локальную машину виртуалку с Ubuntu или Debian?

А в этом компоненте точно есть какое-то взаимодействие с сишным кодом ? А то боясь вам придётся сначала реализовать всё на яваскрипте с последующей передачей как-то данных, что наводит на мысль, а зачем вообще он нам, когда всю информацию можно вывести в обычном браузере.

Я тоже не понимаю, нафиг тут нужен билдер. Смысл был бы, если писать приложение со своим показывателем тайлов и нативным интерфейсом выбора маршрута, а также использованием OSRM напрямую (скомпилированного в DLL, к примеру). А писать обертку для окошка браузера как-то странно.

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

Вы бы по какому пути пошли?

Можно воспользоваться системой расширений PocketGIS(требуется регистрация). Постройка маршрута и расчот времени/расстояния это его конек. Остаётся дописать dll c нужной тебе функциональностью.

Пункты 1-4 там уже имеются.
Остаётся дописать 5й пункт. Думаю что проблем не будет.

Ну, тайлы можно и в билдере показывать. Для Дельфей такой компонент я даже знаю.

Не суть, можно и на делфи библиотеку написать. Что за компонент?
У кого еще какие мысли? Я смотрел компонент DataMap, но он платный и до автора не достучаться. В принципе за результат мне тоже денег не жалко.

http://www.stelmap.com/

Хорошая штука :slight_smile: Но при ее использовании вопрос с постановкой точек и отрисовкой остается открытым. Где-то видел статью как сделать подобную вещь, только с Яндекс картами. Может ее переписать для OSM? Может кто-то делал?

Еще нашел вот такие штуки, может кто скажет про них если знаком?

  1. http://www.maparound.ru/
  2. http://devdelphi.ru/?cat=686
  3. http://www.datagis.ru/
  4. http://www.mappl.ru/products
  5. http://vkasoft.narod.ru/index.htm

Мне кажется, вопрос в том, что проще:

  1. написать указанную Вами функциональность на С++,
  2. переписать то, что есть в Вашем приложении, на языке, обеспечивающем легкое взаимодействие с имеющимися компонентами.

Лично для меня неочевидно, что первый вариант предпочтительнее второго.

Руками стоит писать при выполнении следующих условий:

  • Есть минимум 3 месяца на этот проект (без отвлечений)
  • Нет сверхъестественных требований к красоте отображения и размеру БД
  • Нужна сильно нестандартная функциональность

В остальных случаях лучше купить готовые компоненты (DataGis по сайту неплохо смотрится), убедившись что они будут совместимы с чем надо.

Если в приложении можно выделить модуль на .NET - OsmSharp и не париться (там примеры GUI есть, осталось только заставить работать), тем более бесплатно. Правда тогда придётся открывать исходники всего модуля клиентам, ибо там GPL.

Огромное спасибо. Этот компонент решает первые 3 задачи и есть возможность купить исходники за приемлемые деньги и переписать компонент на билдер.
Теперь вопрос, как используя этот компонент решить задачи 4 и 5

Напомню:

Т.к. будут исходники, и карта будет отображаться в определенных масштабах, можно под растровый слой записать векторный, приводить его к тому же масштабу. Переносить на него путевые точки поставленные на растре. Затем ассоциировать эти точки к дорогам. вычислить расстояние от первой до последней. Проявить на растре путь.

Только вот я боюсь, что дорога на растровой подложке и на векторной карте не совпадут в разных масштабах и визуально это будет очень коряво. Примерно так же как в googlemap когда смотришь картинки со спутника и включает отрисовку дорог линиями.

Покурить OSRM

Забыть об этом. Это все равно что собрать боинг на коленке. Osm-файл в сыром виде не содержит ни объектов, ни их атрибутов, а только графические примитивы. Объекты нужно сперва сформировать, а потом приписать им атрибуты исходя из выбранной объектной модели.

Если ОЧЕНЬ сильно надо, я бы сперва сконвертил osm в польский формат (osm2mp.pl) в нем есть уже дороги с атрибутами и запретами, можно делать рутинг и смотреть атрибуты. (стандартные конфиги osm2mp.pl конвертят разумеется далеко не все атрибуты, но это поправимо )

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

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

Честное предупреждение: сборка OSRM под Windows - занятие не для слабонервных, хоть и есть инструкция.
https://github.com/DennisOSRM/Project-OSRM/wiki/Windows-Compilation

Итог моей попытки на VS2012: собрал Boost и Bzip2, а сборка STLXXL валится на очередном хитром C++ - шаблоне.
Что будет делать компилятор С++ Builder - даже боюсь предположить (хотя можно перебрать все остальные компиляторы, какой-то да переварит… ) :slight_smile:

FYI, смеха ради скачал STLXXL из репозитория, сочинил CMakeLists.txt по мотивам обсуждения и благополучно собрал в VS2010. Eдинственное что потребовалось сделать - закомментировать #include <unistd.h> в bits/mng/config.h. Тесты и бенчмарки из сборки выпилил для простоты.

cmake_minimum_required(VERSION 2.8)
PROJECT (stxxl)

FIND_PACKAGE(Boost REQUIRED)
INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIR} )

ADD_LIBRARY(stxxl STATIC 
algo/async_schedule.cpp
common/exithandler.cpp
common/log.cpp
common/rand.cpp
common/seed.cpp
common/stxxl_info.cpp
common/verbose.cpp
common/version.cpp
containers/copy_file.cpp
io/boostfd_file.cpp
io/create_file.cpp
io/disk_queued_file.cpp
io/fileperblock_file.cpp
io/iostats.cpp
io/mem_file.cpp
io/mmap_file.cpp
io/request.cpp
io/request_queue_impl_1q.cpp
io/request_queue_impl_qwqr.cpp
io/request_queue_impl_worker.cpp
io/request_with_state.cpp
io/request_with_waiters.cpp
io/serving_request.cpp
io/simdisk_file.cpp
io/syscall_file.cpp
io/ufs_file_base.cpp
io/wbtl_file.cpp
io/wfs_file_base.cpp
io/wincall_file.cpp
mng/config.cpp
mng/diskallocator.cpp
mng/mng.cpp
)
ADD_DEFINITIONS(-DSTXXL_BOOST_CONFIG -DSTXXL_BOOST_THREADS -DSTXXL_BOOST_TIMESTAMP -DSTXXL_BOOST_FILESYSTEM -DSTXXL_BOOST_RANDOM -DBOOST_ALL_DYN_LINK)
INCLUDE_DIRECTORIES(../ include)

Установлю 12-й express, посмотрю, что там…

Доброго времени суток, уважаемые форумчане.

Мне необходимо написать подобное приложение, с некоторыми отличиями:

  • Навигация
  • Зум
  • Указание точек начала и конца пути, поиск оптимального пути
  • Собственно выведение информации в глаза пользователя

Все это на Qt, С++. Я в этом деле новичок, разбираюсь в информации всего около недели. И нашел-то уже много, вот только разобраться не могу, как лучше такое дело слепить. Теряюсь. Не могли бы вы подсказать источники, примеры и т. п.? Да, БД должна быть небольшой, в пределах, ну скажем, одного города. И требований к “красоте” также особых нет, главное чтобы оно работало.

Заранее благодарен.

Для qt найдена библиотека в соседней теме. ))

Stlxxl ругался вроде бы как раз на bits, попробую ради интереса тоже закомментировать. C++ такой C++ :slight_smile:
P.S. Взял с гитхаба, убрал unistd -заработало.