iOS中编码反编码(经纬度和地名之间相互转换)

第一步:在工程中Info.plist文件中加入一段代码,控制弹窗是否允许定位:NSLocationWhenInUseUsageDescription,如下图:

第二步:引入文件,创建编码与反编码的类

#import <CoreLocation/CoreLocation.h>
// 编码与反编码的类
@property (nonatomic, strong) CLGeocoder *geocoder;

第三步:初始化对象,创建方法,注意两个方法不要同时运行,运行时请注释一个,不想注释的话可以通过按钮点击事件来实现。

 // 初始化对象
    self.geocoder = [[CLGeocoder alloc] init];
    
    // 根据地名获取经纬度
    [self getCoordinataByAddress:@"北京"];
    
    // 根据经纬度反编码取出地名
    [self getAddressByLongitude:116 Latitude:40];
    

第四步:实现方法:根据地名获取经纬度

#pragma mark - 根据地名经纬度
- (void)getCoordinateByAddress:(NSString *)address {
    
    // 编码方法
    [_geocoder geocodeAddressString:address completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        
        // 根据返回的坐标,取出第一个位置(坐标的位置很多)
        CLPlacemark *mark = placemarks.firstObject;
        
        // 根据坐标得到location
        CLLocation *location = mark.location;
        
        // 根据mark获取区域
        CLRegion *region = mark.region;
        
        // 获取地理位置字典信息
        NSDictionary *addressDict = mark.addressDictionary;
        
        NSLog(@"地理位置:%@, 区域:%@, 地理位置信息:%@", location, region, addressDict);
    }];
    
    /*
             NSString *name=placemark.name;//地名
             NSString *thoroughfare=placemark.thoroughfare;//街道
             NSString *subThoroughfare=placemark.subThoroughfare; //街道相关信息,例如门牌等
             NSString *locality=placemark.locality; // 城市
             NSString *subLocality=placemark.subLocality; // 城市相关信息,例如标志性建筑
             NSString *administrativeArea=placemark.administrativeArea; // 州
             NSString *subAdministrativeArea=placemark.subAdministrativeArea; //其他行政区域信息
             NSString *postalCode=placemark.postalCode; //邮编
             NSString *ISOcountryCode=placemark.ISOcountryCode; //国家编码
             NSString *country=placemark.country; //国家
             NSString *inlandWater=placemark.inlandWater; //水源、湖泊
             NSString *ocean=placemark.ocean; // 海洋
             NSArray *areasOfInterest=placemark.areasOfInterest; //关联的或利益相关的地标
     */

    
    
}

实现方法:通过经纬度查找地名

#pragma mark - 通过经纬度查找地名
- (void)getAddressByLongitude:(CLLocationDegrees)longitude Latitude:(CLLocationDegrees)latitude {
    
    // 反编码
    // 创建CLLocation
    CLLocation *location = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];
    
    [_geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        
        NSDictionary *dict = placemarks.firstObject.addressDictionary;
        
        NSLog(@"反编码地理位置:%@", dict);
    }];
    
}

 

posted @ 2016-05-31 19:23  Edison666  阅读(922)  评论(0)    收藏  举报