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

Спасибо!

Хмм. Я вижу проблему только в кольцах (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:
сейчас сам конвертер в глубокой бете, так что результаты выкладываются только для его обкатки.

Карты Европы можно взять порезанные здесь http://download.geofabrik.de/osm/europe
Для переработки же полного planet.osm проще модифицировать osm2pgsql, а не возиться с простыми
перл-парсерами.

Количество “XML мусора” там очень даже внушительно.

По моему это живая postgis база, которая пополняется (в почти реальном времени) диффами из основной mysql базы.

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

Протестировал конвертер на странах Европы

           Исходный   Результат    Время     
            размер       MP      конвертации

Польша      130 Mb     32 Mb        1:25
Италия      199 Mb     52 Mb        2:35
Франция     393 Mb    105 Mb        5:00
Англия      948 Mb    292 Mb       10:40

машинка Athlon 2600, 1.2 Gb, WinXP

результат могу выложить, в принципе, но мапедит даже Польшу открывает 10 минут

???, ???, ???: ??? .osm ? .img ? ??? mkgmap. ??? ??? GPSMapEdit ? .nm2 ??? «???».

??? ???, ??? ???. ?? ??? ???. :frowning: ??? ? ??? ?? ??? ??? ??? ??? ??? ??? ??? ???

?) mkgmap ?? ??? ??? ???. ? ?? ??? ???
?) ??? ??? ? mkgmap ? ???, ??? ?? ??? ??? ??? ?? img (? ?? ??? ???)

???. :frowning: ?? ??? ???, ??? ??? ??? ??? ?? ??? ???. :wink:

P.S. ??? ??? ??? ??? ? ?? ??? - ?? ??? ??? ? ? ??? ??? ??? ???. :smiley: :smiley: :smiley:

Я взялся за самый большой файл:)

Германия 1.5GB 422MB 6:33.04
машинка 2xOpteron250 2.4GHz, 8 GB, Linux

Скрипту понадобилось около 2ГБ памяти
gpsmapedit падает на выходном .mp
Самодельный gpsmapedit-0.98б собранный с помощью winelib работает,
но там нет роутинга.

gpsmapedit ругается здесь
(WARNING (offset 5D5571h): Latitude value is expected. The point will be ignored.)

; NodeID =
; place=village
[POI]
Type=0x0C00
Data0=(,)
EndLevel=2
Label=Nutha
City=Y
[END]
  <node id="240023524" timestamp="2008-01-19T17:06:38Z" user="OpenGeoDB Bot" lat="51.9667" lon="12">
    <tag k="openGeoDB:is_in" v="Anhalt-Zerbst,Dessau,Sachsen-Anhalt,Bundesrepublik Deutschland,Europe"/>
    <tag k="openGeoDB:name" v="Nutha"/>
    <tag k="openGeoDB:sort_name" v="NUTHA"/>
    <tag k="openGeoDB:community_identification_number" v="15151042"/>
    <tag k="openGeoDB:is_in_loc_id" v="275"/>
    <tag k="openGeoDB:layer" v="6"/>
    <tag k="place" v="village"/>
    <tag k="openGeoDB:location" v="political_structure"/>
    <tag k="openGeoDB:postal_codes" v="39264"/>
    <tag k="openGeoDB:combination_of_public_administration" v="Verwaltungsgemeinschaft Elbe-Ehle-Nuthe,Elbe-Ehle-Nuthe"/>
    <tag k="is_in" v="Anhalt-Zerbst,Dessau,Sachsen-Anhalt,Bundesrepublik Deutschland,Europe"/>
    <tag k="openGeoDB:loc_id" v="21850"/>
    <tag k="openGeoDB:version" v="0.2.6.11 / 2007-12-04 / http://fa-technik.adfc.de/code/opengeodb/dump/"/>
    <tag k="openGeoDB:population" v="287"/>
    <tag k="population" v="287"/>
    <tag k="openGeoDB:type" v="Gemeinde"/>
    <tag k="openGeoDB:license_plate_code" v="AZE"/>
    <tag k="openGeoDB:telephone_area_code" v="03923"/>
    <tag k="name" v="Nutha"/>
    <tag k="created_by" v="opengeodb2osm0.5.2"/>
    <tag k="openGeoDB:auto_update" v="population,place,name,is_in"/>
  </node>

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

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

и это всё цветочки: если начать поддержку релейшнов, памяти будет уходить ещё больше

Это точно.
Я вот сейчас думаю, как быть с такими вещами (если учитывать и oneway, то будет еще запутаннее)

10982333 → 22346590
22346590 → 10982333

  <way id='4459751' timestamp='2007-10-19T17:28:31Z'>
    <nd ref='10982333'/>
    <nd ref='22346590'/>
    <tag k='highway' v='residential'/>
  </way>

  <way id='23232699' user='Mirt' osmxapi:users='Mirt' timestamp='2008-03-09T16:48:17Z'>
    <nd ref='251347811'/>
    <nd ref='22351705'/>
    <nd ref='22351716'/>
    <nd ref='22352581'/>
    <nd ref='22346590'/>
    <nd ref='10982333'/>
    <nd ref='251356232'/>
    <nd ref='251351067'/>
    <nd ref='251351048'/>
    <nd ref='251351070'/>
    <tag k='highway' v='residential'/>
    <tag k='name' v='Церковная ул.'/>
  </way>

фигня какая-то с запретами поворотов
http://wiki.openstreetmap.org/index.php/Relations/Turn_Restrictions
указывается, с какой дороги на какую запрещено, но при этом не учитывается направление движения.
неоднозначно всё получается, в таком виде это дело использовать нельзя

Пример ?
ИМХО, в .mp все то же самое.