Tutoriel Swift : Geocoding et Reverse Geocoding en Swift

Geocoding

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 » :

Tabbed App Template

Ensuite, on crée l’UI. Rien de très compliqué ici : des champs textes, des boutons et quelques gadgets cosmétiques…

GeodecodeStoryboard

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 :

GeoEncode

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 » :

ImportCoreLocation

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.

geocode

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).

geocodeProcessResponse

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 :

FindCoordinatesClass

Et s’utilise dans le ViewController « GeoencodeViewControler » comme ceci :

geoencodeVC-geoencodeButtonAction

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 :

geoencodeVC-Alert.png

II Le « Geodecoding » ou « Reverse Geocoding »

Ici, nous désirons retrouver un lieu à partir de ses coordonnées géographiques (latitude et longitude).

Geodecode

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 :

geodecode

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 :

geodecodeProcessResponse

Le code de la classe « FindLocation » terminée est donc :

FincdLocationClass

Et on utilise tout cela dans « GeodecodeViewController » :

geodecodeVC

Il reste juste à afficher la réponse, ici aussi grâce à un simple UIAlertController

Et voilà !

Comme d’habitude, l’intégralité du code se trouve sur GitLab : https://gitlab.com/camilleBar/geoencodedemo

Et si vous avez des questions, suggestions, remarques, n’hésitez pas, commentez !

globe-1015311_1920

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.