地理编码与反地理编码

483 阅读3分钟
#import "ViewController.h"
#import <Masonry/Masonry.h>
#import <CoreLocation/CoreLocation.h>

@interface ViewController ()

@property(nonatomic,strong)CLGeocoder *geocoder;

///地理编码
@property (nonatomic, strong) UIButton *geoCodeSurebutton;
@property (nonatomic, strong) UILabel *geoCodeTitleLabel;
@property (nonatomic, strong) UILabel *geoCodeTipLabel;
@property (nonatomic, strong) UITextField *geoCodeTextField;
@property (nonatomic, strong) UILabel *geoCodeDetailLable;

///反地理编码
@property (nonatomic, strong) UIButton *geoDecodeSurebutton;
@property (nonatomic, strong) UILabel *geoDecodeTitleLabel;
@property (nonatomic, strong) UILabel *geoDecodeLongLabel;
@property (nonatomic, strong) UITextField *geoDecodeLongTextField;
@property (nonatomic, strong) UILabel *geoDecodeLatLabel;
@property (nonatomic, strong) UITextField *geoDecodeLatTextField;
@property (nonatomic, strong) UILabel *geoDecodeDetailLable;

@end

@implementation ViewController

#pragma mark-懒加载
- (CLGeocoder *)geocoder {
    if (!_geocoder){
        _geocoder=[[CLGeocoder alloc] init];
    }
    return _geocoder;
}

- (void)viewDidLoad {
    [super viewDidLoad];
   
    [self setupView];
}

#pragma mark - # Event Response
- (void)geoCodeSurebuttonTouchUpInside:(UIButton *)sender {
    //1.获得输入的地址
    NSString *address = self.geoCodeTextField.text;
    if (address.length == 0) return;
    
    //2.开始地理编码
    //说明:调用下面的方法开始编码,不管编码是成功还是失败都会调用block中的方法
    [self.geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {
        //如果有错误信息,或者是数组中获取的地名元素数量为0,那么说明没有找到
        if (error || placemarks.count==0) {
            self.geoCodeDetailLable.text=@"你输入的地址没找到,可能在月球上";
        }else{
            //  编码成功,找到了具体的位置信息
            //打印查看找到的所有的位置信息
            /*
             name:名称
             locality:城市
             country:国家
             postalCode:邮政编码
             */
            for (CLPlacemark *placemark in placemarks) {
                NSLog(@"name=%@ locality=%@ country=%@ postalCode=%@",placemark.name,placemark.locality,placemark.country,placemark.postalCode);
            }
            
            //取出获取的地理信息数组中的第一个显示在界面上
            CLPlacemark *firstPlacemark = [placemarks firstObject];
            
            //纬度
            CLLocationDegrees latitude = firstPlacemark.location.coordinate.latitude;
            //经度
            CLLocationDegrees longitude = firstPlacemark.location.coordinate.longitude;
            //详细地址名称
            self.geoCodeDetailLable.text = [NSString stringWithFormat:@"详细地址:%@ 纬度:%@ 经度:%@",firstPlacemark.name,[NSString stringWithFormat:@"%.2f",latitude],[NSString stringWithFormat:@"%.2f",longitude]];
        }
    }];
}

- (void)geoDecodeSurebuttonTouchUpInside:(UIButton *)sender {
    //1.获得输入的经纬度
    NSString *longtitudeText = self.geoDecodeLongTextField.text;
    NSString *latitudeText = self.geoDecodeLatTextField.text;
    if (longtitudeText.length == 0 || latitudeText.length == 0) return;
    
    CLLocationDegrees latitude = [latitudeText doubleValue];
    CLLocationDegrees longitude = [longtitudeText doubleValue];
    
    CLLocation *location = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];
    //2.反地理编码
    [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
        if (error || placemarks.count == 0) {
            self.geoDecodeDetailLable.text = @"你输入的地址没找到,可能在月球上";
        }else{//编码成功
            //显示最前面的地标信息
            CLPlacemark *firstPlacemark = [placemarks firstObject];
            self.geoDecodeDetailLable.text = firstPlacemark.name;
            //经纬度
            CLLocationDegrees latitude = firstPlacemark.location.coordinate.latitude;
            CLLocationDegrees longitude = firstPlacemark.location.coordinate.longitude;
            self.geoDecodeLatTextField.text = [NSString stringWithFormat:@"%.2f",latitude];
            self.geoDecodeLongTextField.text = [NSString stringWithFormat:@"%.2f",longitude];
        }
    }];
}

- (void)setupView {
    ///地理编码
    [self.view addSubview:self.geoCodeTitleLabel];
    [self.view addSubview:self.geoCodeSurebutton];
    [self.view addSubview:self.geoCodeTipLabel];
    [self.view addSubview:self.geoCodeTextField];
    [self.view addSubview:self.geoCodeDetailLable];
    ///反地理编码
    [self.view addSubview:self.geoDecodeTitleLabel];
    [self.view addSubview:self.geoDecodeSurebutton];
    [self.view addSubview:self.geoDecodeLongLabel];
    [self.view addSubview:self.geoDecodeLongTextField];
    [self.view addSubview:self.geoDecodeLatLabel];
    [self.view addSubview:self.geoDecodeLatTextField];
    [self.view addSubview:self.geoDecodeDetailLable];
    [self p_addMasonry];
}

#pragma mark - # Private Methods
- (void)p_addMasonry {
    ///地理编码
    [self.geoCodeTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(100);
        make.left.mas_equalTo(0);
        make.right.mas_equalTo(-100);
        make.height.mas_equalTo(26);
    }];
    
    [self.geoCodeSurebutton mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(self.geoCodeTitleLabel.mas_top);
        make.width.mas_equalTo(80);
        make.right.mas_equalTo(-10);
        make.height.mas_equalTo(26);
    }];

    [self.geoCodeTipLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(self.geoCodeTitleLabel.mas_bottom).mas_offset(10);
        make.left.mas_equalTo(10);
        make.width.mas_equalTo(60);
        make.height.mas_equalTo(26);
    }];

    [self.geoCodeTextField mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(self.geoCodeTitleLabel.mas_bottom).mas_offset(10);
        make.left.mas_equalTo(self.geoCodeTipLabel.mas_right).mas_offset(10);
        make.right.mas_equalTo(-10);
        make.height.mas_equalTo(26);
    }];

    [self.geoCodeDetailLable mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(self.geoCodeTextField.mas_bottom).mas_offset(10);
        make.left.mas_equalTo(10);
        make.right.mas_equalTo(-10);
    }];
    
    
    ///反地理编码
    [self.geoDecodeTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(self.geoCodeDetailLable.mas_bottom).mas_offset(10);
        make.left.mas_equalTo(0);
        make.right.mas_equalTo(-100);
        make.height.mas_equalTo(26);
    }];
    
    [self.geoDecodeSurebutton mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(self.geoDecodeTitleLabel.mas_top);
        make.width.mas_equalTo(80);
        make.right.mas_equalTo(-10);
        make.height.mas_equalTo(26);
    }];

    [self.geoDecodeLongLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(self.geoDecodeTitleLabel.mas_bottom).mas_offset(10);
        make.left.mas_equalTo(10);
        make.width.mas_equalTo(60);
        make.height.mas_equalTo(26);
    }];

    [self.geoDecodeLongTextField mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(self.geoDecodeLongLabel.mas_top);
        make.left.mas_equalTo(self.geoDecodeLongLabel.mas_right).mas_offset(10);
        make.width.mas_equalTo(60);
        make.height.mas_equalTo(26);
    }];
    
    [self.geoDecodeLatLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(self.geoDecodeLongLabel.mas_top);
        make.left.mas_equalTo(self.geoDecodeLongTextField.mas_right).mas_offset(10);
        make.width.mas_equalTo(60);
        make.height.mas_equalTo(26);
    }];

    [self.geoDecodeLatTextField mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(self.geoDecodeLongLabel.mas_top);
        make.left.mas_equalTo(self.geoDecodeLatLabel.mas_right).mas_offset(10);
        make.width.mas_equalTo(60);
        make.height.mas_equalTo(26);
    }];

    [self.geoDecodeDetailLable mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(self.geoDecodeLongLabel.mas_bottom).mas_offset(10);
        make.left.mas_equalTo(10);
        make.right.mas_equalTo(-10);
    }];
}

#pragma mark - # 地理编码
- (UILabel *)geoCodeTitleLabel {
    if (!_geoCodeTitleLabel) {
        _geoCodeTitleLabel = [[UILabel alloc] init];
        _geoCodeTitleLabel.font = [UIFont systemFontOfSize:18.0f weight:UIFontWeightMedium];
        _geoCodeTitleLabel.text = @"\u3000\u3000\u3000\u3000地理编码";
    }
    return _geoCodeTitleLabel;
}

- (UIButton *)geoCodeSurebutton {
    if (!_geoCodeSurebutton) {
        _geoCodeSurebutton = [[UIButton alloc] init];
        [_geoCodeSurebutton addTarget:self action:@selector(geoCodeSurebuttonTouchUpInside:) forControlEvents:UIControlEventTouchUpInside];
        _geoCodeSurebutton.layer.cornerRadius = 13.0f;
        _geoCodeSurebutton.layer.masksToBounds = YES;
        _geoCodeSurebutton.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:0.1];
        [_geoCodeSurebutton setTitle:@"确定" forState:UIControlStateNormal];
    }
    return _geoCodeSurebutton;
}

- (UILabel *)geoCodeTipLabel {
    if (!_geoCodeTipLabel) {
        _geoCodeTipLabel = [[UILabel alloc] init];
        _geoCodeTipLabel.font = [UIFont systemFontOfSize:16.0f weight:UIFontWeightMedium];
        _geoCodeTipLabel.text = @"地址";
        _geoCodeTipLabel.textAlignment = NSTextAlignmentCenter;
    }
    return _geoCodeTipLabel;
}

- (UITextField *)geoCodeTextField {
    if (!_geoCodeTextField) {
        _geoCodeTextField = [[UITextField alloc] init];
        _geoCodeTextField.layer.borderWidth = 1.0f;
        _geoCodeTextField.layer.borderColor = [UIColor orangeColor].CGColor;
        _geoCodeTextField.layer.cornerRadius = 3.0f;
        _geoCodeTextField.layer.masksToBounds = YES;
    }
    return _geoCodeTextField;
}

- (UILabel *)geoCodeDetailLable {
    if (!_geoCodeDetailLable) {
        _geoCodeDetailLable = [[UILabel alloc] init];
        _geoCodeDetailLable.backgroundColor = [[UIColor orangeColor] colorWithAlphaComponent:0.1];
        _geoCodeDetailLable.textAlignment = NSTextAlignmentCenter;
        _geoCodeDetailLable.numberOfLines = 0;
    }
    return _geoCodeDetailLable;
}

#pragma mark - # 反地理编码
- (UILabel *)geoDecodeTitleLabel {
    if (!_geoDecodeTitleLabel) {
        _geoDecodeTitleLabel = [[UILabel alloc] init];
        _geoDecodeTitleLabel.font = [UIFont systemFontOfSize:18.0f weight:UIFontWeightMedium];
        _geoDecodeTitleLabel.text = @"\u3000\u3000\u3000\u3000反地理编码";
    }
    return _geoDecodeTitleLabel;
}

- (UIButton *)geoDecodeSurebutton {
    if (!_geoDecodeSurebutton) {
        _geoDecodeSurebutton = [[UIButton alloc] init];
        [_geoDecodeSurebutton addTarget:self action:@selector(geoDecodeSurebuttonTouchUpInside:) forControlEvents:UIControlEventTouchUpInside];
        _geoDecodeSurebutton.layer.cornerRadius = 13.0f;
        _geoDecodeSurebutton.layer.masksToBounds = YES;
        _geoDecodeSurebutton.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:0.1];
        [_geoDecodeSurebutton setTitle:@"确定" forState:UIControlStateNormal];
    }
    return _geoDecodeSurebutton;
}

- (UILabel *)geoDecodeLongLabel {
    if (!_geoDecodeLongLabel) {
        _geoDecodeLongLabel = [[UILabel alloc] init];
        _geoDecodeLongLabel.font = [UIFont systemFontOfSize:16.0f weight:UIFontWeightMedium];
        _geoDecodeLongLabel.text = @"经度:";
        _geoDecodeLongLabel.textAlignment = NSTextAlignmentCenter;
    }
    return _geoDecodeLongLabel;
}

- (UITextField *)geoDecodeLongTextField {
    if (!_geoDecodeLongTextField) {
        _geoDecodeLongTextField = [[UITextField alloc] init];
        _geoDecodeLongTextField.layer.borderWidth = 1.0f;
        _geoDecodeLongTextField.layer.borderColor = [UIColor orangeColor].CGColor;
        _geoDecodeLongTextField.layer.cornerRadius = 3.0f;
        _geoDecodeLongTextField.layer.masksToBounds = YES;
    }
    return _geoDecodeLongTextField;
}

- (UILabel *)geoDecodeLatLabel {
    if (!_geoDecodeLatLabel) {
        _geoDecodeLatLabel = [[UILabel alloc] init];
        _geoDecodeLatLabel.font = [UIFont systemFontOfSize:16.0f weight:UIFontWeightMedium];
        _geoDecodeLatLabel.text = @"纬度:";
        _geoDecodeLatLabel.textAlignment = NSTextAlignmentCenter;
    }
    return _geoDecodeLatLabel;
}

- (UITextField *)geoDecodeLatTextField {
    if (!_geoDecodeLatTextField) {
        _geoDecodeLatTextField = [[UITextField alloc] init];
        _geoDecodeLatTextField.layer.borderWidth = 1.0f;
        _geoDecodeLatTextField.layer.borderColor = [UIColor orangeColor].CGColor;
        _geoDecodeLatTextField.layer.cornerRadius = 3.0f;
        _geoDecodeLatTextField.layer.masksToBounds = YES;
    }
    return _geoDecodeLatTextField;
}

- (UILabel *)geoDecodeDetailLable {
    if (!_geoDecodeDetailLable) {
        _geoDecodeDetailLable = [[UILabel alloc] init];
        _geoDecodeDetailLable.backgroundColor = [[UIColor orangeColor] colorWithAlphaComponent:0.1];
        _geoDecodeDetailLable.textAlignment = NSTextAlignmentCenter;
        _geoDecodeDetailLable.numberOfLines = 0;
    }
    return _geoDecodeDetailLable;
}

@end