Москва. Прокладка маршрутов

Надобавлял ещё кучу всего: Калугу, Ярославль, Тверь, всю дорогу от Москвы до Питера. Чтобы меньше нагружать сервер, оставил четыре обновления - в 3,9,15,21.
Сейчас качается, появится может через полчасика.

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

Я маленькими квадратиками выкачиваю через старый API. Как раз хотел у тебя спросить совета, где бы мне взять всю Россию :slight_smile:

а нет готового скрипта для скачки-склейки? чтобы велосипед не изобретать… :slight_smile:

сейчас всю Россию я беру тут: http://downloads.cloudmade.com/asia/russia/
но там только еженедельно обновляется

Есть список url-ов для нужной мне территории, часть из которых, для Москвы и Питера, я сгенерировал автоматически, чтобы куски были маленькими. Я по списку выкачиваю wget-ом, удаляю те файлы, которые не содержат корректный XML и копирую оставшиеся в директорию с предыдущей версией. Склеивать не приходится, просто моя программа читает несколько файлов и игнорирует дубликаты. То есть скрипт такой:

cd /home/vsevolod/routing/new
../spliturl.py | bash 
for i in *.osm ; do xmllint --format $i > /dev/null || rm $i; done
mv -v *.osm ../stable/
cd ..
pkill analyze3.py
mv error.log error.log.`date +%s`
./analyze3.py stable/*.osm > out.log 2> error.log &

А spliturl.py состорит из примерно таких строк:

la0 = 59.713482370444446
lo0 = 29.4927978515625
la1 = 60.23776612113594
lo1 = 30.89080810546875
lad = (la1 - la0) / 8
lod = (lo1 - lo0) / 8
for i in range(0,8):
        for j in range(0,8):
                print "wget -O SPb%(i)d%(j)d.osm http://www.openstreetmap.org/api/0.5/map?bbox=%(lo1)f,%(la1)f,%(lo2)f,%(la2)f"%{'i':i, 'j':j, 'lo1':lo0 + i * lod, 'lo2':lo0 + i * lod + lod, 'la1':la0 + j * lad, 'la2':la0 + j * lad + lad}

print "wget --tries=3 -O Murmansk.osm http://www.openstreetmap.org/api/0.5/map?bbox=32.704963580923,68.82430018480561,33.444507117554,69.08779420309446"

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

Vsevolod Shorin, а можете ещё добавить Минск(bbox=27.384,53.803,27.779,53.992)?

Есть небольшая библиотека на руби для OSM. Она умеет, в том числе, и сливать большие карты по кускам. Могу выслать если интерисует.

выкладывай, коли есть :slight_smile:

Вот первая публичная версия - http://files.leonenko.info/OSMTools.zip
пример использования для загрузки (грузит по квадратам 0.1х0.1 - для надежности):
./load_map.rb -min_lon 27.495933 -max_lon 27.500455 -min_lat 53.893498 -max_lat 53.89542 -o test.osm

можно создавать мультиполигоны (создаёт relation, меняет направление контуров при необходимости, удаляет теги с внутренних контуров при полном совпадении с тэгами внешнего):
./multipolygon.rb OUTER_ID INNER_ID1 INNER_ID2 …

можно запреты поворотов (добавить -viaway, усли via - не Node, a Way):
./turn_restriction.rb -from 25597121 -to 25230982 -via 275076538 -type no_left_turn

все параметры в options.rb

попробовал…
на куске 1х1 градус вылетело по таймауту
кусок 0.4х0.4 градуса скачался, но в получившемся xml-е порядок значений стал другой

<node user="Sforza" lat="55.2599407" timestamp="2008-04-03T21:05:48+01:00" lon="37.4011769" id="255595270">

такое дело сильно усложнит разбор регекспами…

Таймаут увеличил. А порядок… я читаю xml и пишу не руками, поэтому так и получилось. Поправил (только без отступов). Вот по производительности скрипт конечно отдыхает…

По поводу обновлений: можно полностью сливать и раз в неделю, а обновлять применяя osmChange от planet.osm (они выходят по 6 раз в день) - меньше нагрузки на api.

теперь вываливается с ошибкой

C:\buf\osm\OSMTools>load_map.rb -min_lon 37 -max_lon 38 -min_lat 55 -max_lat 56 -o test.osm
Retriving map within bbox 37.0,55.0,37.25,55.25...  Done
.....
Retriving map within bbox 37.75,55.75,38.0,56.0...  Done
./relation.rb:35:in `inner_xml_exact': undefined local variable or method `nodes' for #<Relation:0x1119cc68> (NameError)
        from ./mapObjectBase.rb:76:in `to_exact_xml'
        from ./map.rb:67:in `to_exact_xml'
        from ./map.rb:67:in `each_value'
        from ./map.rb:67:in `to_exact_xml'
        from C:/buf/osm/OSMTools/load_map.rb:19

Мне повезло - у меня небыло отношений в квадрате:) Пофиксил.

Я немного пооптимизировал программу и теперь по памяти нормально влезает вся Россия. Завтра постараюсь выложить и сразу добавить и Белоруссию. Где лучше её брать? Там же, где Liosha предложил брать Россию?

Белоруссия ежедневно http://download.geofabrik.de/osm/europe/

теперь не хватает закрывающих тегов , etc :wink:

Да, тут самая лучшая.

Поправил:) завтра подоптимизирую ещё, а то сейчас память может поедать в больших количествах.

вроде бы заработало. ща попробую настроить скачку через это дело…

не-а, не получается…
любая ошибка при скачке одного тайла приводит к аварийному завершению всего скрипта

Retriving map within bbox 50.05791241,53.169807212,50.30791241,53.419807212...Er
ror: Net::HTTPInternalServerError (Internal Server Error) when loading from http
://api.openstreetmap.org/api/0.5/map?bbox=50.05791241,53.169807212,50.30791241,5
3.419807212./map.rb:83:in `merge!': undefined method `nodes' for nil:NilClass (N
oMethodError)
        from ./map.rb:109:in `retrive'

можно сделать автоповтор, а можно просто пропустить. можно ещё автоповтор после того, как всё остальное пройдёт. Как лучше?