#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
@interface WXPlaceMark : NSObject
@property(nonatomic,copy)NSString *name; //完整地址
@property(nonatomic,copy)NSString *country; //国家
@property(nonatomic,copy)NSString *province; //省
@property(nonatomic,copy)NSString *locality; //市
@property(nonatomic,copy)NSString *sublocality; //县、区
@property(nonatomic,copy)NSString *route; //街道、路
@property(nonatomic,copy)NSString *streetNumber; //门牌号
@property(nonatomic,copy)NSString *postalCode; //邮政编码
@end
typedef void(^WXGeocodeCompletionHandler)(WXPlaceMark *placeMark, NSError *error);
@interface WXGeocoder : NSObject
- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(WXGeocodeCompletionHandler)completionHandler;
@end
#import "WXGeocoder.h"
@implementation WXPlaceMark
- (void)dealloc
{
[super dealloc];
[_name release];
//...
}
@end
@implementation WXGeocoder
//http://maps.googleapis.com/maps/api/geocode/json?latlng=39.904299,116.22169&sensor=true
- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(WXGeocodeCompletionHandler)completionHandler {
double latitude = location.coordinate.latitude;
double longitude = location.coordinate.longitude;
NSString *urlstring = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&sensor=true",latitude,longitude];
NSURL *url = [NSURL URLWithString:urlstring];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"GET"];
[request setTimeoutInterval:60];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
id result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
WXPlaceMark *place = [self _parseData:result];
//回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
//回调block
completionHandler(place,connectionError);
});
}];
}
- (WXPlaceMark *)_parseData:(NSDictionary *)jsonData {
NSArray *resultsArray = [jsonData objectForKey:@"results"];
if (resultsArray.count == 0) {
return nil;
}
WXPlaceMark *place = [[WXPlaceMark alloc] init];
NSDictionary *placeDic = [resultsArray objectAtIndex:0];
//详细完整地址
NSString *name = [placeDic objectForKey:@"formatted_address"];
place.name = name;
NSArray *components = [placeDic objectForKey:@"address_components"];
for (NSDictionary *component in components) {
NSArray *types = [component objectForKey:@"types"];
if (types.count == 0) {
continue;
}
NSString *type = [types objectAtIndex:0];
if ([@"country" isEqualToString:type]) {
//国家
place.country = [component objectForKey:@"long_name"];
}
else if([type isEqualToString:@"administrative_area_level_1"]) {
//省、市
place.province = [component objectForKey:@"long_name"];
}
else if([type isEqualToString:@"locality"]) {
//市
place.locality = [component objectForKey:@"long_name"];
}
else if([type isEqualToString:@"sublocality"]) {
//区、县
place.sublocality = [component objectForKey:@"long_name"];
}
else if([type isEqualToString:@"route"]) {
//街道
place.route = [component objectForKey:@"long_name"];
}
else if([type isEqualToString:@"street_number"]) {
//门牌号
place.streetNumber = [component objectForKey:@"long_name"];
}
else if([type isEqualToString:@"postal_code"]) {
//邮政编号
place.postalCode = [component objectForKey:@"long_name"];
}
}
return [place autorelease];
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
WXGeocoder *geo = [[WXGeocoder alloc] init];
[geo reverseGeocodeLocation:newLocation completionHandler:^(WXPlaceMark *placeMark, NSError *error) {
NSLog(@"%@",placeMark.name);
}];
[manager stopUpdatingLocation];
}
原文:http://blog.csdn.net/xhm294304668/article/details/19480335