martes, 13 de septiembre de 2011

Novedades del MapKit de iOS 5

Desde hace un tiempo hay rumores de que Apple va realizar un cambio significativo en el uso de mapas.
Solo es un rumor y no hay fechas, pero...

Por ahora, parece que con la versión 5 habrá 2 características nuevas:
- La función "buscar camino" tiene la habilidad de encontrar varios caminos.
- Posibilidad de imprimir mapas usando AirPrint.

estas son las novedades visibles, pero internamente habrá mas cambios:



Geocoder:
Sus funciones nos permiten malear  una dirección física, (calle, número, ciudad, país) en una coordenada gráfica fundamental para poder dibujar sobre un mapa. Por ejemplo nos servirá para dibujar un pin en el mapa posesionando un lugar. El reverse Geocoding nos permitirá hacer lo contrario.


Las funciones de geocoding evidentemente 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 Mapshttp://maps.google.com/maps/geo?q=<DIR>&output=csv en cambio para elreverse geocoding, disponemos de la clase MKReverseGeocoding del MapKit.
Esto en iOS 5 cambia Apple pone en deprecated (desuso)MKReverseGeocoding y la documentación informa que a partir de ahora debemos utilizar Core Location.

Core Location: 
Core Location es una libreria que se desarrolló para utilizar el GPS y la brújula.
Core Location es independiente de MapKit, no es necesario usar mapas para manejar las cuestiones de de posicionamiento. Es una como una caja negra que nos permitirá hacer aplicaciones desacopladas de Google Maps.

Disferencias respecto a MapKit: 
- Core Location no usa un delegare para retomar el resultado, utiliza block object. que es escribir el código embebido en la llamada a una función.


- El resultado puede ser múltiple, una lista de valores. por ejemplo, si la dirección es ambigua (calle y número sin indicar ciudad o país), retornará varias coordenadas posibles.

Un ejemplo de reverse geocoding usando Core Location:
/ 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.


Evidentemente, el geocoder necesita acceso a Internet.

No hay comentarios:

Publicar un comentario