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

Версия 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. И всё наслаждаемся Россией в навигаторе.
С поиском городов без проблем, а вот с улицами пока беда.

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

тут ещё тонкость: для мапсорса и для приборов эти MDR - разные.
из мапсорсового в приборный умеет делать только сам мапсорс.
из приборного мапсорсовый - никто.
а img2gps и sendmap просто его всегда обрезают, поэтому поиск теряют.

а вот поиск по улицам как раз и находится в MDR.

Ясно, придётся выбирать: или поиск по улицам, или Костромская область :frowning: А автору маппера писали bug report?

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

Выходит если заливать карты простым копированием через card reader, который представляет собой usb mass storage, то поиск по улицам совершенно невозможен, так? Только если мапсорсом прямо в прибор?

И ещё вопрос: russian federation от 16.03 не содержит некоторых изменений, которые я делал явно до 15-го числа. Каким образом импортируются данные osm?

багрепортами его пинают регулярно :slight_smile:

если карта для мапсорса, то прямым копированием поиск теряется.
если же она в формате gmap, то там уже приборный mdr

16.03 - это дата сборки для гармина, обычно для неё использовался дамп недельной давности.
в конкретно этомм случае - за 11 марта

Ну почему же - я например мапсоурсом пишу на флешку (вроде бы есть исправленный MS, который может просто в директорию на HDD писать, но я пока этим не заморачивался), а потом с полученным gmapsupp.img можно делать что угодно, в том числе записать в навигатор.

Интересно. На mkgmap-dev листе вовсю обсуждают экспериментальные патчи для поиска по улицам и тп.
http://www.mkgmap.org.uk/pipermail/mkgmap-dev/2009q1/001347.html