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

А сколько приблизительно весит база с графом дорог России в ОСМ? Как часто происходят изменения? Насколько они масштабные обычно?

Изменения происходят ежесекундно, а конкретно в графе дорог РФ… Да черт его знает, может, раз в минуту, может, раз в 10 минут.

Вообще, вроде бы есть два основных варианта — поддерживать базу РФ в актуальном состоянии с помощью ежечасных, например, диффов, либо периодически выдирать из свежего дампа.

Насколько я знаю, отдельную выгрузку только с графом дорог (тем более России) никто не делает. Можно взять полную выгрузку России, например с gis-labа (по невероятному стечению обстоятельств на данный момент выгрузка недоступна), и с помощью osmosisа отфильтровать по нужным тегам (highway=).
Как часто происходят изменения? Да постоянно
, ежесекундно кто-то что-то где-то правит. Касаются ли эти изменения графа - вполне вероятно. Но очень уж масштабных изменений обычно нет.


    • Щелкнуть на “ticker”

Я сделал себе скрипт, чтобы импортировать из osm в mongoDB, там можно делать что угодно довольно просто. Бью пути на сегменты (между 2 точками), считаю для них веса, дальше буду пробовать алгоритмы трассировки.

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

db.way.find().forEach(function(w) {
    var nodes = w.nodes.map(function(v) { return v.ref }), // make nodes array of `ref` attributes of nodes in the ways
        from = nodes.slice(0, nodes.length - 1), // first nodes of segments are all but the last node
        to = nodes.slice(1); // last nodes of segments are all but the first node
    /* if nodes were [1, 2, 3], I need [1, 2] and [2, 3] to make [[1, 2], [2, 3]] */
    var zip = function(v) { // pop from both `from` and `to` arrays and make them a segment with way's id, way's tags
            db.segments.save({way: w.id, tags: w.tags, from: from.shift(), to: to.shift()});
        };
    from.map(zip); // map is quicker than the `for` loop
});

Работать с базой данных на JavaScript - это колоссальное облегчение участи программиста!

А сколько всего “рёбер” в графе дорог России?
Может кто-то знает, как это проверить не скачивая всю карту…

На карте этого нет. Только когда конкретно построишь граф, тогда и узнаешь. А зачем это знать?

Есть небольшая статистика по регионам.
Вот небольшой регион:
http://wowik.byethost7.com/routes/ru-yev/clusters.htm

Смотрим самый низ и видим, что все дороги вплоть до track включительно
6572 штук way
Общей длиной 7183.7 км

Смотрим повыше и видим, что Если track не включать, то
5039 штук way
Общей длиной 3840.1
и т.д.

Количество way это не совсем количество ребер, но что-то близкое.

  1. Если к way в середину приклеивается другой, то ребер три, а не два.
  2. Если два вея просто сцеплены друг с другом, без соединений с чем-либо, то это одно ребро. Например на них разная полосность или освещение.
    А может и два, если важно, что скорость на них разная.

Вы что под ребром понимаете?

Совсем грубо число osm-веев с междугородними дорогами можно прикинуть полистав валидатор дорог от Вовика:

http://wowik.byethost7.com/routes/ru-sve/1.htm

Еще какие-то циферки вот тут вверху: http://wowik.byethost7.com/routes/ru-sve/clusters.htm

Попробовал прогнать свой конвертер по файлу https://download.geofabrik.de/russia-latest.osm.pbf
Если включить все автодороги до уровня track (т.е. кроме пешеходных), то всего там ~5.2 млн. отдельных way. С учётом связности наибольший кусок связанного графа включает в себя ~5.1 млн. отдельных way. Но это именно osm-ные way, до разбивки по перекрёсткам. С разбивкой получается ~11 млн. рёбер ненаправленного связанного графа у наибольшего куска. Для направленного графа рёбер получается ещё вдвое больше, ~21 млн.

Объединения последовательных цепочек рёбер не выполнялось (например там где дорога без ветвлений проходит через мост или разбита по какой-либо другой причине).