Desarrolladores: Novedades en el MapKit de iOS 5

Desde hace unos meses, hay rumores de que Apple va a implementar un cambio significativo en la experiencia de uso de mapas en los dispositivos móviles. Viendo las betas de iOS 5, sabemos que esto no ocurrirá en breve. Lo que sí podemos afirmar es que hay una actualización de la app Mapas con 2 nuevas características:

  • La función “buscar camino” tiene la habilidad de encontrar varios caminos (caminos alternativos).
  • Nueva función para imprimir mapas usando AirPrint
  • Estas son novedades a nivel de la aplicación oficial, lo que puede apreciar el usuario final. Sin embargo, en las entrañas del SO hay otros cambios que debemos considerar en nuestras aplicaciones basadas en mapas.

    Cambios en el geocoder

    Las funciones de gecoding son las que nos permiten mapear una dirección física (calle, numero, ciudad, país) en una coordenada geográfica (latitud, longitud), vital para poder dibujar sobre un mapa. Imaginen una app que muestra en el mapa los cajeros automáticos de una ciudad. La base de datos tendrá los cientos de direcciones de esos cajeros. Al momento de dibujar un pin por cada uno de ellos, debemos usar geocoding para transformar la dirección real en una coordenada.

    Hay otros casos, en que es necesaria la función inversa: pasar de una coordenada geográfica a una dirección real, es lo que se llama reverse geocoding. En la app Mapas, cuando el usuario mueve el pin con el dedo y lo cambia de posición, se usa reverse geocoding para poder conocer la dirección real.

    Las funciones de geocoding obviamente no son triviales y requieren la base de datos de mapas para poder implementarlas. Tal es así que, para el primer caso, normalmente invocamos los servicios de Google Maps http://maps.google.com/maps/geo?q=<DIR>&output=csv en cambio para el reverse geocoding, disponemos de la clase MKReverseGeocoding del MapKit.

    La novedad es que en iOS 5 esto cambia. Apple paso a deprecated (desuso) MKReverseGeocoding y la documentación informa que a partir de ahora debemos utilizar Core Location.

    Core Location

    Core Location (CL) es una librería que se desarrolló para utilizar el GPS y la brújula. En iOS 4 fue actualizada para implementar el monitoreo de regiones (ej: recibir una notificación al llegar a un determinado lugar). Y ahora, en iOS 5, ganó la funcionalidad de geocoder.

    CL es independiente de MapKit, es decir, no es necesario usar mapas para manejar las cuestiones de posicionamiento. Para los desarrolladores es una caja negra que, con esta nueva actualización, nos permitirá hacer aplicaciones desacopladas de Google Maps. ¿Está Apple separándose, tomando distancia, de los servicios de Google Maps? Pareciera que si. Quizás el próximo paso sea redefinir MapKit para que deje de usar los mapas de Google.

    ¿Que diferencias debemos considerar respecto a MapKit?

  • CL no usa un delegate para retornar el resultado, utiliza block object. Si no estas familiarizado con esto, básicamente es escribir código anónimo embebido en la llamada a una función. Aconsejo leer este enlace como representativo de este tema.
  • El resultado puede ser múltiple, una lista de valores. Por ejemplo, en gecoding directo, si la dirección es ambigua (calle y número sin indicar ciudad o país), va a retornar varias coordenadas posibles, todas cumpliendo el criterio indicado.
  • Ejemplo de reverse geocoding usando CL:  

         // la coordenada a convertir

          CLLocation* location = [CLLocation alloc] initWithLatitude:LATITUD

    longitude:LONGITUD];

             

          // creo instancia del geocoder

          CLGeocoder *geocoder = [[CLGeocoder alloc] init];

             

          // servicio reverse-geocoder, pasando la coordenada y el código que se ejecutará cuando termina

          [geocoder reverseGeocodeLocation:location 

    completionHandler:^(NSArray *placemarks, NSError *error)

          {   

    // si hay resultado positivo

              if( placemarks && placemarks.count > 0 )

              {

                  // puede retornar una lista de lugares

                  for (CLPlacemark *place in placemarks)

                      NSLog(@”CLGeocoder retorna: %@”,

    place.addressDictionary );

              } 

          }

    Para el caso de geocoding directo, el código es similar pero invocando la función: geocodeAddressString

                  

    Recordemos que el uso del geocoder requiere acceso a internet, lo que implica perdida de tiempo, de batería y según el plan del usuario, gasto de dinero. Si tenemos unos pocos puntos a tratar, por ejemplo, las estaciones de una línea del metro, mejor si nos tomamos el trabajo de hacer nosotros el geocoding durante el desarrollo y plasmar las coordenadas directamente en la base de datos, así evitamos hacerlo durante la ejecución de la app.

    ¿Les parece complicado el cambio? Pongamos manos a la obra!. 

    Un artículo de Angel Traversi

    0 0 votos
    Article Rating
    Subscribe
    Notify of
    2 Comments
    Oldest
    Newest Most Voted
    Opiniones Inline
    Ver todos los comentarios
    Anónimo
    Anónimo
    12 years ago

    Mas de estos artículos por favor. Interesantísimo.

    Gracias

    Anónimo
    Anónimo
    12 years ago

    Pues si, mas de estos artículos.

    De todas formas, es entrar en faqmac y es como entrar en la biblioteca de Alejandría después de haber estado mirando un quiosko.

    Muchas gracias por los esfuerzos.

    2
    0
    Me encantaría saber tu opinión, por favor, deja un comentariox
    ()
    x