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

Версия 0.60
http://gpsmapsearch.com/osm/osm2mp_v060.zip

  • добавлен наконец поиск по улицам (из тега is_in)
  • добавлены опции командной строки
  • добавлен список приоритетных тегов для Label
  • разные мелкие фиксы

liosha, у тебя конкурент появился :slight_smile: http://wiki.openstreetmap.org/wiki/GroundTruth

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

Почему бы Вам не написать Веб интерфейс к скрипту? Я чтобы его запустить загрузил на сервер, так как искать, устанавливать, допольнительные Perl модули под Windows во первых достаточно долго, во вторых совершенно недоступно для “чайника”
Ведь там нет ничего сложного: написать форму и выплянуть нужный “header”
Я бы сам написал, только совершенно подзабыл Perl, больше в последние годы PHP пользую.

Странный вопрос… Кому интересно будет, тот напишет. Я в этом смысла не вижу.

Дополнительные модули под виндой ставятся без проблем через Perl\bin\ppm.bat

Версия 0.65
http://gpsmapsearch.com/osm/osm2mp_v065.zip

вроде бы работает достаточно стабильно

  • добавлена обрезка по прямоугольнику
  • добавлена адресация POI
  • полностью переделана обработка запретов
  • ну и по мелочи…

начал делать обработку береговой линии
с Онежским озером уже справляется :sunglasses:
http://gpsmapsearch.com/osm/mp/karelia.rar

??? ??? ??? ??? ??? is_in ??.
??? ??? ? ??? ??? (r49) ?? svn:

diff -uN old/is_in.cfg new/is_in.cfg
--- old/is_in.cfg    1970-01-01 03:00:00.000000000 +0300
+++ new/is_in.cfg    2009-03-11 20:08:17.000000000 +0300
@@ -0,0 +1,20 @@
+# name                           country       region                      city         append
+
+Altai& #20;Krai,& #20;Russia         ??????        ?????????& #20;????
+Russia,& #20;Altai& #20;Krai         ??????        ?????????& #20;????
+Altai& #20;Republic,& #20;Russia     ??????        ??????????& #20;?????
+Amur& Oblast,& #20;Russia        ??????        ????????& #20;???????
+Archangelsk& #20;oblast,Russia ??????        ?????????????& #20;???????
+Archangelsk& #20;Oblast,Russia ??????        ?????????????& #20;???????
+Archangelsk& #20;Russia             ??????        ?????????????& #20;???????    ???????????
+Astrakhan& #20;Oblast,& #20;Russia   ??????        ????????????& #20;???????
+Russia,& #20;Astrakhan& #20;Oblast   ??????        ????????????& #20;???????
+Belgorod& #20;Oblast,& #20;Russia    ??????        ????????????& #20;???????
+
+Moscow& #20;Oblast,& #20;Russia      ??????        ??????????& #20;???????
+Moscow,,Russia                     ??????        ??????                     ??????
+??????                             ??????        ??????                     ??????
+??????,& #20;Russia                 ??????        ??????                     ??????
+??????,& #20;??????                 ??????        ??????                     ??????
+??????????& #20;???.                ??????        ??????????& #20;???????
+??????????& #20;???????             ??????        ??????????& #20;???????
diff -uN old/osm2mp.pl new/osm2mp.pl
--- old/osm2mp.pl    2009-03-11 20:09:43.000000000 +0300
+++ new/osm2mp.pl    2009-03-11 20:40:24.000000000 +0300
@@ -20,6 +20,7 @@
 my $cfgpoi      = "poi.cfg";
 my $cfgpoly     = "poly.cfg";
 my $cfgheader   = "header.tpl";
+my $cfgisin     = "is_in.cfg";
 
 
 my $codepage    = "1251";
@@ -72,6 +73,7 @@
                         "cfgpoi=s"              => \$cfgpoi,
                         "cfgpoly=s"             => \$cfgpoly,
                         "header=s"              => \$cfgheader,
+                        "cfgisin=s"             => \$cfgisin,
                         "mapid=s"               => \$mapid,
                         "mapname=s"             => \$mapname,
                         "codepage=s"            => \$codepage,
@@ -122,6 +124,7 @@
     --cfgpoi <file>           poi config        [$cfgpoi]
     --cfgpoly <file>          way config        [$cfgpoly]
     --header <file>           header template   [$cfgheader]
+    --cfgisin <file>          is_in config      [$cfgisin]
 
     --bbox <bbox>             comma-separated minlon,minlat,maxlon,maxlat
     --osmbbox                 use bounds from .osm              [$onoff[$osmbbox]]
@@ -174,6 +177,17 @@
 }
 close CFG;
 
+my %isinmap;
+open CFG, $cfgisin;
+while (<CFG>) {
+   if ( (!$_) || /^\s*[\#\;]/ ) { next; }
+   chomp;
+   my ($n, $cntr, $reg, $city, $append) = split /\s+/;
+
+   $isinmap{convert_string($n)} = [ convert_string($cntr), convert_string($reg), convert_string($city), convert_string($append) ];
+}
+
+
 
 my %polytype;
 
@@ -284,9 +298,16 @@
       $poiphone     = convert_string($2)        if ($1 eq "phone" );
 
       if ($1 eq "is_in") {
-          ($poicity, my $region, my $country) = split (/,/, convert_string($2));
-          $poiregion  = $region         if ($region);
-          $poicountry = $country        if ($country);
+          if(defined($isinmap{$2})){
+            $poicity=$isinmap{$2}[2]                 if (("$poicity" eq "")&&($isinmap{$2}[2] ne "")) ;
+            $poiregion=$isinmap{$2}[1]               if (("$poiregion" eq "")&&($isinmap{$2}[1] ne "")) ;
+            $poicountry=$isinmap{$2}[1]              if (("$poicountry" eq "")&&($isinmap{$2}[0] ne "")) ;
+            $poistreet="$poistreet $isinmap{$2}[1]"  if (("$poistreet" ne "")&&($isinmap{$2}[3] ne ""));
+          }else{
+            ($poicity, my $region, my $country) = split (/\s*,\s*/, convert_string($2));
+            $poiregion  = $region         if ($region);
+            $poicountry = $country        if ($country);
+          }
       }
       next;
    }
@@ -1124,11 +1145,27 @@
     print  "[POLYLINE]\n";
     printf "Type=%s\n",        $type[1];
     printf "EndLevel=%d\n",    $type[4]             if ($type[4] > $type[3]);
-    print  "Label=$name\n"                          if ($name);
+#-    print  "Label=$name\n"                          if ($name);
     print  "DirIndicator=1\n"                       if ((split /\,/, $rp)[2]);
 
-    print  "; is_in = $risin{$road}\n"  if ($risin{$road});
-    my ($city, $region, $country) = split (/,/, $risin{$road});
+#-    print  "; is_in = $risin{$road}\n"  if ($risin{$road});
+    my ($city, $region, $country) = split (/\s*,\s*/, $risin{$road});
+    if ($risin{$road}){
+        print  "; is_in = $risin{$road}\n";
+        if(defined($isinmap{$risin{$road}})){
+            ($country, $region, $city) = ($isinmap{$risin{$road}}[0], $isinmap{$risin{$road}}[1], $isinmap{$risin{$road}}[2]);
+                print  ";  mapped to = $city, $region, $country\n";
+            if($isinmap{$risin{$road}}[3] ne ""){
+                print  ";  name changed from \"$name\" to \"$name $risin{$road}}[3]\" \n";
+                $name = "$name $risin{$road}}[3]";
+            }
+        #}else{
+        #    my ($city, $region, $country) = split (/,/, $risin{$road});
+        }
+    }
+
+
+    print  "Label=$name\n"                          if ($name);
 
     printf "CityName=%s\n", $city ? $city : $defaultcity;
     print  "RegionName=$region\n"       if ($region);
@@ -1254,6 +1291,7 @@
    $str =~ s/\&#47\;/\//gi;
    $str =~ s/\&#92\;/\\/gi;
    $str =~ s/\&#13\;/-/gi;
+   $str =~ s/\&#20\;/ /gi;
 
    $str =~ s/\&#\d+\;/_/gi;

??? ? ??? is_in.cfg (??? ??? ??? ? utf-8, ??? ??? ??? ??? ? ??? ??? ???) ??? ??? ??? is_in ? ?? ??? (???, ???, ???, ??? ? ??? ???)
??? ? ???-?? ?? ??? ??? ??? - ?? ?? ??? ??? “& #20;” (??? ??? & ? #20; ??? ? ? ??? ??? ???.. ??? ? ?? ??? ?? ??? ??? ??? ??? :frowning:) ??? ???-?? ??? ???, ?? ??? ? ?? ??? ???. ??? ??? ??? ??? ??? ??? ???:

??? ???., ?. ???, ?? ???
??? ???., ?. ???, ???. ???, ?? ???
??? ???., ?. ???, ???. ???, ?? ???
??? ???., ?. ???, ???. ???, ?? ???

???, ??? ?? ??? ??? ? OSM? (??? ??? ??? ??? ??? ??? …)

P.S. ? ??? ?? ??? ??? ??? ??? ??? is_in, ??? ??? ??? ?? ? ??? ???.

— ??? ?? 12.03.2009 20:15 (MSK)
??? ? ??? ??? ???

+            ($poicity, my $region, my $country) = split (/\s+,\s+/, convert_string($2));

??

+            ($poicity, my $region, my $country) = split (/\s*,\s*/, convert_string($2));

??? ??? ??? ??-?? ??? ??? ??? is_in ??? POI.

Приветствую!
пара наблюдений/вопросов:

  1. На карте Карелии водоемы, прорисованные в osm как coastline, в mp - дублированы: полигон 0x3c aka “large lake”, на который наложены куски полилинии 0x15 aka “shoreline of water body”. Это так задумано, это фича или это баг?
  2. Мелкие озера, которые в osm помечены как water, рисуются как 0x46 aka “large river”. Вопрос тот же :slight_smile:
  3. На googl’e в репозитории актуальная версия? Неокортекс все чешется порезать полигоны границами карты, да руки не доходят :roll_eyes:
    С уважением!

Южной или восточной ? 8)

ИМХО это баг.

Эээ, я все собираюсь правильно перезалить границу ЛО, но никак не могу ее найти в своих архивах.

Ээээ? Той, что на gpsmapsearch. Онежское, например.

Автора! Автора! :slight_smile:

По п.3 - разобрался, что актуальный. Зато появился п. 4:
В описании на первой странице обсуждения не хватает упоминания о модулях Math/Polygon и Text/Unicode,

что-то меня гложут смутные сомнения насчёт необходимости такой таблицы…
кто её вести будет? для какой территории?
да и вообще нормально адресацию через is_in в таком виде вряд ли получится построить, слишком уж нестрогая это штука. пока что это сделано чисто как заглушка.
хотя сейчас разбор там конечно неправильный.
имхо, надо разделить is_in на части по запятым, а тым уже в зависимости от количества полученных частей выбирать:
1 - город
2 - город, страна
3 - город, регион, страна
4 - ???

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

когда это прописывалось, реки были прорисованы как natural=water, riverbank ещё не было :slight_smile:
сменю на 0x3f

вроде бы они там уже режутся (хоть и не совсем правильно)
для нормальной резки надо GPC цеплять, но что-то всё никак с ней не разберусь

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

  1. Через is_in (очень коряво, негибко)
  2. Через релейшены (практически невозможно редактировать вручную, т.к. будут ссылки на другие релейшены, чего редакторы не поддерживают. Cladr2OSM скоро научится это делать).
  3. Через addr:street, addr:city, addr:country и т.п. Просто прописывать, просто разбирать, легко править. Но будет очень много тегов в домах, улицах и т.п.

Может, таблица (особенно в таком виде) и не лучшее решение, но у is_in (как он описан http://wiki.openstreetmap.org/wiki/Key:is_in)) куча недостатков, хотя бы частично решаемых таблицей.

  1. Хочется чтобы для “Sochi, Krasnodar Krai, Russia” не создавалось страны Russia (В дополнение к “Россия”, которую кто-нибудь задаст через “is_in:ru”). Да и “Сочи”, было бы как-то привычнее.
  2. Города вроде “Томская область Tomsk”, “Україна”, “48210”, “Blagoevgrad province”, “California”,“Europe” кажутся лишними, как впрочем и государство “EU”.

Вести таблицу имеет смысл не глобальную, а только для территории, обрабатываемой при данном запуске (и скорее всего стоит отрубить использование этой таблицы по умолчанию).
Конечно, таблица в данном виде - это крайне примитивно (например имело бы смысл вести разбор покомпонентно…), но даже так в дампе России я насчитал 354 уникальных строчек содержащих k=“is_in”, что вполне можно за вечер-другой обработать, кроме того несложно написать программку (а точнее обрезать osm2mp.pl), чтобы она генерила список невнесенных в табличку строк по дампу (чтобы отслеживать новые).

Ну и, конечно, следовало бы разбирать is_in, is_in:city, addr:* сразу же и хранить с объектом отдельные компоненты.

P.S. Ну а насчет того чтобы резать не по запятым, а по \s,\s**, надеюсь, возражений нет? А то появляются " Россия" " RU" и т.д.

Кроме того и слишком много вольностей: можно писать в произвольном порядке, писать можно/нужно(?) международные названия(латиницей), можно писать вперемежку адресные данные, релейшены и категории.

Еще один недостаток - что потребует или держать до последнего данные (в том числе и POI) в памяти или потребует двух проходов.

Согласно http://wiki.openstreetmap.org/wiki/Address addr:* к улицам не применяется :frowning:
зато можно использовать и .т.п.is_in:country);

с этим согласен, сделаю

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

Алексей,

в последних релизах russian_federation некоторые IMG с ошибкой. Например если включить их в mapset, то mapsource выдаёт ошибку в самом начале построения mapset:

MDR_TRIM_ADDR.CXX 346

Приходится из карты России исключать следующие квадраты: тот где Ухта и тот где Омск. Прошу прощения за сумбур, но как их правильно сопоставить с файлами не знаю. После этого mapsource строит mapset.

Если попробовать взять все *.IMG из релиза и инсталлировать с помощью mapsettoolkit.exe, то cgpsmapper выдаёт ошибку на файлах 63240009.IMG, 63240008.IMG, 63240006.IMG. Ошибка:

Error: Access violation at 0x004B0D27 (tried read from 0x00000028), program terminated.

Прошу прощения что багрепорт не очень информативен, но с инструментами для работы с этим чёрным ящиком garmin я не на ты. :frowning:

Да, я знаю, это глюк маппера - он не справляется с построением адресного индекса.
Исправить можно, удалив из реестра ссылку на Mdr.
Поиск отключится, но зато будет грузиться прибор.

Спасибо, помогло! А какой поиск отключился?

С адресами действительно проблема. Вчера искал в Москве улицу Белобородова. А она нашлась в Иркутске на который ругались что он прорисован нелегальными данными. Данные данными, а вот посмотреть как там сделана нумерация и присвоение тэгов улиц надо! По всей России в навигаторе (GPSMap 60CSx) поиск можно осуществлять только по ним.

Немного оффтоп:
буквально вчера скачал russian_federation. распаковал в c:\garmin\russian_federation. Запустил install.bat. Mapsource всё увидел.
А в навигатор заливаю программой img2gps (http://www.img2gps.co.cc/img2gps_281_setup.exe) для её работы нужен sendmap20 (http://cgpsmapper.com/download/sendmap20.zip) файлы должны лежать в одной папке.
Тупо запустил img2gps, выбрал Load Folder, зашел в c:\garmin\russian_federation нажал “Открыть”, затем Select all.
Затем Upload to GPS. И всё наслаждаемся Россией в навигаторе.
С поиском городов без проблем, а вот с улицами пока беда.