Reverse Geocoding – Ottenere indirizzo o città in iOS

Il Geocoding inverso (Reverse Geocoding) è raggiunto utilizzando MKReverseGeocoder, ma nell’ultima versione di iOS, iOS 5.0 è stato deprecato, questo non significa che non si può usare, ma vuol dire che il suo uso non è attivamente incoraggiato. Le possibilità sono che se l’applicazione che si sta costruendo è rivolta a dispositivi che eseguono i sistemi operativi pre iOS5 allora sarà approvato. Tuttavia, se si sta creando l’app per iOS 5 e c’è la possibilità che non sia approvata, in quanto si sta usando un metodo obsoleto. Nel frattempo di Apple consiglia di utilizzare CLGeocoder invece.

Quindi che cos’è il geocoding inverso?

Beh secondo Wikipedia:

Geocoding inverso è il processo di ritorno (reverse) di una posizione del punto (latitudine, longitudine) ad un indirizzo leggibile. Ciò permette l’identificazione di indirizzi stradali nelle vicinanze, luoghi e / o le loro aree, come quartieri, contea, stato o paese.

Tale definizione è molto precisa, in pratica nelle nostre applicazioni vogliamo essere in grado di convertire la lettura fornita dall’unità GPS solitamente consegnata in forma di latitudine e longitudine in qualcosa che sia leggibile da esseri umani normali, non sto dicendo che la longitudine e la latitudine sono non è utile, ma applicazioni diverse richiedono risultati diversi. Quando stavo scrivendo un’applicazione che usava iOS + Location ho voluto aggiungere alcune funzionalità Reverse Geocoding, ma era rivolta verso iOS 5 + e non mi era concesso di usare MKReverseGeocoder.

Allora di cosa stiamo parlando in pratica?

clgeocoder

Questo è uno screenshot preso dal simulatore in Xcode che visualizza le informazioni di base che possono essere recuperate utilizzando CLGeocoder e sono sicuro che si può vedere subito che può essere molto utile a una platea di sviluppatori di applicazioni. È probabile che se stai leggendo questo articolo probabilmente stai imparando il linguaggio, quindi consideralo come una fonte di informazioni utili da dare sul “posto” in cui ti trovi.

Quali sono le informazioni messe a disposizione da CLGeocoder?

Usando CLGeocoder ritorna un CLPlacemark, un oggetto che funge da marker cioè contiene tutte le informazioni sul luogo in cui ti trovi, è davvero semplice.

clplacemarkdoc

Come si può vedere ci sono un sacco di possibili valori che è possibile estrarre da un segnaposto, ma hanno un nome un po’ “vago”, così una volta che inizi a lavorare dovresti sperimentare un po’ per ottenere quali informazioni restituiscono.

Come lo faccio?

Creiamo un nuovo progetto di tipo Single-based application ed aggiungiamo il framework CoreLocation.framework, puoi seguire la guida dettagliata ai passaggi già precedentemente pubblicata, questo ci permetterà di accedere al GPS del dispositivo.

Spostiamoci nel file ViewController.h ed inseriamo tutte le proprietà, i delegate e le azioni necessarie:

[code lang=”obj-c”]
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>

@interface ViewController : UIViewController <CLLocationManagerDelegate>

@property (weak, nonatomic) IBOutlet UIButton *geoCodeButton;

@property (weak, nonatomic) IBOutlet UILabel *locationLabel;

@property (strong, nonatomic) IBOutlet CLLocationManager *locationManager;

@property (strong, nonatomic) IBOutlet CLGeocoder *geoCoder;

– (IBAction)geoCodeLocation:(id)sender;

@end
[/code]

Rechiamoci nel file ViewController.m e come prima cosa impostiamo i setter e getter delle proprietà dichiarate attraverso il @syntetize, poi nel viewDidLoad:

[code lang=”obj-c”]
– (void)viewDidLoad{

[super viewDidLoad];

locationManager.delegate=self;

//otteniamo la posizione dell’utente

[locationManager startUpdatingLocation];

}
[/code]

e successivamente implementiamo la nostra funzione:

[code lang=”obj-c”]
– (IBAction)geoCodeLocation:(id)sender{

//blocco del geocoding

[self.geoCoder reverseGeocodeLocation: locationManager.location completionHandler:

^(NSArray *placemarks, NSError *error) {

//ottieni l’indirizzo più vicino

CLPlacemark *placemark = [placemarks objectAtIndex:0];

NSLog(@"%@",[placemark.addressDictionary allKeys]);

//String to hold address

NSString *locatedAt = [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "];

//stampa la posizione in console

NSLog(@Adesso mi trovi qui: %@",locatedAt);

//impostiamo il testo nella label

[locationLabel setText:locatedAt];

}];

}
[/code]

Spostiamoci nel file ViewController.xib e creaiamo una sorta di interfaccia molto semplice con un solo bottone da collegare all’azione e una label che mostri il risultato.

Bene, adesso non ci resta che avviare la nostra applicazione. Se proviamo sul simulatore ci verranno mostrate tutte le info su HQ di Cupertino, altrimenti se proviamo dal nostro dispositivo potremmo ottenere informazioni molto più veritiere.