Conversión de Open Street Maps a IMG para Garmin

De GPS Navegación
Revisión del 16:24 15 mar 2024 de Harpo (discusión | contribs.)
(difs.) ← Revisión anterior | Revisión actual (difs.) | Revisión siguiente → (difs.)

OSM y los mapas para Garmin

Open Street Map es un proyecto colaborativo, un mapa del mundo creado por los propios usuarios. Los datos del mapa son públicos, y está permitido usarlos para crear mapas derivados.

Los navegadores Garmin trabajan con un formato propio de mapas, aquí trabajaremos con el formato IMG.

En el formato de Garmin, existen una série de conceptos (caminos, carreteras, rios..) que se no se corresponden exactamente con los conceptos que usa Open Street Map.

Hacer la conversión de OSM a IMG pues, no es una "traducción directa", hay una cierta adaptación y personalización:

  • Hasta qué nivel de detalle queremos el mapa? Los senderos para ir a pie deben aparecer?
  • Las líneas eléctricas?
  • Los límites administrativos?
  • Las curbas de nivel?
  • Los topónimos aparecen? Todos, o sólo los más importantes?
  • El mapa es ruteable?

Ésta adaptación necesaria es el motivo por el que mapas en formato IMG, todos derivados de OSM, y por tanto de los mismos datos, no son exactamente iguales, e incluso pueden ser adecuados para ciertos navegadores o programas, y no para otros.

Aquí vamos a explicar como hacer tu propia conversión de OSM a IMG, utilizando herramientas libres, y como personalizar ésta conversión.

Velando armas: Software que necesitas

El Software que vamos a usar para hacer la conversión es Mkgmap

Durante toda la guía trabajaremos en un directorio, y vamos a ir poniendo todas las herramientas y ficheros dentro. Yo lo llamaré /maps.

Necesitamos descargar:

  • Java, la última versión debería funcionar sin problema
  • Mkgmap, descargado de su página web
    • mkgmap-rxxxxx.zip, donde xxxx es el número de versión
    • Lo descomprimimos en /maps/mkgmap
  • Splitter, descargado de su página web
    • splitter-rxxxxx.zip, donde xxxx es el número de versión
    • Lo descomprimimos en /maps/splitter
  • Creamos un directorio vacío /maps/input
  • Los límites administrativos (bounds-latest.zip), descargados de la web de mkgmap
    • Lo descomprimimos en /maps/input/bounds
  • Los límites marinos (sea-latest.zip), descargados de la web de mkgmap
    • Lo descomprimimos en /maps/input/sea
  • Creamos un directorio vacío /maps/styles
  • Copiamos el estilo por defecto (el directorio entero), de /maps/mkgmap/examples/styles/default a /maps/styles/default
  • Creamos un directorio vacío /maps/work

El mapa a convertir

Descargaremos el mapa del país o países que queramos convertir, de la web de Geofabrik.

Los ficheros que necesitamos son en formato osm.pbf

Ojo, que aunque en Geofabrik dan la opción de descargar un fichero gigante con todo un continente, no es buena idea meter en el navegador un sólo mapa IMG tan grande, hay que hacerlo por países, o regiones más pequeñas.

En ésta guía, como ejemplo, vamos a suponer que hemos descargado spain-latest.osm.pbf

El estilo

Los estilos son un "paquete de configuraciones" que le indica a mkgmap como personalizar la conversión. Hay un estilo por defecto, y quizás sea buena idea hacer tu primera conversión con el estilo por defecto, empezando a modificarlo sólo una vez ya domines la conversión básica. Si no quieres personalizar el estilo, puedes saltar ésta sección.

Vamos a crear una copia del estilo por defecto, y luego empezaremos a modificarlo. En ésta guía vamos a llamar a nuestro estilo "miestilo". Ponle un nombre que tenga sentido para lo que vayas a usar el mapa.

  • Copiamos el estilo por defecto (el directorio entero), de /maps/mkgmap/examples/styles/default a /maps/styles/miestilo

Editamos el fichero /maps/styles/miestilo/info

  • Cambiamos la línea "summary" y ponemos ahí el nombre de nuestro estilo
  • Cambiamos el campo "description" y ponemos ahí una descripción, o simplemente otra vez el nombre

Editamos el fichero /maps/styles/miestilo/lines

  • Éste es el fichero que le indica cómo convertir todos los conceptos que traducen a "líneas". Es donde está la parte más interesante de la conversión.
  • Cuando ésta guía habla de "comentar" una línea, se refiere a añadir un "#" al principio de la línea. Ésto hará que el programa ignore la línea, como si no estuviera.
  • En general, las líneas de éste fichero tienen el formato:
    • [concepto_osm] = [concepto garmin]
    • Sobretodo fijarnos en el código hexadecimal (0x01 por ejemplo), que es lo que el GPS realmente va a leer para mostrar los objetos
  • Una descripción exhaustiva de lo que hace cada parámetro está fuera del objetivo de ésta guía, en la página de documentación de mkgmap hay una guía en PDF que explica en detalle cada uno de los parámetros.
  • Explicaremos algunos de los parámetros que habitualmente nos interesará cambiar
  • Si queremos ocultar las líneas eléctricas, comentamos la línea 232: "power=line [0x29 resolution 21]"
  • Si queremos ocultar los límites administrativos, comentamos las líneas 244 a 251, las que empiezan por "boundary="
  • Si queremos ocultar las líneas de ferry, comentamos las líneas 255 a 258, las que empiezan por "route=ferry"
  • Un tema importante es que no todos los navegadores y programas que abren mapas en IMG los muestran de la misma manera. Tendrás que hacer un poco de prueba y error para ver cómo se muestran en tu equipo o en tu software.
  • A modo de ejemplo, aquí va la tabla que me hice yo a prueba y error de cómo se muestran los objetos en mi Tread:
Nombre Código hexa Como se muestra en el Tread
Mega autopista 0x01 Naranja, muy grueso
Super autopista 0x02 Naranja, grueso
Autopista 0x03 Naranja, medio
Carretera arterial gruesa 0x04 Verde oscuro
Carretera arterial media 0x05 Verde oscuro
Residencial 0x06 Gris normal
Callejón 0x07 Gris fino
? 0x10 Gris
Carretera sin asfaltar 0x0a Gris
Camino 0x0f Gris
Sendero 0x16 Invisible

Splitter

El siguiente paso es generar, a partir del mapa en un sólo fichero que nos hemos descargado de Geofabrik, los ficheros de trabajo que necesita gmap. En el fondo estamos "partiendo" el mapa en muchos trocitos pequeños.

Aquí entra por primera vez un parámetro nuevo, que es el Map ID.

El Map ID tiene que ser un número entero, Garmin los usa de 8 dígitos. Realmente no importa qué numero exacto sea, pero tiene que ser único para cada mapa instalado en un mismo equipo. Puedes usar ésta herramienta para leer el MapID de otros maps que tengas, y asegurarte que no hay colisiones.

En el ejemplo voy a usar el MapID 63260010

Vamos a guardar los ficheros de trabajo en el directorio /maps/work, asumiendo que está vacío. Tienes que borrar todo el contenido de éste directorio cada vez que cambies de mapa.

Creamos un directorio vacío /maps/work/processed_map

Vamos a lanzar los comandos desde el directorio /maps

He puesto los parámetros en líneas separadas para que se lean mejor, pero deben ir uno detrás del otro, sin saltos de línea.

java -Xms8g -Xmx16g -jar ./splitter/splitter.jar \
    ./input/spain-latest.osm.pbf \
    --output-dir=./work/processed_map \
    --mapid=63260010

Mkgmap

El paso final es hacer la generación del mapa con mkgmap

Creamos un directorio vacío /maps/work/mimapa

Aquí aparece el parámetro del nombre, al que he puesto "mi_mapa" en el ejemplo. Éste es el nombre que sale en el GPS en la lista de mapas para seleccionar.

java -Xms8g -Xmx16g -jar ./mkgmap/mkgmap.jar \
    --style-file=./styles \
    --style=miestilo \
    --route \
    --index \
    --split-name-index \
    --housenumbers \
    --add-pois-to-areas \
    --improve-overview \
    --bounds=./input/bounds \
    --precomp-sea=./input/sea \
    --generate-sea \
    --output-dir=./work/mimapa \
    --family-name=mi_mapa \
    --description=mi_mapa \
    --country-name=Spain \
    --country-abbr=ES \
    -c ./work/processed_map/template.args \
    --gmapsupp

Listo, ésto debería generar el archivo final en /maps/work/gmapsupp.img

Cámbiale el nombre a uno que reconozcas, y cópialo al GPS, o al programa en el que quieras usar el mapa.

Automatizar el proceso

También he hecho un script para automatizar el prceso y hacer menos engorroso ir actualizando mis mapas.

Los puedes encontrar en ésta página de gihub.