Ok, pour répondre à ma propre question :
Comme il a été mentionné précédemment, la meilleure chose à faire est d'utiliser l'API de Google Maps, Elle supporte de nombreux formats, mais pour plusieurs raisons, j'ai choisi d'utiliser JSON.
Voici donc les étapes à suivre pour effectuer une requête JSON à Google Maps et obtenir les coordonnées de la requête. Notez que toutes les validations correctes ne sont pas effectuées, ceci n'est qu'une preuve de concept.
1) Téléchargez un framework/une bibliothèque JSON pour l'iPhone, il y en a plusieurs, j'ai choisi d'aller avec celui-ci Il est très bon et semble être un projet actif, et plusieurs applications commerciales semblent l'utiliser. Alors ajoutez-le à votre projet ( instructions aquí ).
2) Pour demander une adresse à Google Maps, nous devons construire une URL de requête comme ceci : http://maps.google.com/maps/geo?q=Paris+France
Cette url, renverra un objet JSON pour la requête "Paris+France".
3) Code :
//Method to handle the UISearchBar "Search",
- (void) searchBarSearchButtonClicked:(UISearchBar *)theSearchBar
{
//Perform the JSON query.
[self searchCoordinatesForAddress:[searchBar text]];
//Hide the keyboard.
[searchBar resignFirstResponder];
}
Après avoir traité la recherche de la barre de recherche UISearchBar, nous devons faire la demande à Google Maps :
- (void) searchCoordinatesForAddress:(NSString *)inAddress
{
//Build the string to Query Google Maps.
NSMutableString *urlString = [NSMutableString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@?output=json",inAddress];
//Replace Spaces with a '+' character.
[urlString setString:[urlString stringByReplacingOccurrencesOfString:@" " withString:@"+"]];
//Create NSURL string from a formate URL string.
NSURL *url = [NSURL URLWithString:urlString];
//Setup and start an async download.
//Note that we should test for reachability!.
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection release];
[request release];
}
Nous devons bien sûr ensuite traiter la réponse du serveur GoogleMaps ( Note : beaucoup de validations manquent)
//It's called when the results of [[NSURLConnection alloc] initWithRequest:request delegate:self] come back.
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
//The string received from google's servers
NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//JSON Framework magic to obtain a dictionary from the jsonString.
NSDictionary *results = [jsonString JSONValue];
//Now we need to obtain our coordinates
NSArray *placemark = [results objectForKey:@"Placemark"];
NSArray *coordinates = [[placemark objectAtIndex:0] valueForKeyPath:@"Point.coordinates"];
//I put my coordinates in my array.
double longitude = [[coordinates objectAtIndex:0] doubleValue];
double latitude = [[coordinates objectAtIndex:1] doubleValue];
//Debug.
//NSLog(@"Latitude - Longitude: %f %f", latitude, longitude);
//I zoom my map to the area in question.
[self zoomMapAndCenterAtLatitude:latitude andLongitude:longitude];
[jsonString release];
}
Enfin la fonction pour zoomer ma carte, ce qui devrait être maintenant une chose triviale.
- (void) zoomMapAndCenterAtLatitude:(double) latitude andLongitude:(double) longitude
{
MKCoordinateRegion region;
region.center.latitude = latitude;
region.center.longitude = longitude;
//Set Zoom level using Span
MKCoordinateSpan span;
span.latitudeDelta = .005;
span.longitudeDelta = .005;
region.span = span;
//Move the map and zoom
[mapView setRegion:region animated:YES];
}
J'espère que cela aidera quelqu'un, car la partie JSON a été très difficile à comprendre, la bibliothèque n'est pas très bien documentée à mon avis, mais elle est quand même très bonne.
EDIT :
J'ai modifié le nom d'une méthode en "searchCoordinatesForAddress :" en raison de la question de @Leo. Je dois dire que cette méthode est bonne comme preuve de concept mais si vous prévoyez de télécharger de gros fichiers JSON, vous devrez ajouter un objet NSMutableData pour contenir toutes les requêtes au serveur de Google. ( rappelez-vous que les requêtes HTTP sont faites par morceaux. )