Конвертация OSM в Navitel

не игнорируют, не добраться пока. Дело минутное, знаю, но… Еще и ноут сдох :frowning:

Fortress: На сайте Geopainting вроде написано, что платить можно и с WM, и с Яндекс. Или как везде в России? На заборе написано одно, а за забором совсем другое? ;).
Подождем.

П.С. Пока писал ответ, оригинал куда-то делся.

Вообще не туда написал :frowning:

переместили в тему “скидываемся”

Господа, не подскажите к кому обратиться, чтобы тут http://navitel.osm.rambler.ru/countries.php запустили сборку бывших союзных республик Центральной Азии (Казахстан, Киргизию, Таджикистан). Пока присутствует только Узбекистан. Спасибо !

И Эстонию, пожалуйста, а то она совсем древняя (06.02.2011)

Планирую. Все сразу не получается, дел много. Эстония запущена.
add: лицензия куплена. сегодня-завтра прикручу.

Задумано. Крупные города (place=city) видны на всех уровнях с Level0 по Level4, но на обзорном уровне (Level4) они выводятся более мелкими. На самом деле конвертация городов ровно та же, что и в Garmin, чтобы не было правок под навигатор.
UPD: Немного подчистил POI (объединены варианты тегов OSM, конвертируемые в одни и те же типы НН).
(At revision: 111)

Не знаю с чем связано такое количество ошибок, но 10Mb html на Ленинградскую область - это как-то слишком.
У меня на этом не то, что браузер - AkelPad тормозит.

Upd: Также проблемы с кодировками - шапка в UTF8, заголовки в ANSI
После решения этой проблемы становится видно, что 90% ошибок это “Внутренние части полигонов перекрываются”

Думаю, что уже нужно 2 колонки с ошибками - 1. критические для конвертирования (Дублирующиеся узлы) 2. не критические (всё остальное)

“Всего ошибок: 16805” на 7,36М - кто БОЛЬШЕ??? (Мурманская). Можно недельки 2-3(а то и больше) “свежей” карты не ждать. У меня мало времени всю эту кашу править, да и знаний маловато.

Видимо, что-то случилось… :frowning:
Интересно, это бага конвертера или вандализм в OSM?

Это фича :slight_smile:
Это полный список ошибок, которые лицензионный GPSMapedit находит при экспорте в nm2. В основном это предупреждения (например, полигон домика внутри полигона жилого массива, что потенциально ведет к неотрисовке домика в навигаторе), но есть и близкие к критическим ошибки типа слишком близких узлов.
Наверное, надо просить уважаемого автора GPSMapedit регулировать уровень критичности выводимых ошибок…

Fortress,
предлагаю оставить только “+4 - Find misaligned/duplicated nodes”, чтобы остались только критические ошибки (как у меня было). Т.е. в скрипте найти где задается

DetailedVerify = 268435456+4
В общем, я немного попилил chilin’овский скрипт, когда налаживал конвертацию
всё тоже самое, только в html вываливаются лишь критические ошики:


'mp2nm2.vbs
'Based on open source code published by (c) Konstantin Galichsky, http://www.geopainting.com
'
'Developers: 
'    Konstantin Galichsky (kg@geopainting.com)
'    Chilin (chilin dog rambler dot ru)
'
'This script uses GPSMapEdit to verify and convert map to NM2 format.
'Save report as HTML file for OpenStreetMap project.
'
'Usage: mp2nm2.vbs [-noVerify/-onlyVerify] <file.mp>
'    Without Key - verify & convert map
'    -noVerify   - only convert to NM2
'    -onlyVerify - only verify map
'
Option Explicit
Dim WS,fso,log, logPath
Set fso = CreateObject ("Scripting.FileSystemObject")
Set WS  = WScript.CreateObject("WScript.Shell")
 
logPath = fso.GetAbsolutePathName(WScript.ScriptFullName + "\..\") +"\"+ fso.GetBaseName(WScript.ScriptName)+".log"
if fso.FileExists(logPath) then
    set log = fso.OpenTextFile(logPath,8)
else
    Set log = fso.CreateTextFile (logPath)
end if
 
call LogMsg("Starting script "&WScript.ScriptName)
 
dim mapName,scrKey
Select Case WScript.Arguments.Count
    Case 1
        scrKey = ""
        mpName = WScript.Arguments(0)
    Case 2
        scrKey = UCase( WScript.Arguments(0))
        mpName = WScript.Arguments(1)
        if not (scrKey = "-NOVERIFY" or scrKey = "-ONLYVERIFY") then
            call ErrMSG("Script called with wrong parameter. Use key: ''-noVerify'' or ''-onlyVerify''")
        end if
    Case else
        call ErrMSG("Script called without the required parameter. Please, use: "&WScript.ScriptName&" [-noVerify/-onlyVerify] <file.mp>")
End Select
 
Dim mapPath,mpName,mapFolder
mapFolder = fso.GetAbsolutePathName (mpName + "\..\") + "\"
mapPath   = fso.GetAbsolutePathName(mpName)
mapName   = LCase (fso.GetBaseName (mapPath))
 
if not fso.FileExists(mapPath) Then
    call ErrMSG("File ''"&mpName&"'' does't exist")
end if
 
'Check type of verify
'    536870911 - Check all error
'    268435456+... - Detailed verify 
'    +1  - Check polygons for self-interselection
'    +2  - Check routable polylines for self-interselection in nodes
'    +4  - Find misaligned/duplicated nodes
'    +8  - Check polygons for overlapping
'    +16 - Find to close nodes
'    +32 - Check routable roads roundabouts for way-1 
'    +64 - Not used (reserved) 
'    +128 - Check Road DeadEnds
'Warning - +4 is critical error for nm2 format
Const CriticalError = "Duplicated nodes"
Dim DetailedVerify, tmpNavitel
DetailedVerify = 268435456+4
 
'Connect to GPSMapEdit
On Error Resume Next
Err.Clear
Dim GME,GMEVersion
Set GME = CreateObject ("GPSMapEdit.Application.1")
 
'Check connect and check version of GPSMapEdit
GMEVersion = GME.Version
if err.number <> 0 then
    GME.Exit
    call ErrMSG("Internal error: "&err.number&" - "&err.description)
end if
On Error GoTo 0
If GMEVersion < "1.0.61.4" Then
    GME.Exit
    call ErrMSG("Obsolete version of GPSMapEdit is used. Current version: "&GMEVersion&", please upgrade to 1.0.61.4 or higher.")
End If
GME.MinimizeWindow
 
'Open map in GPSMapEdit
GME.Open mapPath, False
 
    tmpNavitel = -1
if scrKey <> "-NOVERIFY" then
    'Connect to GPSMapEdit.IEdit /only registered version GPSMapEdit/
    Dim pEdit
    Set pEdit = GME.Edit
    If pEdit Is Nothing Then
        GME.Exit
        call ErrMSG("IEdit may be used only registered version GPSMapEdit")
    End If
 
    'Verifing Map
    lReportLines = pEdit.VerifyMap (DetailedVerify, strReport)
    call LogMsg("Verified file "&mapPath &" - "& lReportLines & " errors.")
    'Spliting report lines into array
    dimReport = Split(strReport,vbCrLf)
 
    Dim lReportLines,nReportLines,strReport,dimReport,dicReport
    Dim strLine,strCoo,GMEErr,nGMEErr,nPoint,dPoint,arrGMEe()
    Set dicReport  = CreateObject("Scripting.Dictionary")
 
    'Parsing report lines
    ReDim arrGMEe(1)
    nGMEErr    = 0
    nPoint     = 0
    dPoint     = 0
    If lReportLines > 0 Then
        for nReportLines = 1 to lReportLines
            strLine = dimReport(nReportLines)
            strCoo = "lat="+Split(strLine,",")(0)+"&lon="+Split(strLine,",")(1) +"&mlat="+Split(strLine,",")(0)+"&mlon="+Split(strLine,",")(1)
            GMEErr = MID(Split(strLine,",")(3),2,Len(Split(strLine,",")(3))-2)
            If Not dicReport.Exists(strCoo) Then
                dicReport.Add strCoo,GMEErr
                nPoint = nPoint + 1
            else
                if GMEErr = CriticalError then
                    dicReport.Item(strCoo) = CriticalError
                end if
                dPoint = dPoint + 1
            End If
            if IsInDim(arrGMEe,GMEErr) = -1 Then
                arrGMEe(nGMEErr) = GMEErr
                nGMEErr = nGMEErr + 1
                ReDim Preserve arrGMEe(nGMEErr)
            End if
        Next
        call LogMsg("Parsing complited. Error lines: "&lReportLines&". Types of error: "&nGMEErr&". Real error point: "&nPoint&". Double error point: "&dPoint)
        'Up critical error in array
        tmpNavitel = IsInDim(arrGMEe,CriticalError)
        if  tmpNavitel > -1 then
            arrGMEe(tmpNavitel) = arrGMEe(0)
            arrGMEe(0) = CriticalError
            call LogMsg(".nm2 does't exported. See html File.")
        end if
    End If
End if
 
'Export to nm2
if scrKey ="-NOVERIFY" or scrKey = "" then
    if tmpNavitel = -1 then
        dim nm2Path
        nm2Path = mapFolder+mapName+".nm2" 
        On Error Resume Next
        Err.Clear
        GME.SaveAs nm2Path, "navitel-nm2"
        On Error GoTo 0
        if fso.FileExists(nm2Path) then
            call LogMsg("Exported file: "&nm2Path)
        else
            call LogMsg("File: "&nm2Path&" does't exported. Use VerifyMap.")
        end if
    End If
End if
GME.Exit
 
if scrKey <> "-NOVERIFY" then
    'Export to HTML
    if nPoint <> 0 then
    Dim fHtml,nErr,aErr, i1,i2,htmlPath
    htmlPath  = mapFolder+mapName+"-osm-err.html"
    Set fHtml = fso.CreateTextFile(htmlPath, true)
 
    fHtml.WriteLine strConv("<body><head><meta http-equiv='Content-Type' content='text/html;charset=UTF-8'/><title>"&mapName&": Картографические ошибки</title></head><CENTER><h2>Протокол проверки данных OpenStreetMap</h2></CENTER>","windows-1251","utf-8")
 
        fHtml.WriteLine strConv("Ниже, перечислены ссылки на критические картографические ошибки, обнаруженные при конвертации данных OpenStreetMap в формат Навител (.nm2).<br>Вы можете помочь проекту исправив их.<br>Нажатие на букву P рядом с номером ошибки загружает онлайновый редактор Potlatch 2 с местом ошибки.","windows-1251","utf-8")
 
    if tmpNavitel <> -1 then
        fHtml.WriteLine strConv("<p><b>Обратите внимание!</b> При наличии этих ошибок автоматическая конвертация невозможна. Таким образом, если Вы обнаружите, что область на главной странице не обновляется - исправьте  эти ошибки, и в следующий раз актуальная карта станет доступна для загрузки.</p>","windows-1251","utf-8")
    end if
    fHtml.WriteLine "<div align='center'><table width='100%' border=1 cellspacing=0 cellpadding=0 align=center>"
    if dicReport.Count > 0 then
        aErr = 0
        for i1 = 0 to UBound(arrGMEe)-1
            NErr = 0
            For Each i2 In dicReport
                if arrGMEe(i1) = dicReport.Item(i2) then
                    if arrGMEe(i1) = CriticalError then
                        NErr = NErr + 1
                        if NErr = 1 then
                            fHtml.WriteLine "<tr><th><p style='background:#FA8072'>"&strConv(arrGMEe(i1),"windows-1251","utf-8")&"</p></th></tr><tr><td>"
                        end if
                        fHtml.WriteLine "<a href=http://osm.org/?" & i2 & "&zoom=18 target='_blank'>" & NErr & "</a>(<a href=http://www.openstreetmap.org/edit?" & i2 & "&zoom=18 target='_blank'>P</a>)"
                    end if
                end if
            next
            aErr = aErr+NErr
        next
    end if
    fHtml.WriteLine strConv("</td></tr></table></div>Карта: "&mapName&".mp<br>Последняя проверка: "&Now()&"<br/>Всего критических ошибок: "&aErr&"</br></br><a href='javascript:window.history.back();'>Назад</a></body>","windows-1251","utf-8")
    fHtml.Close
    call LogMsg("Exported file: "&htmlPath)
    end if
End if
 
call LogMsg("End of script.")
log.Close
'WS.Run "%comspec% /c echo " & Chr(7), 0, True
WScript.Quit (0)
 
Function IsInDim(Arr,Var)
    IsInDim = -1
    Dim i
    For i = LBound(Arr) To UBound(Arr)
        if Arr(i) = Var then 
            IsInDim = i
            Exit For
        end if
    next
End Function
 
Sub ErrMSG(Text)
    call LogMsg("Error: "&Text)
    call LogMsg("Script halted")
    WScript.Quit(1)
End Sub
 
Sub LogMsg(Text)
    log.WriteLine now()&": "&Text
End Sub
 
Function StrConv(Text,SourceCharset,DestCharset)
    dim Stream
    Set Stream      = CreateObject("ADODB.Stream")
    Stream.Type     = 2
    Stream.Mode     = 3
    Stream.Open
    Stream.Charset  = DestCharset
    Stream.WriteText Text
    Stream.Position = 0
    Stream.Charset  = SourceCharset
    StrConv         = mid(Stream.ReadText,4)
End Function

Можете сконвертить карту Армении для навител 5? Заранее спс.

Небольшие багфиксы конфигурации:

  • устранено дублирование некоторых полигонов;
  • не присваиваются имена заборам (но остаются у объектов, обнесенных забором);
  • добавлена обработка building=church (в дополнение к amenity=place_of_worship);
  • добавлена обработка мест отдыха, оборудованных мангалами (amenity=bbq);
  • постпроцессор теперь удаляет пустые имена и заметки (Label= и Text=).
    (At revision: 112)

Скопировал я твой скрипт. Что-то у меня теперь вообще странички без ошибок выдаются… И Ленобласть и Московская без ошибок :slight_smile:

Fostress, поправь кодировку на страничке ашыбок. Там UTF вперемешку с 1251.
И прямую сцылку на правку в JOSM-е неплохо бы возродить.

Скрипт явно косячет. Взял для проверки карту Бурятии, которая не обновлялась с 07/июн/2011 13:08 и в самом деле gpsmapedit нашёл 1 критическую ошибку.

Добрый день.

Навител 5.0.0.964. Карты взяты здесь http://navitel.osm.rambler.ru/
Такие наблюдения.Например:
Есть 4 нас.пункта Екатериновка.

  1. Екатериновка, Безенчукский р-н, Самарская обл
  2. Екатериновка, Кинель-Черкасский р-н, Самарская обл
  3. Екатериновка, Красноярский р-н, Самарская обл
  4. Екатериновка, Приволжский р-н, Самарская обл
    В навителе, в поиске города показывает только 1 нас. пункт, у которого наименование района начинается с буквы, которая стоит раньше в алфавите (в данном случае это Екатериновка, Безенчукский р-н, Самарская обл), остальные нас. пункты в поиске отсутствуют. Их можно найти только в мену “Ближайшие”.
    Я пробовал так:
    взял карту в МП, к наименованию нас. пункта дописал Екатериновка (Приволжский р-н) и после конвертации этот нас. пункт появился в поиске.
    И таких нас. пунктов несколько. Только в моем и ближайшем районе это Федоровка, Владимировка и Екатериновка.
    Подскажите плиз как правильно устранить эту ошибку.

Ну, судя по всему, их у вас 5.

Я думаю, проблема в том, что точка и полигон имеют разные теги.
С полигона:

  1. boundary убрать
  2. добавить:
    addr:country = RU
    addr:district = Красноярский район
    addr:region = Самарская область
    Так же и по остальным НП