Le tenía muchas ganas a MapKit. Es de esas cosas que sabes que en algún momento tendrás que toquetear pero por algún motivo ese momento no llega. Al final ha sido para hacer una aplicación que tiene la funcionalidad de "como llegar". Había oído a unos decir que esto era muy complicado y a otros que no era para tanto... Por lo que he podido comprobar, a partir de iOS 4 es bastante fácil de implementar. No he intentado bajar el código más allá de esta versión así que no puedo confirmar si es muy complicado en versiones anteriores.
Aunque MapKit está muy bien, los acuerdos de licencia entre Apple, Google y TomTom (si, aunque parezca mentira, TomTom está metida en el ajo) provocan perversiones como que la geocodificación inversa esté soportada (obtener una dirección a partir de unas coordenadas) pero la directa no (obtener unas coordenadas a partir de una dirección). Con el cálculo de rutas pasa lo mismo: la aplicación Mapas permite encontrar direcciones en un mapa y calcular rutas entre dos puntos pero a Apple (aparentemente) no le trae a cuenta incluir esa funcionalidad en las API´s así que no queda más remedio que incluirla nosotros... ¿cómo? pues con Google Directions
La gran ventaja de este API es que podríamos calificarlo dentro del tipo "Semilla de Oro" porque lo aguanta todo. El esquema de la URL para obtener la ruta más sencilla es el siguiente:
http://maps.googleapis.com/maps/api/directions/json?origin=Madrid&destination=Barcelona&sensor=false
En un alarde de originalidad, "origin" es el origen de la ruta y "destination" es el final de la ruta. "sensor" es un parametro con el que informamos de si el dispositivo tiene GPS. Pues bien, digo que es "Semilla de Oro" porque tanto en origin como en destination se pueden pasar coordenadas como literales. La única precaución será cambiar las caracteres no permitidos por los correspondientes con %.
El resultado es un conjunto de datos en formato json y de toda la información que nos facilita, la que más nos va a interesar para este post es la que se denomina overviewpolyline. Ese "chorro de datos", claramente codificado es un conjunto de coordenadas que, si se unen, dan lugar a la linea que representa la ruta. Como la codificación es pública, alguien ya se ha tomado la molestia de escribir el código que la decodifica, en mi aplicación yo he usado esta forma pero una búsqueda en Google te devuelve muchas más opciones, todas ellas semejantes. La única modificación que he incluido es una transformación de las coordenadas en un objeto CLLocation para devolverlo como elemento de un NSArray.
Para proyectar la ruta sobre el mapa, vamos a utilizar las clases MKPolyline y MKOverlayView. La forma de hacerlo la he obtenido de este blog, que es donde cuentan que desde iOS 4 es fácil pero que antes era complicado e infructuoso.
El resultado ha sido el de estas imágenes
Y ya está, el código fuente de la demo lo podéis encontrar en GitHub.