Comment obtenir une adresse à partir de coordonnées géographiques ? Et comment obtenir les coordonnées géographiques à partir d’une adresse ?
Voici (un des) problèmes auxquels je me suis frotté pour la réalisation de l’application KayakTracker…
Et cela se nomme le géocodage et le géodécodage (geocoding et reverse geocoding). Une recherche Google montre que cela est réalisable entre autres grâce à leur API Maps…
Mais Apple à également pensé à nous, et c’est cette méthode que je vais vous présenter.
Comme d’habitude, je m’appuie sur une petite application « POC » qui, une fois terminée, donnera cela :
Motivés ? C’est parti !
La première des choses à faire est de créer notre application avec XCode…
Je pars d’un template de « Tabbed App » :
Ensuite, on crée l’UI. Rien de très compliqué ici : des champs textes, des boutons et quelques gadgets cosmétiques…
Puis, on entre dans le coeur du sujet…
I Le « Geoencoding »
Dans ce cas, nous désirons trouver les coordonnées géographiques (latitude et longitude) d’un lieu à partir de son nom :
C’est le job le la classe « FindCoordinates »
Comme nous allons travailler avec des données géographiques, nous avons besoin d’importer la librairie « CoreLocation » :
Ensuite, je crée la fonction « geodecode » qui prend en paramètre l’adresse, avec en completion handler 2 Doubles optionnels (latitude et longitude), et 1 String également optionnel pour une éventuelle erreur.
J’utilise la fonction « geocodeAdressString » de la classe CLGeocoder. Le completion handler de cette fonction accepte 2 paramètres : 1 tableau optionnel de « CLPlacemark » et une erreur également optionnelle.
Ici, nous allons invoquer une autre méthode à l’intérieur du completion handler : processResponse(withPlacemarks: placemarks, error: error).
Rien de bien compliqué, sauf que j’utilise ici le completion handler de « processResponse » pour récupérer les coordonnées et / ou le message d’erreur.
Le code de la classe « FindCoordinates » terminé est donc :
Et s’utilise dans le ViewController « GeoencodeViewControler » comme ceci :
Notez juste que j’utilise un thread différent afin de ne pas, quoi qu’il arrive, bloquer le thread principal de l’application.
Il reste juste à afficher la réponse, ici grâce à un simple UIAlertController :
II Le « Geodecoding » ou « Reverse Geocoding »
Ici, nous désirons retrouver un lieu à partir de ses coordonnées géographiques (latitude et longitude).
C’est le travail de la classe « FindLocation »
Nous avons également besoin de la librairie « CoreLocation« .
Ensuite, je crée la fonction « geodecode« , qui prend en paramètres la latitude et la longitude :
Ici, j’utilise la fonction « reverseGeocodeLocation » de la classe CLGeocoder. Cette fonction accepte en paramètre une CLLocation, avec un completion handler contenant 2 arguments : 1 tableau optionnel de « CLPlacemark » et une erreur également optionnelle.
La fonction « geodecode » ressemble fort à la fonction « geocode« , mis à part que dans le completion handler, on invoque une méthode « processResponse » qui formate les résultats :
Le code de la classe « FindLocation » terminée est donc :
Et on utilise tout cela dans « GeodecodeViewController » :
Il reste juste à afficher la réponse, ici aussi grâce à un simple UIAlertController