首页 > 其他 > 详细

自定义位置反编码的用法

时间:2014-02-20 03:54:25      阅读:323      评论:0      收藏:0      [点我收藏+]

#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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!