Cómo poner mapas del IGN en Maverick (Android)

Hace pocos días he descubierto una aplicación para Android. Se llama Maverick, y la tienes en su web http://codesector.com/maverick o en el Google Play: lite (gratis) o full (de pago)

Me ha gustado mucho. Te permite usar distintos mapas como fondo del gps. Para andar por la montaña el que más me gusta es el Open Cycle Map que es "hermano" del Open Street Map, mapa callejero libre cada día más popular.
El Open Cycle Map (OCM) tiene no sólo las curvas de nivel, sino también caminos y senderos útiles de excursión por la sierra. Pude ver que había una alternativa interesante en el circo de Peñalara al ajetreado camino de acceso a la laguna.
Tiene puntos muy interesantes. Los mapas se los baja una sola vez, y los guarda en el teléfono. Por tanto, si antes de salir exploras la zona a visitar, no necesitas bajarte los datos cuando estés de excursión. Para ahorrar batería yo pongo el móvil en "modo avión".
Por otro lado, es muy fácil mandarle a alguien una posición (la actual o cualquier otra) por email, chat, etc (para eso sí necesitas conexión de datos).
Vista la potencia del programa, empezé a investigar cómo poner la fotografía aérea del Instituto Geográfico Nacional como fondo georeferenciado. Es el que puedes ver en mi sección de mapas como PNOA.

Hay dos formas de hacerlo:

Descarga las imágenes con el ordenador

Para ello, tienes que crearte los mapas en el ordenador con un programa, y luego copiarlos al teléfono móvil. El programa en cuestión se llama MOBAC, está hecho en Java, y lo he probado en Windows y en Linux.

Bájatelo al ordenador (pincha aquí).
Descomprime el zip en una carpeta.
Y busca la carpeta "mapsources".
En esa carpeta tienes que poner el contenido (varios ficheros xml) de este otro zip: mapsources.zip

Arranca el programa Mobac. Cuando te pregunta qué atlas crear, selecciona "Maverick". Los mapas que has añadido son "IGN PNOA MR", "IGN Raster" y "Open Cycle Map". Además tienes los que vienen por defecto.
Para mover el mapa pincha el botón derecho y arrastra.
Para crear un atlas selecciona primero los niveles de zoom que deseas (cuidado, puedes ocupar mucho espacio). Luego haz un rectángulo en el mapa (marcando con el botón izquierdo), y añade una capa al atlas ("add selection"). Dale a "create map". Cuando acabe busca la carpeta que te ha creado dentro de "atlases".

Sólo te queda copiarlo al teléfono a la carpeta adecuada, dentro de maverick/tiles (igual te interesa este explorador de archivos para android)

Si tienes versión 2, la carpeta puede llamarse como quieras. Si es la 1.95, la carpeta debe ser "Custom 1", "Custom 2" o "Custom 3". Aquí lo cuenta exactamente : Downloading offline maps

Me acabo de comprar la versión pro. Y no ha funcionado lo que sí funcionaba en la lite. He descubierto que si renombras las imágenes de *.jpg.tile a *.png.tile, funciona!. En linux puedes ejecutar esta línea:
find . -type f -name "*.tile" | xargs rename 's/jpg\.tile/png\.tile/'
Y en una consola de Windows prueba esta otra:
for /R %i in (.) do ( cd %i && ren *.tile *. && ren *.*  *.png && ren *.png *.png.tile)

Algunos modelos de teléfono (por ejemplo el Samsung Galaxy S SCL) tienen la tarjeta SD como otra carpeta distinta. Para guardar los mapas en esa tarjeta, lee esto: Use external SD card

Descarga las imágenes online en el teléfono

Maverick permite configurar un servidor de mapas a gusto del usuario. El problema está en que no entiende servidores con el protocolo WMS, como los del IGN. Para ello he puesto un pequeño código php en un servidor que hace la transformación de coordenadas que usa Maverick (y GoogleMaps, Openstreetmap, etc [EPSG:3857 o EPSG:900913] ) a WMS (en concreto EPSG:4326).
Por cierto, puedes usar este mismo código en otras cosas, como por ejemplo, de fondo del editor online de openstreetmap.org

Primero debes crear un mapa personalizado (custom map) como cuentan aquí: http://support.codesector.com/index.php?/Knowledgebase/Article/View/14/1/setting-up-custom-map-servers
En resumen tienes que crear esta ruta:
/maverick/tiles/your custom map/mapserver.txt

Con el siguiente contenido, en función del mapa que quieras (puedes mirar como quedan en mapas)

PNOA (fotografía aérea)

  http://jjshaw.esy.es/m/pnoa-mr.php?z={z}&x={x}&y={y} , jpg , 18 , 1
      
Como ejemplo de una celda, esto es lo que sale de la desembocadura del Guadalquivir
http://jjshaw.esy.es/m/pnoa-mr.php?z=8&x=123&y=99

Raster (clásico mapa topográfico)

  http://jjshaw.esy.es/m/raster.php?z={z}&x={x}&y={y} , jpg , 18 , 1
      

Otro servidor cualquiera WMS

Este servicio debe admitir EPSG:4326. Basta añadir la url "codificada", por ejemplo con http://meyerweb.com/eric/tools/dencoder/ (realmente basta con substituir & por %26 y = por %3D )
Por ejemplo, para usar el servicio de PNOA (sí, el de arriba) con esta dirección
 http://www.idee.es/wms/PNOA/PNOA?REQUEST=GetMap&VERSION=1.1.1&Service=WMS&FORMAT=JPEG&reaspect=false&LAYERS=pnoa&SRS=EPSG:4326&HEIGHT=256&WIDTH=256
hay que crear el siguiente fichero. (nota: el php sólo añade el campo BBOX)
  http://jjshaw.esy.es/m/osm2wms.php?z={z}&x={x}&y={y}&url=http://www.idee.es/wms/PNOA/PNOA?REQUEST%3DGetMap%26VERSION%3D1.1.1%26Service%3DWMS%26FORMAT%3DJPEG%26reaspect%3Dfalse%26LAYERS%3Dpnoa%26SRS%3DEPSG:4326%26WIDTH%3D256%26HEIGHT%3D256 , jpg , 18 , 1
      
O este otro fichero para el catastro (aunque quizá no es buena idea, pues actualizan a menudo)
  http://jjshaw.esy.es/m/osm2wms.php?z={z}&x={x}&y={y}&url=http%3A%2F%2Fovc.catastro.meh.es%2FCartografia%2FWMS%2FServidorWMS.aspx%3F%26SERVICE%3DWMS%26VERSION%3D1.1.1%26LAYERS%3DCatastro%26STYLES%3D%26FORMAT%3Dimage%2Fpng%26TRANSPARENT%3DFALSE%26REQUEST%3DGetMap%26SRS%3DEPSG%3A4326%26HEIGHT%3D256%26WIDTH%3D256  , jpg , 18 , 1
      

El código php que se ejecuta es más o menos esto:
<?php

if (isset($_REQUEST["x"]) && isset($_REQUEST["y"]) && isset($_REQUEST["z"]))
{
  $z = $_REQUEST["z"];
  $x = $_REQUEST["x"];
  $y = $_REQUEST["y"];

  $wmsURL = "http://www.idee.es/wms/PNOA/PNOA"
    ."?REQUEST=GetMap&VERSION=1.1.1&Service=WMS&FORMAT=JPEG"
    ."&reaspect=false&&LAYERS=pnoa&SRS=EPSG:4326&HEIGHT=256&WIDTH=256";

  $pole = 20037508.34;
  $n = pow(2, $z);


  $x1m = $x / $n * 2 * $pole - $pole;
  $x1m = 180 * $x1m / $pole;

  $y1m = -($y+1) / $n * 2 * $pole + $pole;
  $y1m = 180 / pi() * (2 * atan(exp( ($y1m / $pole) * pi() ) ) - pi() / 2);

  $x2m = ($x + 1) / $n * 2 * $pole - $pole;
  $x2m = 180 * $x2m / $pole;

  $y2m = -$y / $n * 2 * $pole + $pole;
  $y2m = 180 / pi() * (2 * atan(exp( ($y2m / $pole) * pi() ) ) - pi() / 2);


  $wmsURL = $wmsURL . "&BBOX=" . $x1m . "," . $y1m . "," . $x2m . "," . $y2m;

  header('Location: ' . $wmsURL);
}
else
{
  header("HTTP/1.0 404 Not Found");
}
?>


Disfrútalo.

PD: Si detectas algún fallo, dímelo. Por ejemplo, hace poco han cambiado las urls de IGN, y he tenido que actualizar alguna cosa.

Página principal