//.h文件 #pragma mark---地理编码 - (IBAction)geocode:(UIButton *)sender; @property (strong, nonatomic) IBOutlet UITextField *addressTextField; @property (strong, nonatomic) IBOutlet UILabel *longitudeLabel; @property (strong, nonatomic) IBOutlet UILabel *latitudeLabel; @property (strong, nonatomic) IBOutlet UILabel *detailAddress; #pragma mark ----反地理编码 - (IBAction)reverseGetcode:(UIButton *)sender; @property (strong, nonatomic) IBOutlet UITextField *longitudeTextField; @property (strong, nonatomic) IBOutlet UITextField *latitudeTextfiled; @property (strong, nonatomic) IBOutlet UILabel *addressLabel;
.m文件
@interface ViewController ()<CLLocationManagerDelegate> @property(nonatomic,strong)CLLocationManager * locManager;//定位管理对象 @property(nonatomic,strong)CLGeocoder * geocoder;//编码器对象 @end
- (void)viewDidLoad {
[super viewDidLoad];
//判断ios系统的版本 如果大于8.0就要获取授权
if ([[UIDevice currentDevice].systemVersion doubleValue]>=8.0) {
//获取授权
[ self.locManager requestWhenInUseAuthorization];
}
//每隔多少米定位一次
// self.locManager.distanceFilter=10;
//定位精确度(越精确就越耗电)
// self.locManager.desiredAccuracy=kCLLocationAccuracyHundredMeters;
//开始定位
[ self.locManager startUpdatingLocation];
}
#pragma mark----实现locationManager的代理方法
#pragma mark----只要定位到用户的位置,就会调用(调用频率特别高)
//locations :装着CALocation对象
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
//1.取出位置对象
CLLocation * loc =[locations firstObject];
//2.取出经纬度
//经度
double longitude=loc.coordinate.longitude;
//纬度
double latitude=loc.coordinate.latitude;
//打印经纬度
NSLog(@"经度:%2.f 纬度:%2.f ",longitude,latitude);
//3.打印经纬度
NSLog(@"开始定位!----%@",locations);
//停止定位(省电措施:只要不想定位服务,就马上停止定位服务
[self.locManager stopUpdatingLocation];
}
//计算2个经纬度之间的直线距离
- (void)countLineDistance{
CLLocation * cation1 =[[CLLocation alloc]initWithLatitude:40 longitude:116];
CLLocation * cation2 =[[CLLocation alloc]initWithLatitude:41 longitude:116];
CLLocationDistance distance= [cation1 distanceFromLocation:cation2];
NSLog(@"%f",distance);
}
同时还要在info文件中添加 NSLocationWhenInUseUsageDescription

//懒加载
-(CLLocationManager *)locManager{
if (![CLLocationManager locationServicesEnabled]) {
return nil;
}
//判断定位管理是否存在
if (!_locManager) {
//创建定位管理者
_locManager =[[CLLocationManager alloc]init];
_locManager.delegate=self;
}
return _locManager;
}
-(CLGeocoder *)geocoder{
if (!_geocoder) {
_geocoder =[[CLGeocoder alloc]init];
}
return _geocoder;
}
地理编码(根据地址定位出经纬度)
- (IBAction)geocode:(UIButton *)sender {
if ([self.addressTextField.text length] ==0) {
return;
}
NSLog(@"%@",self.addressTextField.text );
//地理编码
[self.geocoder geocodeAddressString:self.addressTextField.text completionHandler:^(NSArray *placemarks, NSError *error) {
if (error) {//有错误(地址乱输入)
self.detailAddress.text=@"您输入的地名有错误!!";
}else{
CLPlacemark * placemark =[placemarks firstObject];
self.detailAddress.text=placemark.name;
/*
name :名称
locality:城市
county:国家
postanCode:邮政编码
*/
self.longitudeLabel.text=[NSString stringWithFormat:@"%.2f",placemark.location.coordinate.longitude ];
self.latitudeLabel.text=[NSString stringWithFormat:@"%2f",placemark.location.coordinate.latitude];
}
}];
}
效果

地理反编码 (根据经纬度定位出地址)
//反地理编码
- (IBAction)reverseGetcode:(UIButton *)sender {
NSString * longitude =self.longitudeTextField.text;
NSString * latitude =self.latitudeTextfiled.text;
if (longitude.length==0 || latitude.length==0) {
return;
}
CLLocation * location =[[CLLocation alloc]initWithLatitude:[latitude doubleValue] longitude:[longitude doubleValue]];
[self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
if (error) {
self.addressLabel.text=@"你输入的经纬度错误!!";
}else{
CLPlacemark * pm=[placemarks firstObject];
self.addressLabel.text=pm.name;
}
}];
}
效果如下图
