Google Maps en Android (II)



La semana pasada empezamos una serie dedicada a la API de Google Maps en Android. Vimos como crear nuestra key y pintar un mapa muy básico. Hoy veremos como utilizar la clase MyLocationOverlay para centrar nuestra posición en el mapa y ver en todo momento donde nos encontramos.

Continuamos donde lo dejamos la semana pasada, estamos instanciando nuestro mapa y habíamos seteado los controles de zoom visibles. Vamos a modificar un poco esa parte y vamos a añadir alguna opción más. Yo suelo hacerme un método que llamo inicializeMap y es algo así:

private MapController mapController;
private MyLocationOverlay myLocationOverlay;
private MapView mapView;

private void inicializeMap(){
     mapView = (MapView) findViewById(R.id.map);
        mapView.setBuiltInZoomControls(true);        
        mapController = mapView.getController();
        mapController.setZoom(9);  
        mapController.animateTo(new GeoPoint(0,0));
        centerMyPosition();              
}

Lo primero que hago es declarar un MapView, que la vista del mapa, un MapController que me ayudará a  manejar parámetros como el zoom o las coordenadas que debe mostrar el mapa, y por último la clase MyLocationOverlay, esta la explico más adelante.

Antes vamos a centrarnos un poco más en el método inicializeMap. Las 2 primeras líneas del método son las de la semana pasada. En la tercera lo que hacemos es obtener el controlador del mapview, con este seteamos el nivel de zoom y algo muy interesante, el método animateTo.

Este método nos permite mover el mapa a unas determinadas coordenadas. Este recibe como parámetro un objeto GeoPoint que no es más que las coordenadas: latitud y longitud. Es importante que sepáis como pasar estos datos, normalmente si hacéis botón derecho en la web de google maps y seleccionáis "Visualizar marcador lat. long." os mostrará los 2 puntos con uno o dos números enteros y el resto serán decimales, hasta un máximo de 6 (el número de decimales va a depender del nivel de zoom que tengáis, a más zoom, más decimales). Por ejemplo, esto es la Puerta del Sol en Madrid: 40,416959, -3,703797 con el zoom máximo.

El constructor de GeoPoint admite para la latitud y la longitud solamente datos tipo int. Por lo tanto, habría que transformar esas coordenadas. Vamos a ver un ejemplo sencillo:

int latitud = (int) (40.416959 * 1E6);
int longitud = (int) (-3.703797 * 1E6);
mapController.animateTo(new GeoPoint(latitud,longitud));

Hemos creado las variables latitud y longitud de tipo int. Multiplicamos la latitud y la longitud por 1E6, es decir, por un millón. También hacemos un "cast" a un tipo int (si no lo ponéis veréis como el editor os dice que lo hagáis), de esta forma se elimina la parte decimal, quedando solo la entera. Y ya tendríamos centrado nuestro mapa cuando inicialicemos en la Puerta del Sol.

Nos queda ver la clase MyLocationOverlay y como utilizarla. Google Maps es una colección de capas en una determinada posición, unas sobre otras y a las cuales se les varía la visibilidad y quien está por encima de una u otra. Pues bien, esta clase es una capa más que se encarga mostrar nuestra posición (más bien la de nuestro dispositivo). Mostrar esta capa es muy sencillo:

private void centerMyPosition(){
        myLocationOverlay = new MyLocationOverlay(this, mapView);
        mapView.getOverlays().add(myLocationOverlay);
        myLocationOverlay.enableCompass();
        myLocationOverlay.enableMyLocation();
        myLocationOverlay.runOnFirstFix(new Runnable() {
            public void run() {
                mapController.animateTo(myLocationOverlay.getMyLocation());
            }
        });
}

Con el método centerMyPosition inicializamos el objeto myLocationOverlay pasandole el Context actual y el mapview con el que estamos trabajando. Luego añadimos al  mapview la nueva capa que hemos creado.

Ahora habilitamos algunas opciones como la brújula (compass) y nuestra posición (cogerá la última conocida hasta que localice el dispositivo. Por último, seteamos el método runOnFirstFix para que en cuanto se situe muestre nuestra posición en el mapview. Como veis myLocationOverlay nos devuelve un GeoPoint con nuestra posición actual.

Hasta aquí el segundo capitulo de esta serie dedicada a Google Maps, la semana que viene volveremos a dedicarlo a este tema. De momento, si queréis ver que se puede hacer con este API estad atentos porque el viernes vamos a lanzar una nueva aplicación, se llama LucusBus, y dará información de los autobuses urbanos de la ciudad de Lugo. Os iremos informando en el blog, en la cuenta de Twitter de 3pi3s y en la página de Facebook Lucus Bus que hemos creado para ir colgando pantallas, informar de errores, actualizaciones y saber que os parece o que mejoraríais de la aplicación.