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

Карты Европы можно взять порезанные здесь 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 все то же самое.

пример? лехко!
дорога 1 идёт с севера на юг, дорога 2 - с запада на восток
в точке А они пересекаются

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

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

доделал порезку дорог с самопересечениями
теперь полноценный псевдороутинг :slight_smile:

заодно исправил баги в карте москвы, из-за которых маппер вылетал

??? ??? ? «???» ?? ? ??? ??? ??? ??? ?? ??? ??? ??? ??? ? ?? ??? ???, ??? ??? ??? ??? ???, ??? ? ?? ??? ???. ??? ??? ??? ??? ??? (??? ?? ??? ??? ?? ??? ??? ???).

? ??? ??? ?? ??? !!!

Рэзать в точке А обе дороги. Тогда и точка А в описании будет не нужна.

Сделал обработку мультиполигонов.
Но почему-то внутренние полигоны, которые “дыры”, многие сделаны с теми же тэгами, что и внешние.
То есть получается озеро, а внутри него ещё одно озеро :slight_smile:

http://wiki.openstreetmap.org/index.php/Relations/Multipolygon

А раньше это было такое требование. Чтобы внутренние и внешние границы были помечены одинаково. И мапник брал по ошибке (?) при рендере тэги из внутреннего полигона. То есть, если поставишь для внутренней границы леса (natural=wood) natural=water, то получаешь большое озеро с островом внутри.
А вот 30 марта Thomas Wood изменил требование, что надо оставлять либо вообще без тэгов, либо нужным для внутреннего полигона.
Ну, наверно, теперь так. Надо бы проверить, как это будет рендерится в мапнике…

P.S. У меня все мультиполигоны сделаны “по старому”…

Выкладываю для тестирования версию 0.3 конвертера
http://garminmapsearch.com/osm/osm2mp.zip

Роутинг есть, мультиполигонов ещё нет

Многие “мультиполигоны” которые я вижу, надо основательно править. Так что это небольшая потеря.