Ok, per rispondere alla mia domanda:
come si è detto prima, la cosa migliore da fare è quello di utilizzare l'API di Google Maps, Supporta molti formati, ma per diversi motivi ho scelto di andare con JSON.
Quindi, ecco i passaggi per eseguire una query JSON su Google Maps e ottenere la coordinata della query. Nota che non tutte le convalide corrette sono fatte, questa è solo una Prova di concetto.
1) Scaricare un JSON quadro/libreria per l'iPhone, ci sono diversi, ho scelto di andare con this one, è molto buono e sembra un progetto attivo, oltre a diverse applicazioni comercial sembrano essere ad usarlo. Quindi aggiungilo al tuo progetto (istruzioni here).
2) per interrogare Google Maps per un indirizzo abbiamo bisogno di costruire un URL richiesta come questo: http://maps.google.com/maps/geo?q=Paris+France
questo url, restituirà un oggetto JSON per la query "Paris + France".
3) Codice:
//Method to handle the UISearchBar "Search",
- (void) searchBarSearchButtonClicked:(UISearchBar *)theSearchBar
{
//Perform the JSON query.
[self searchCoordinatesForAddress:[searchBar text]];
//Hide the keyboard.
[searchBar resignFirstResponder];
}
Dopo gestiamo la ricerca UISearchBar, dobbiamo fare la richiesta a 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];
}
Dobbiamo ovviamente poi gestire la risposta del server GoogleMaps (Nota: mancano molte validazioni)
//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];
}
Infine la funzione per ingrandire la mappa, che dovrebbe ormai è una cosa banale.
- (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];
}
Spero che questo aiuti qualcuno, perché la parte JSON è stato un vero e proprio dolore per capire, la biblioteca non è molto ben documentato, a mio parere, ancora è molto buono.
EDIT:
Modificato un nome del metodo da "searchCoordinatesForAddress:" a causa di @Leo domanda. Devo dire che questo metodo è valido come prova del concetto ma se si prevede di scaricare file JSON di grandi dimensioni, sarà necessario aggiungere un oggetto NSMutableData per contenere tutta la query sul server di google.(Ricordo che le query HTTP venire da pezzi.)
domande e risposte fantastiche. molte grazie! – kape123
google geocoding api versione viene aggiornata. http://code.google.com/apis/maps/documentation/geocoding/ – seapy
Ciao, ma non si risolve una situazione in cui non c'è più di un risultato sul dato indirizzo, se sto leggendo il codice a destra. – JakubM