Anyway, this time around I am posting a couple of methods that outline how I retrieve a country name by doing a JSON query passing in the latitude and longitude of a place, and secondly how I get the coordinates to a search term (a string).
As usual I'll let the code speak for itself...
To get the string name of a country from latitude and longitude, also with the ability to specify which language you get the country name back in...
// Do reverse geocode lookup on latitude/longitude to get country name based on specified locale - (NSString*)getCountryNameFromCoordinates:(CLLocationCoordinate2D)coordinates locale:(NSString*)language; { NSLog(@"Querying Google location API for %@ country name for latitude %f and longitude %f...", language, coordinates.latitude, coordinates.longitude); // Get JSON contents from Google API NSString *url = [[NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&sensor=false&language=%@", coordinates.latitude, coordinates.longitude, language] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSLog(@"Query URL is: %@", url); NSError *error = nil; NSString *jsonString = [NSString stringWithContentsOfURL:[NSURL URLWithString:url] encoding:NSUTF8StringEncoding error:&error]; if (error != nil) { NSLog(@"Error doing reverse geocode lookup on %f, %f, lang=%@: %@", coordinates.latitude, coordinates.longitude, language, error.localizedDescription); return nil; } // Extract country by parsing JSON data SBJsonParser *jsonParser = [[SBJsonParser alloc] init]; error = nil; NSDictionary *jsonObjects = [jsonParser objectWithString:jsonString error:&error]; if (error != nil) { NSLog(@"Error parsing JSON response to reverse geocode lookup: %@", jsonParser.error); [jsonParser release]; [jsonObjects release]; return nil; } NSDictionary *results = [jsonObjects objectForKey:@"results"]; NSString *country = nil; for (NSDictionary *item in results) { if ([[item objectForKey:@"types"] containsObject:@"country"]) { country = [[[item objectForKey:@"address_components"] objectAtIndex:0] objectForKey:@"long_name"]; NSLog(@"Found matching country name: %@", country); [item release]; break; } [item release]; } if (country == nil) { NSLog(@"Couldn't find a matching country name"); [jsonParser release]; [jsonObjects release]; [results release]; [country release]; return nil; } [jsonParser release]; [jsonObjects release]; [results release]; return country; }
And to center your map (or whatever behaviour you so desire) on the coordinates obtained from a search on a specified location string...
- (void)searchCoordinatesForAddress:(NSString *)inAddress { NSLog(@"Querying Google location API for latitude/longitude coordinates for search term %@", inAddress); // Get JSON contents from Google API NSString *url = [[NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?address=%@&sensor=false", inAddress] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSLog(@"Query URL is: %@", url); NSError *error = nil; NSString *jsonString = [NSString stringWithContentsOfURL:[NSURL URLWithString:url] encoding:NSUTF8StringEncoding error:&error]; if (error != nil) { NSLog(@"Error doing coordinate lookup on %@: %@", inAddress, error.localizedDescription); return; } // Extract coordinates by parsing JSON data SBJsonParser *jsonParser = [[SBJsonParser alloc] init]; error = nil; NSDictionary *jsonObjects = [jsonParser objectWithString:jsonString error:&error]; if (error != nil) { NSLog(@"Error parsing JSON response to extract coordinates: %@", jsonParser.error); [jsonParser release]; [jsonObjects release]; return; } NSArray *results; NSDictionary *location; @try { results = [jsonObjects objectForKey:@"results"]; location = [[[results objectAtIndex:0] objectForKey:@"geometry"] objectForKey:@"location"]; } @catch (NSException *exception) { NSLog(@"Could not find searched location's coordinates"); [jsonParser release]; [jsonObjects release]; return; } // Get latitude and longitude as double values double longitude = 0.0; double latitude = 0.0; NSNumber *lat = [location objectForKey:@"lat"]; NSNumber *lng = [location objectForKey:@"lng"]; latitude = [lat doubleValue]; longitude = [lng doubleValue]; [lat release]; [lng release]; [jsonParser release]; [jsonObjects release]; [results release]; if (longitude == 0 && latitude == 0) { NSLog(@"Could not find searched location's coordinates"); return; } NSLog(@"Coordinates found for searched location: %f %f", latitude, longitude); // I zoom my map to the area in question. [self zoomMapAndCenterAtLatitude:latitude andLongitude:longitude]; }