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

А у тебя репозиторий какой-нить есть с конвертером? Если нет, то я mercurial’овский себе заведу…:slight_smile: Я б мог попробовать реализовать поиск улиц и домов…

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

UPD.
зарегистрировал проект на SF-е: https://sourceforge.net/projects/osm2mp/
если аппрувнут, будет жить там

Liosha,
А можно все Tags в конечном файле оставлять?
Хотелось бы типа:
; addr:city: Мурманск
; addr:street: Ушакова

Ну и т.д. все необрабатываемые таги.

Dmitry Terentiev
в принципе можно, но сейчас обработка тегов по-другому заточена
когда соберусь её менять - сделаю

возможно проще на code.google.com
я свой мусор там храню - http://code.google.com/p/pyosm/source/browse/#svn/trunk например
из достоинств - апрувать не надо. более простое ведение списка тасков. ну и разные мелочи…

можно и в гугле…
выложил на http://code.google.com/p/osm2mp/source/browse/#svn/trunk/osm2mp
чёрт ногу сломит с этим svn…

Вроде как заработало.

они там почему-то CVS настроили вместо SVN. и как переключить, я не понял
пускай уж на гугле живёт

Хотелось бы узнать, есть ли какие-нибудь противопоказания для nodeid=osm_node_id и roadid=osm_way_id ?

liosha,
Спасибо за конвертер! Но очень не хватает нумерации домов.
Синтаксис addr:city, addr:housename, addr:housenumber, addr:postcode, addr:street присутствует в josm, т.е. его можно смело брать за основу. Пробовал сделать свой конвертер, но так роутинг и не поддался. Добавка нескольких строк в ваш конвертер:

       $addr_city  = convert_string ($2)              if ($1 eq "addr:city");
       $addr_housenumber = convert_string ($2)        if ($1 eq "addr:housenumber");
       $addr_street = convert_string ($2)             if ($1 eq "addr:street");

и

           print  "${d}HouseNumber=$addr_housenumber\n"                if ($addr_housenumber);
           print  "${d}StreetDesc=$addr_street\n"                      if ($addr_street);
           print  "${d}CityIdx=1\n"                                    if ($addr_city);

Помогла добавить адресный поиск для одного города, но приходится дописывать в header.cfg индекс и название города, что конечно даже для конвертации области не удобно. Задача видится просто: 1. Проиндексировать все города встреченные в addr:city, и добавить индекс в *.mp сразу после header. При встрече тега addr:city, заменять собственно имя города на индекс. Можно будет это добавить в конвертер. А то perl для меня как китайская азбука.:smiley:

Вообще-то в cgpsmapper-е от такой схемы индексации давно отказались.
Там просто прописывают у объекта поля

CityName=city name
RegionName=region name
CountryName=country name

и маппер уже сам всё индексирует.

Так есть ли смысл делать с индексом?

Не знал. Я ориентируюсь на http://v-dorogu.narod.ru/article/polishformat.htm. А индексную схему cgpsmapper-е кушает? Попробовал схему без индексации в gpsmapedit - не воспринимает. А соответственно конвертация в навитель и руссу не получится.:frowning:

мда, это плохо… кушать-то он её кушает, но с ней возни больше.
отстал о жизни мапедит…

а про формат маппера лучше в самом маппере смотреть:
http://cgpsmapper.com/manual.htm
http://gpsmapsearch.com/osm/Test_img.mp

liosha,

Дык, может два варианта сделать?

дело ещё в том, что для гармина такая адресация бесполезна: там нет индексации зданий
там индексируются только участки улиц
а как я уже говорил, я ориентируюсь именно на гармин, я не использую навител/руссы/etc

поэтому первый вопрос: как для улицы определить город, к которому она относится?

Нда, посмотрел - это уже обсуждалось, только добавлять дополнительный тэг.
Чего не пойму, так если этого нет в gpsmapedit , то с его помощью не получится сделать адресный поиск для гармина? Как это вообще тогда делается?

очень даже получается
http://4pda.ru/forum/index.php?showtopic=70509&view=findpost&p=2032230
(нужно зарегистрироваться)

ó ìàïïåðà åñòü îøèáêà: R005:Maximum allowed NODID value is 1048575
ñ RoadID íàâåðíîå òî æå ñàìîå

20 ??? 0xfffff. ? ??? ??? ?? ??? “???” ?

äà, ñëåäèò
ñîáñòâåííî, âîò ïðîñòåíüêèé “ïåðåíóìåðîâûâàòåëü” :wink:

my $cnode = 1;
my %nodes;

my $croad = 1;
my %roads;

while (<>) {
    s/^RoadID=(\d+)/sprintf "RoadID=%d", reroad($1)/ie;
    s/^Nod(\d+)=(\d+),(\d+),(\d+)/sprintf "Nod$1=$2,%d,$4", renode($3)/ie;

    s/^Nod=(\d+)/sprintf "Nod=%d", renode($1)/ie;
    s/^TraffPoints=(\d+),(\d+),(\d+)/sprintf "TraffPoints=%d,%d,%d", renode($1), renode($2), renode($3)/ie;
    s/^TraffRoads=(\d+),(\d+)/sprintf "TraffRoads=%d,%d", reroad($1), reroad($2)/ie;

    print;
}

sub renode {    
    if (!$nodes{$_[0]})  {  $nodes{$_[0]} = $cnode++;  }
    return $nodes{$_[0]};
}
sub reroad {    
    if (!$roads{$_[0]})  {  $roads{$_[0]} = $croad++;  }
    return $roads{$_[0]};
}