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

дело ещё в том, что для гармина такая адресация бесполезна: там нет индексации зданий
там индексируются только участки улиц
а как я уже говорил, я ориентируюсь именно на гармин, я не использую навител/руссы/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]};
}

Ok, ???. ? ??? ? ??? ??? ?? ???, ? ??? ?? ?? ??? ??? ?? ???, ? ??? ??? ? ?? ??? :wink:

Ещё один пример, как НЕ НАДО рисовать карты :confused:

Иркутск:

В список для ежедневной сборки добавлены Псков и Карелия
http://gpsmapsearch.com/osm/mp

скоро будет индексация улиц :sunglasses:
как выяснилось, ничего особо сложного там нет
используется схема
is_in=City,Region,Country
is_in=City,Country
is_in=City

единственная проблема - города, которые есть в is_in, но нет на самой карте, придётся как-то добавлять

Теперь сконвертированные карты выкладываются и адресным поиском.
Глюки есть, но пока сложно сказать, кто виноват: конвертер или маппер.
http://gpsmapsearch.com/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:
    С уважением!