Конвертер OSM -> MP

обнаружил баг: когда есть “вырожденные” дороги из одной точки, маппер вылетает по “access violation”
если их отфильтровывать, компиляция проходит, и роутинг в девайсе работает :sunglasses:

желающим потестить: http://garminmapsearch.com/osm/osm2mp.zip
конфиги лежат в http://garminmapsearch.com/osm/mp/
запускать osm2mp.pl in.osm > out.mp

Дорог из одной точки в “большом” СПб не обнаружил, зато есть вот такой топологический баг-кольцо,
где первый и последний нод совпадают:

 <way id='4454692' timestamp='2007-10-05T20:36:14Z'>
    <nd ref='25896343'/>
    <nd ref='25896344'/>
    <nd ref='25896345'/>
    <nd ref='25896346'/>
    <nd ref='25896343'/>
    <tag k='highway' v='residential'/>
  </way>

Надо разбираться, как быть…

Потестим :smiley:

такие “одноточечные” дороги при кропе появляются.
а кольца часто встречаются, буду думать, как бы их порезать…

osmxapi сливает ways целиком, при clip (по границам) надо будет ставить
флаги “внешних” нодов, иначе потом роутинг между областями не сделать.

Нацело поделить пополам, ничего лучшее в голову не приходит.

Нашел 55 “чистых” колец (т.е. прямо в непорезанном .osm)

дык вроде как в осм круги и полагается рисовать кольцами, не разрезая.

Да была такая шутка у потлаха - дублировал дороги. Я это замечал только по енпонятно откуда взявшимся роутинговым узлам посередине дороги. Потом шел в ЖОСМ и правил.
У меня конвертор написан на “остором-С”. Таскает квадратиками данные с ОСМа и сохраняет в кеше. Пока внешнего настроечного файла нет и по слоям не бьет.

Рисовать - да, но на кругах (обычно) больше одного въезда-выезда, поэтому это не проблема.

Добавим в конфиг? Домики:

building        yes                     p       0x13            0       0

А еще изменить. Я, совместно с домиками, рисую границы районов…

landuse         commercial              p       0x08            1       2
landuse         industrial              p       0x0c            1       2
landuse         retail                  p       0x08            1       2
landuse         residential             p       0x02            1       2

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

кстати, в потлахе можно найти объект по id?

; Road!  WayID = 23397249
; highway=primary
; FIX: this line should be broken at 2
; ERROR: WayID=23397249 seems to have self-crosses or dupes
[POLYLINE]
Type=0x02
EndLevel=3
Label=Обводное шоссе
DirIndicator=1
Data0=.....

; RoadID=1668
; RouteParams=3,4,1,0,0,0,0,0,0,0,0,0
; Nod1=0,839
; Nod2=1,3275
; Nod3=2,3746
; Nod4=3,3275
; Nod5=15,921
[END]

Можно еще Мурманскую область: 68.887109375, 33.04221875 - 69.062890625, 33.39378125

добавил в список :slight_smile:

теперь будет делаться попытка компиляции с роутингом (personal-версией маппера).

Спасибо!

Хмм. Я вижу проблему только в кольцах (start_node=end_node), все остальные вроде как
несложно порезать.
Вот бы еще автоматически объединить два way, касающихся в нероутинговом ноде и с совпадающими тэгами.

Было бы неплохо, но думаю что нет.
Я пользуюсь
./get_ways_by_list 2>/dev/null
и редактирую в JOSM

#!/bin/bash

if [ $# -ne 1 ]
then
        echo Usage: $0 waylist
        exit 1
fi

waylist=$1

if [ ! -f ${waylist} ]
then
        echo can not open waylist=${waylist}
        exit 1
fi


echo '<?xml version="1.0" encoding="UTF-8"?>'
echo '<osm version="0.5" generator="get_ways_by_list">'

for way_id in `cat ${waylist}`
do
rm -f way$$

curl "http://api.openstreetmap.org/api/0.5/way/${way_id}" |\
awk '{if ($1 != "<?xml" && $1 != "<osm" && $1 != "</osm>") print}' | tee way$$

awk -F\" '{if ($1 == "    <nd ref=") system("curl http://api.openstreetmap.org/api/0.5/node/"$2)}' way$$ |\
awk '{if ($1 != "<?xml" && $1 != "<osm" && $1 != "</osm>") print}'

rm -f way$$
done

echo '</osm>'

Так и до поиска с индексом скоро доберемся :smiley:

Добавил поиск и фильтрацию дупов точек, одноточечных линий и двухточечных полигонов :slight_smile:
Все найденные ошибки теперь grep-ятся в файл errors.log

; ERROR: WayID=22745318 has dupes
; ERROR: WayID=22771488 has self-intersections
; ERROR: WayID=22873079 area has too few nodes
; ERROR: WayID=22984864 has dupes

Конвертер работает не с файлами .osm, а с живой базой, с которой скачивает данные? Или просто формат сделан похожим?

Просто если это живая база, то для того, чтобы запустить конвертер на сервере для генерации карт в автоматическом режиме, то надо будет:

  • либо обеспечить устойчивую работу основного сервера OSM, с которого все время будут качаться гигабайты данных (что вряд ли понравится его администраторам),
  • либо поднимать копию базы на сервере с конвертером, через osmosis заливать туда diff-файлы и работать с ней.

конвертер работает с файлом OSM, но есть отдельный скрипт, который по крону раз в сутки тянет текущие данные по osmxapi, конвертирует и выкладывает на ftp. вот ему-то bbox и нужен

сейчас всё это запускается на моём домашнем компе.
москва в .osm весит примерно 27 мегов, всё остальное ещё меньше, так что о гигабайтах речи не идёт

Понятно. Тут OSMXAPI используется просто для ускорения процесса, чтобы не резать planet.osm, выделяя из него необходимые участки?

Это если говорить о России. А если иметь в виду использование конвертера для всех пользователей OSM, то обзорные карты по странам, плюс общая по Европе/США/и т.д., плюс карты городов и весей потянут на много. Не зря же planet.osm теперь такого размера.

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