自定义位置反编码的用法

来源:互联网 发布:js调用api接口实例 编辑:程序博客网 时间:2024/06/05 02:39

#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


typedefvoid(^WXGeocodeCompletionHandler)(WXPlaceMark *placeMark,NSError *error);


@interface WXGeocoder :NSObject


- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(WXGeocodeCompletionHandler)completionHandler;


@end



#import "WXGeocoder.h"


@implementation WXPlaceMark

- (void)dealloc

{

    [superdealloc];

    [_namerelease];

    //...

}

@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 = [NSStringstringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&sensor=true",latitude,longitude];

    

   NSURL *url = [NSURLURLWithString:urlstring];

    

    NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:url];

    [requestsetHTTPMethod:@"GET"];

    [request setTimeoutInterval:60];

    

    NSOperationQueue *queue = [[NSOperationQueuealloc] init];

    [NSURLConnectionsendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response,NSData *data, NSError *connectionError) {

        

        id result = [NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingMutableContainerserror: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 = [[WXPlaceMarkalloc] init];

    

   NSDictionary *placeDic = [resultsArray objectAtIndex:0];

    //详细完整地址

   NSString *name = [placeDic objectForKey:@"formatted_address"];

    place.name = name;

    

   NSArray *components = [placeDic objectForKey:@"address_components"];

   for (NSDictionary *componentin components) {

       NSArray *types = [component objectForKey:@"types"];

       if (types.count ==0) {

           continue;

        }

        

       NSString *type = [types objectAtIndex:0];

       if ([@"country"isEqualToString:type]) {

           //国家

            place.country = [componentobjectForKey:@"long_name"];

        }

        elseif([type isEqualToString:@"administrative_area_level_1"]) {

           //省、市

            place.province = [componentobjectForKey:@"long_name"];

        }

       else if([typeisEqualToString:@"locality"]) {

           //

            place.locality = [componentobjectForKey:@"long_name"];

        }

       else if([typeisEqualToString:@"sublocality"]) {

           //区、县

            place.sublocality = [componentobjectForKey:@"long_name"];

        }

       else if([typeisEqualToString:@"route"]) {

           //街道

            place.route = [componentobjectForKey:@"long_name"];

        }

       else if([typeisEqualToString:@"street_number"]) {

           //门牌号

            place.streetNumber = [componentobjectForKey:@"long_name"];

        }

       else if([typeisEqualToString:@"postal_code"]) {

           //邮政编号

            place.postalCode = [componentobjectForKey:@"long_name"];

        }

    }

    

    

   return [place autorelease];

    

}


- (void)locationManager:(CLLocationManager *)manager

didUpdateToLocation:(CLLocation *)newLocation

  fromLocation:(CLLocation *)oldLocation {

    

    WXGeocoder *geo = [[WXGeocoderalloc] init];

    

    [georeverseGeocodeLocation:newLocation completionHandler:^(WXPlaceMark *placeMark,NSError *error) {

        

       NSLog(@"%@",placeMark.name);

        

    }];

    

    [manager stopUpdatingLocation];

    

}



0 0
原创粉丝点击