iOS地图定位

一、定位。
1),iOS8以后,请求定位时候,需要在info.plist文件里加入一个字段。
//NSLocationAlwaysUsageDescription(一直定位,后台的也能定位)
//NSLocationWhenInUseUsageDescription(使用的时候定位)
2),如果需要使用定位,需要导入CoreLocation框架。

import

遵守代理
_locationManager.delegate = self;

初始化定位管理器


    _locationManager = [[CLLocationManager alloc] init];
    //在ios8以后,请求定位需要调用下面的方法
    //做版本判断是因为低版本调用高版本的方法,会出现崩溃
    if ([[[UIDevice currentDevice] systemVersion] floatValue]>=8.0) {
        //一直定位
        [_locationManager requestAlwaysAuthorization];
        //用时定位
        [_locationManager requestWhenInUseAuthorization];
    }
    //当用户移动50米时,会调用一次代理方法[定位一次]
    
    _locationManager.distanceFilter = 50;
    //设置定位的精确度,精确度越高,越费电
    _locationManager.desiredAccuracy = kCLLocationAccuracyBest;

实现代理方法

    。
//授权结果
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{
    if (status == kCLAuthorizationStatusNotDetermined) {
        NSLog(@"等待用户授权");
    }else if(status == kCLAuthorizationStatusAuthorizedAlways ||
             status == kCLAuthorizationStatusAuthorizedWhenInUse){
        NSLog(@"授权成功");
        //开始更新用户的位置信息,一旦调用了这个方法,就会不断地获取用户的位置信息
        [_locationManager startUpdatingLocation];
        
    }else{
        NSLog(@"授权失败");
    }
}
//定位成功
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    //数组中最后的元素是最新的定位
    //拿到用户最新的位置信息
    //按时间排序,如果想要拿到最新的位置信息,如果想要拿到最新的位置信息,直接拿到最后一个
    CLLocation *currentLocation = [locations lastObject];
    //把最新的位置信息赋值给_location
    _location = currentLocation;
    
    //比如:获取用户所在的城市,只需要一次
    //停止更新用户的位置信息
//    [manager stopUpdatingLocation];
}

//定位失败
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    
    NSLog(@"失败");
    NSLog(@"%@",error.userInfo);
}

正向地理编码

地址转换为经纬度称为正向地理编码

//创建编码对象
 CLGeocoder *geoCoder = [[CLGeocoder alloc] init];
    //正向地理编码
    NSString *str = @"地址字符串";
    [geoCoder geocodeAddressString:str completionHandler:^(NSArray * _Nullable placemarks, NSError * _Nullable error) {
        if (placemarks.count == 0) {
            return ;
        }
        CLPlacemark *placeMark = [placemarks lastObject];
       
        NSLog(@"纬度%lf",placeMark.location.coordinate.latitude);
        NSLog(@"经度%lf",placeMark.location.coordinate.longitude);
    }];

反向地理编码

将经纬度转换成详细的地址。

//创建编码对象
    CLGeocoder *geoCoder = [[CLGeocoder alloc] init];
    //反向地理变量    
//_location :一个地理位置的
    [geoCoder reverseGeocodeLocation:_location completionHandler:^(NSArray * _Nullable placemarks, NSError * _Nullable error) {
        if (placemarks.count == 0) {
            return ;
        }
        //地标  里面封住了详细的地址信息
        CLPlacemark *placeMark = placemarks[0];
        NSLog(@"%@",placeMark.addressDictionary);
        //addressDictionary  详细的位置信息
    }];

通过两个地理位置计算之间距离

CLLocation *location1 = [[CLLocation alloc] initWithLatitude:34.772108 longitude:113.675915];
    CLLocation *location2 = [[CLLocation alloc] initWithLatitude:34.772478 longitude:113.678005];
    
    //计算两个经纬度之间的距离 单位是米
    CLLocationDistance distance = [location1 distanceFromLocation:location2];

你可能感兴趣的:(iOS地图定位)