segunda-feira, maio 07, 2012

Mapas Garmin no Navitel para Android

(Nunca mais escrevi nada aqui, pois o OruxMaps está a preparar o suporte à leitura de IMG's, sendo que nesse caso não é necessario utilizar o Navitel. Seja como for, o método aqui descrito funciona ;))

Uma das opções para se visualizar mapas custom Garmin em dispositivos Android é o software Navitel. E digo mapas custom, pois mapas originais NT(ou custom's que utilizem o formato NT) não são possíveis de reverter. Assim para demonstrar a coisa, vou utilizar um segmento do TopoLusitania.
Então para o processo precisam do seguinte software:
-Navitel para Android (utilizei a versão 5.1.0.47)
-GPSMapEdit (v1.1.73.2)
-Ficheiro *.img (usei a 35100011.img do TopoLusitania)
-WinRar

É necessário converter img em nm2, sendo este ultimo o formato lido pelo Navitel. Para isso usamos o GPSMapEdit. Abrimos o programa, vamos a Arquivo>>Abrir e seleccionamos o img que queremos converter. Assim que ele abrir, vamos a Arquivo>>Exportar>>Navitel 3.2.6 nm2, escolhemos a pasta de destino, é feita a conversão e temos o mapa pronto a utilizar no Navitel.
Depois de instalado o Navitel no equipamento, basta colocar esse ficheiro nm2 na pasta NavitelContent\Maps\ e correr o programa e está, terão algo como o que está na imagem à direita. A nível de aparência e legibilidade está bastante agradável.




No entanto, para mapas topográficos, existirá um problema de raiz: as curvas de nível não vêm visíveis, sendo que terão apenas visível a numeração das linhas como na seguinte imagem:






E aqui entra o filme do processo (pelo menos na versão 5.1.0.47). A Navitel utiliza uns skins que alteram as cores dos diferentes tipos de linhas/pontos vectoriais, estilo Typ da Garmin mas muito mais complicado de se trabalhar. Tanto quanto pesquisei (e não foi pouco!) não há editores para estes skins, pelo que todo o trabalho tem de ser feito à mão. Uma solução para quem não queira ter trabalho passa por utilizar o skin feito pelos rapazes da TopoHispania/Elgps, para a versão Navitel 5.0.3.70, e que se encontra aqui. Neste caso terão de usar o Navitel 5.0.3.70, pois o 5.1.0.47 não irá reconhecer esse skin (Não testei este método, nem sei como é este skin).

No meu caso optei por modificar o skin, o que é uma operação manhosa. De origem o programa trás um skin (as imagens acima usam esse skin) chamado Navitel.ns2 no qual eu decidi não mexer pois podia causar o bloqueio do programa (algo que aconteceu bastantes vezes com skins alterados!). Passei na pagina da Navitel onde saquei a skin Glass, sobre a qual iria trabalhar. O formato ns2 consiste num ficheiro zip sem compressão, onde estão várias pastas e ficheiros com as definições visuais. No entanto, descomprimir o ficheiro, editar e voltar a comprimir, faz que altere alguma coisa na estrutura do ficheiro, que depois de voltar a colocar o skin na pasta do equipamento, este bloqueia a aplicação. Então arranjei um método simples de contornar a coisa. Pegando por exemplo o skin sacado da Navitel "Glass_for_Android_v5.1.0.47.rar", é necessário descomprimir este ficheiro. Ficamos depois com o "Glass_for_Android_v5.1.0.47.ns2". Vamos renomear para "Glass_for_Android_v5.1.0.47.ns2.rar", abrir no WinRar e descomprimir tudo para uma pasta. Mantemos aquele ficheiro *.ns2.rar. O que descomprimimos terá este aspecto:
Podem ver nesta estrutura que está dividida em pastas e ficheiros *.dat e *.ttf. As pastas correspondem a resoluções aproximadas, nos aparelhos Android, no formato HEIGHTxWIDTHxBIT DEPTH. Para cada resolução existem duas pastas, uma na vertical e outra na horizontal. Não consegui concluir qual das resoluções seria a certa, no entanto no meu A5 de 800*480 as alterações foram feitas nas pastas 762x442x240 e 442x762x240. Se abrirem uma destas pastas poderão ver uma serie de imagens em formato png e ficheiros day.skin e night.skin. Estes dois ficheiros são o que interessa, tudo o resto é descartável. Existem pastas que têm mais imagens, outras quase não têm imagens, e os ficheiros skin não existem em todas as pastas. Não consegui chegar a uma conclusão desta organização, mas também percebi que não é necessário entender isso, a não ser que seja para criar um skin de raiz (em russo há alguma informação). Assim vamos ao que interessa, escolhemos duma pasta os dois ficheiros day.skin e night.skin. Guardamos esses dois ficheiros noutra localização e podemos apagar toda a pasta que tínhamos descomprimido. (Em vez de descomprimir todo o skin *.ns2.rar, podemos com o winrar percorrer o conteúdo e descomprimir estes dois ficheiros logo de lá). Agora abrimos o ficheiro day.skin com o bloco de notas. Este parece um Typ, onde cada tipo de linha ou icone vectorial têm uma cor, tamanho, formato ou outro atributo definido. Assim basta editar os tipos que nos interessar.



















Ora o que nos faltava ver eram as linhas de contorno das curvas de nível. Estas estão no grupo das "polylines" e são chamadas de "minor land contour", "interm. land contour" e "major land contour", consoante sejam as linhas menos relevantes (ex de 20 em 20 metros) ou as mais relevantes (ex: de 100 em 100 metros). Assim procurem por este texto que define as curvas de nível:
"# Minor land contour
20 0 none 0 none 0 none Font5 B67824 AAFF20 false none
# Interm. land contour
21 0 none 0 none 0 none Font5 B67824 AAFF20 false none
# Major land contour
22 0 none 0 none 0 none Font5 B67824 AAFF20 false none
"

E substituam por:

"# Minor land contour
20 0 dot 1/1m B67824 0 none small B67824 AAFF20 false
# Interm. land contour
21 0 solid 1/1m B67824 0 none small B67824 AAFF20 false
# Major land contour
22 0 solid 2/2m B67824 0 none small B67824 AAFF20 false
"
Salvem o ficheiro.
Esta simples alteração, o que faz é alterar os parâmetros do tipo de polilinha 20/21/22 (Update- curiosamente ou não, respeita a mesma numeração dos Typ da Garmin-Nos typs, as polilinhas 20, 21 e 22 também são curvas de nível!), que passam a ser do tipo dot/solid, com tamanho 1/1m(ou2/2m) e cor hexadecimal B67824. No texto existente as polilinhas 20/21/22 estavam definidas como none, sendo este o motivo pelo qual não apareciam.
Curiosamente no ficheiro night.skin, estas estão definidas, pelo que quando o Navitel utilizar estas definições (à noite????) as curvas de nível deveriam ser visíveis. No entanto confirmem sff.
O texto que está a seguir ao cardinal,  não é interpretado. Assim existe ao longo do ficheiro, indicações sobre os diversos tipos de elementos vectoriais e os parâmetros editáveis. No caso das polilinhas podem encontrar o seguinte texto:
"# "Type begin"  "Type end"
# "Pen 1 style" "Pen 1 width" "Pen 1 color"
# "Pen 2 width" "Pen 2 color"
# "Label font" "Label color" "Label outline color" "Label v-center alignment"
# "Arrow color, for road types" "Scale index, optional"
#
# "Pen 1 width" is the inner width (without borders)
"

Estes são os parâmetros editaveis e a disposição deles para todas as polilinhas. Por exemplo:

"22 0 solid 2/2m B67824 0 none small B67824 AAFF20 false"
equivale a: 
22 = "Type begin"
 0 = "Type end"solid = "Pen 1 style"
2/2m = "Pen 1 width"B67824 = "Pen 1 color"...

E por aí fora. Isto é valido para todo o ficheiro. No inicio também tem indicações importantes. Fica a dica para quem se quiser debater a alterar uns skins ;)

Voltando ao que interessa, editaram e salvaram o ficheiro day.skin com as definições que queriam, agora é necessário voltar a colocá-lo no *.ns2. Para tal vão usar o Winrar e abrir o ficheiro "Glass_for_Android_v5.1.0.47.ns2.rar". Utilizando o explorador do rar vão procurar a ou as pastas com a resolução mais perto da do vosso equipamento (ou podem fazer em todas as pastas) e vão substituir o ficheiro day.skin existente nessa pasta, pelo que salvaram atrás. Entrem na pasta, façam Add File To Archive e escolham o day.skin editado. Depois (E ISTO É MUITO IMPORTANTE!!!!) na janela dos parâmetros do WinRar alterem o Compression Method para Store, confirmem que o Update Mode está em Add and Replace File e dêem OK. Se precisarem de substituir mais day.skin, de outras pastas, repitam o processo. Depois de substituidos os day.skins podem voltar a renomear o ficheiro para "Glass_for_Android_v5.1.0.47.ns2" e colocar na pasta dos skins do Navitel. Depois correm o Navitel, vão a Menu>>Definições>>Interface>>Visual>>Seleccionar Visual e escolhem o "Glass_for_Android_v5.1.0.47.ns2" e façam OK. Se tudo correu bem e foi bem feito deverão ter algo parecido a isto:

Se ao seleccionarem o skin que editaram, no menu do Navitel, este bloquear, provavelmente algo foi mal feito na parte em que usam o WinRar. Voltem a fazer tudo, tendo em atenção em nunca usar compressão, nem descomprimir e voltar a comprimir todo o ficheiro-basta apenas substituir o day.skin nas pastas necessárias.
Podem também haver skins com o problema das visualizações resolvido, pela net. No meu estudo encontrei alguns, mas não para esta versão do Navitel, por isso resolvi perceber como a coisa funcionava.
Quando mudam de skin, os icones de menus, zoom e tudo mais mudam também.

Resumindo a coisa:
Usam o GPSMapEdit para converter um *.img (que não esteja em formato NT) em *.nm2.
Editam um skin *.ns2 que funcione na vossa versão de Navitel, extraindo um ficheiro day.skin, fazendo as alterações necessárias e voltando a colocá-lo no skin *.ns2.

No futuro faço um video da coisa ;-)

Update@08/05 Tinha eu escrito que não existia um editor ns2, mas afinal existe(com algumas falhas lol). Assim já andei a estudar a maneira de trabalhar isto. Na pratica, todos os elementos vectoriais seguem a numeração comum (utilizada no GPSMapedit) como tal é possível criar uma visualização aproximada da dos aparelhos Garmin, utilizando os *.typ's e editando os elementos respectivos no skin para ficarem com as mesmas cores e tamanhos (quando possível!). Infelizmente, isto leva tempos, o programa tem bugs a salvar os ficheiros, algumas modificações bloqueiam o Navitel... Uma infinidade de chatisses. Para testar a coisa fiz três versões, uma delas que bloqueia o Navitel, mas dá para perceber o resultado:




































Do mesmo modo detectei um erro, que presumo ser na conversão para nm2. Algumas das curvas de nível perdem o zero no final, aparecendo apenas 1, 2, 15 quando devia ser 10, 20, 150 por exemplo.
Entretanto se alguém tiver interesse em utilizar o TopoLusitania com o Navitel, façam os autores saber em http://topolusitania.blogspot.pt/2012/05/como-instalar-o-topolusitania-em.html
Assim que tiver mais algumas informações logo posto por aqui.


Update@14/05  Após uma longa serie de try-and-error, penso ter arranjado maneira de resolver o problema dos textos nas curvas de nível. Mas continuo sem perceber exactamente o porquê de acontecer, visto saber que as curvas têm a informação correcta, mesmo no Navitel. Ahh e testei outra versão e acontecia exactamente o mesmo!