Работа с графом дорог

Добрый день!
Никогда не приходилось работать с OSM. Но отлично ориентируюсь в Google Maps и Яндекс.Картах.
Ни в тех ни в других нет возможности получить доступ к графу дорог. Например, если я захочу написать свой алгоритм трассировки. Как мне получить координаты узлов графа (перекрестков) и тд. и тп.
Я так понимаю в OSM должна быть такая возможность. Буду рад, если расскажете мне какие классы API или сторонние библиотеки позволяют работать с графом. Может быть примеры есть.

вот и пришел человек, который напишет ОСМ.Пробки
? :slight_smile:

По теме грамотно не отвечу. Вот тут есть некоторые, из употребленных вами терминов http://wiki.openstreetmap.org/wiki/Xapi

Хм… Точка, в которой пересекаются две дороги - и есть узел графа
http://wiki.openstreetmap.org/wiki/Routing

что-то не работают там сервера. очень обнадеживающий статус указан “mostly overloaded and also out of date” :slight_smile:
А по описанию очень похоже на то что пригодилось бы

Апи для работы именно с графом дорог как такового - нет. Есть просто апи для osm. Можете глянуть как работает слой данных на главной.

Стандартное апи не столь приятное как xapi но работает вполне стабильно.

XAPI кстати на сервере рамблера еще поднят, (я только ссылку не помню можете натравить гугель на форум), месяц назад вполне работало и данные были актуальны.

Просто апи это имеется ввиду OpenLayers, я правильно понимаю? Т.е. с его помощью можно достать всю ту же самую инфу (node, ways и тд) что и даёт xapi ?

Нет.

Ой… OpenLayers это библиотека для отображения, а не АПИ.

Кстати, есть еще сторонние роутинговые приложения, использующие данные осм, зайдите на осм-вики в раздел Routing, там много полезного.

leaf, вам скорее всего, все-равно придется писать некую обертку, т.к. на клиенте много не навычисляешь, а по сему наверное проще всего поднять локальную бд с данными (по России например) и уже по ней шуровать.

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

leaf - в вики, ключевые слова osmosis, osm2pgsql.

Про локальную копию - Ezhick подсказал (кстати если его подонимать в личке он наверное и побольше расскажет :slight_smile: )

Айдишники не совсем постоянны:

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

С точками примерно та же петрушка.

И да, что печально - это поведение на совести редактора т.к. постоянства айдишников ничто не гарантирует.

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

Про айдишники.

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

Ну и ещё. Если вы хотите пробки - то в любом случае все роутинговые веи, думается, надо разбивать на 2 одновейных. Иначе как вы скажете в какую сторону пробка?

Ой, вот тут вы не правы. Совсем. И, главное, топикстартер про пробки ничего не говорил!!!

совсем никак не связанные? или всё-таки можно вычислить произошедшие изменения?
я тут пока изучаю и где-то натыкался на то что есть какая-то “версионализация” в OSM. Ведется ли что-то вроде истории версий? Хотя это не особо облегчит задачу.
Да, надо будет хорошенько подумать как с этими обновлениями поступать.

Заранее, спасибо. Как только с основами разберусь и если что-то будет непонятно обращусь.

Ну теоретически некоторые изменения можно вытащить из истории:

Если линию поделить на 2 сегмента это равносильно:
создать 1 новый сегмент с половиной точек из старого.
отредактировать старый сегмент сохранив в нем половину точек.
(josm, potlatch1, potlatch2 вроде так и делают).

Соответственно 1 кусок сохранит часть истории вея, так же будет ревизия в которой точки с такими то айди были удалены из вея 1 и включены в новый вей 2.

Но опять же никто не мешает редактору сформировать xml с изменениями след. образом:
Грохнуть старый, создать 2 новых вея - в этом случае у новых версия будет 1 история пропадет. Останется теоретическая возможность вытащить ревизию в которой это произошло и по id точек догадаться что линию распилили. Но это геморой наижутчайший.

Проще вам наверное експеримент поставить где-нибудь в тундре, посоздавать веев поизменять их, поредактировать атрибуты, подобавлять/поудалять точек. По объединять/по разделять линии и т.п. и посмотреть что пишется в историю и в osm-change.xml, на пальцах это не шибко понятно выглядит.

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

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