«

»

dic 11 2012

MapsForge: OpenStreetMap en Android 1/3

 

 

Durante un tiempo hemos venido hablándoos sobre Osmdroid, una librería para poder implementar en nuestras apps la visualización de mapas de OpenStreetMap, tanto de manera online como offline, pues bien, después de empaparnos de esta librería y someterla a pruebas de uso más exigentes, hemos comprobado que su rendimiento deja bastante que desear. Llegados este punto debíamos encontrar una alternativa y es aquí donde entra en juego MapsForge, otra librería LGPL3 similar que aunque mucho menos madura en desarrollo (esta es la razón que nos llevo a descartarla en un principio) tiene rendimiento notablemente superior y una característica muy interesante y de la cual carece Osmdroid, los mapas vectoriales. Estos mapas vectoriales nos permiten reducir el tamaño de los mapas almacenados en memoria para el uso offline hasta conseguir unos tamaños de ficheros del 10% de los necesarios para Osmdroid y por tanto reduciendo el tamaño de nuestro ficheros apk.

 

Si os pinta bien lo que os cuento seguid leyendo y aprenderéis como incluirlo en vuestras apps.

 

Si ya os habéis peleado con la API de Google Maps la toma de contacto con MapsForge os será muy fácil ya que otro acierto de esta librería es que su API es muy similar a la desarrollada por los de Mountain View. Al igual que esta, basa su implementación en una actividad especial llamada MapActivity de la que tendremos que extender la activity de nuestra app la cual gestionará y mostrará los mapas. Una vez creado nuestro proyecto Android lo primero que tenemos que hacer y no olvidar es incluir en el Manifest los permisos necesarios para el correcto funcionamiento de esta librería. Por un lado necesitaremos permisos para escribir en la memoria externa ya que es allí donde se guardará la cache de mapas a usar y por otro lado, si procede, para el caso de mapas online necesitaremos acceso a internet.

 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET" />

 

Y en segundo lugar, evidentemente incluir la librería en nuestro proyecto en la carpeta libs. Para ello la descargaremos desde el siguiente enlace:

 

mapsforge-map-0.3.0-jar-with-dependencies.jar

 

Ya tenemos nuestro proyecto listo para pasar a implementar nuestra activity, llegados este punto tenemos dos maneras de proceder, podemos prescindir del uso de XML para el diseño de nuestros layout e implementar por codigo, o delegar al XML esta tarea.

 

A continuación os mostramos el código necesario para mostrar de manera online los mapas prescindiendo de los XML:

 

public class MyMapActivity extends MapActivity {

    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         
         // Instanciamos MapView seleccionando el proveedor
         // de mapas Mapnick
         MapView mapView = new MapView(this, new MapnikTileDownloader());
         
         // Configuramos algunas características
         // del MapView
         mapView.setClickable(true);
         mapView.setBuiltInZoomControls(true);
         
         setContentView(mapView);        
    }
}

 

Si por el contrario queremos delegar al XML la tarea del diseño de nuestro layout deberemos añadir en el mismo el siguiente código para luego desde nuestra activity poder recuperar el MapView para poder gestionarlo y configurarlo:

 

<org.mapsforge.android.maps.MapView
            android:id="@+id/mapView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

 

En este caso nuestra activity quedaría de la siguiente manera:

 

public class MyMapActivity extends MapActivity {
private MapView mapView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Cargamos el layout y recuperamos el MapView setContentView(R.layout.activity_osmaps); mapView = (MapView) findViewById(R.id.mapView); mapView.setClickable(true); mapView.setBuiltInZoomControls(true); } }

 

Con esto ya tendríamos funcionando la visualización de los mapas en nuestra app, si exploramos la API podremos encontrar otras características a configurar como la barra de escala, la posición de los controles de zoom, la escala de texto para los mapas vectoriales o incluso un theme para la visualización de los mapas vectoriales (caso offline). En cuanto a los theme en la wiki de la librería podemos encontrar instrucciones acerca de como implementarlo pero el proceso es bastante tedioso y complicado y no tenemos la suerte aún de disponer de repositorio de los mismo, pero es una característica interesante que vale la pena seguir de cerca. Por último os dejamos como seleccionar el punto de visualación inicial donde arrancaremos nuestro mapa, así como el zoom seleccionado:

 

mapView.setCenter(new GeoPoint(41.38, 2.15));
mapView.getController().setZoom(13);

 

En el siguiente post os mostraremos el uso de los overlays que nos ofrece esta librería y en un tercero y último el uso de los mapas offline.

 

fuente | Ingens Blog

 

Acerca del autor

JMPergar

Mobile Developer at @BeRepublic & Founder of @AndroCode. Silver Speaker & Member of Core Team at @GDGBarcelona.

  • Pingback: MapsForge: OpenStreetMap en Android 2/3 | Androcode()

  • Pingback: MapsForge: OpenStreetMap en Android 3/3 | Androcode()

  • Valeria

    ¡Buenísimo los tutoriales!
    Haciendo eso solo me da error:

    09-22 21:25:39.252: E/AndroidRuntime(1656): FATAL EXCEPTION: MapWorker
    09-22 21:25:39.252: E/AndroidRuntime(1656): java.lang.NullPointerException
    09-22 21:25:39.252: E/AndroidRuntime(1656): at org.mapsforge.map.reader.MapDatabase.executeQuery(MapDatabase.java:247)
    09-22 21:25:39.252: E/AndroidRuntime(1656): at org.mapsforge.android.maps.mapgenerator.databaserenderer.DatabaseRenderer.executeJob(DatabaseRenderer.java:169)
    09-22 21:25:39.252: E/AndroidRuntime(1656): at org.mapsforge.android.maps.mapgenerator.MapWorker.doWork(MapWorker.java:73)
    09-22 21:25:39.252: E/AndroidRuntime(1656): at org.mapsforge.android.maps.PausableThread.run(PausableThread.java:94)

    ¿Alguna solución? Gracias.

  • http://gravatar.com/aladme aladme

    Me ha encantado el tutorial!!
    solo un apunte … sabrias indicarme como corregir la compatibilidad para android 4.2 en adelante?