美文网首页
iOS 定位坐标

iOS 定位坐标

作者: 码农耕 | 来源:发表于2019-05-27 17:00 被阅读0次

    1.CoreLocation:CLLocationManager

    /**
     *  懒加载
     */
    - (CLLocationManager *)locationManager
    {
        if (!_locationManager) {
            _locationManager = [[CLLocationManager alloc] init];
            _locationManager.delegate = self;
            // 定位精准度
            _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
            // 重新定位的距离
            _locationManager.distanceFilter = 50.0f;
        }
        return _locationManager;
    }
    
    /**
     *  开始加载
     */
    - (void)startLocation
    {
        // 判断定位操作是否被允许
        if (![CLLocationManager locationServicesEnabled]) {
            return;
        }
        // ios8后需要向用户请求权限
        [self.locationManager requestWhenInUseAuthorization];
        [self.locationManager requestAlwaysAuthorization];
        // 开始定位
        [self.locationManager startUpdatingLocation];
    }
    
    
    /**
     *  代理方法获取到地理位置
     */
    - (void)locationManager:(CLLocationManager *)manager
         didUpdateLocations:(NSArray<CLLocation *> *)locations
    {
            CLLocation *location = [locations lastObject];
        CLLocationCoordinate2D coor = location.coordinate;
        //    NSLog(@"纬度:%.6f 经度%.6f", coor.latitude, coor.longitude);
        NSString *x1 = [NSString stringWithFormat:@"%f", coor.longitude];
        NSString *y1 = [NSString stringWithFormat:@"%f", coor.latitude];
        
        [self getAddressWithCoordinate: coor];
    }
    
    #pragma mark - 经纬度转地址
    - (void)getAddressWithCoordinate:(CLLocationCoordinate2D)coor
    {
        if (coor.latitude == 0 || coor.longitude == 0){
            NSLog(@"经纬度为空");
            return;
        }
        
        // 获取当前所在的城市名
        CLGeocoder *geocoder = [[CLGeocoder alloc] init];
        CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:coor.latitude longitude:coor.longitude];
        //根据经纬度反向地理编译出地址信息
        [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *array, NSError *error)
         {
             if (array.count > 0)
             {
                 CLPlacemark *placemark = array.firstObject;
                 
                 NSLog(@"%@",placemark);
                 
                 //获取城市
                 NSString *city = placemark.locality;
                 if (!city) {
                     //四大直辖市的城市信息无法通过locality获得,只能通过获取省份的方法来获得(如果city为空,则可知为直辖市)
                     city = placemark.administrativeArea;
                 }
             }
             
         }];
    }
    
    /**
     *  停止定位
     */
    [self.locationManager stopUpdatingLocation];
    
    

    注意:国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密。百度坐标在此基础上,进行了BD-09二次加密措施,更加保护了个人隐私。百度对外接口的坐标系并不是GPS采集的真实经纬度,需要通过坐标转换接口进行转换。

    2.MKMapView<MKMapViewDelegate>

    -(void)startLocation
    {
        if (_mapView) {
            _mapView = nil;
        }
        
        _mapView = [[MKMapView alloc] init];
        _mapView.delegate = self;
        _mapView.showsUserLocation = YES;
    }
    
    -(void)stopLocation
    {
        _mapView.showsUserLocation = NO;
        _mapView = nil;
    }
    
    - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
    {
        CLLocation * newLocation = userLocation.location;
    
        CLGeocoder *clGeoCoder = [[CLGeocoder alloc] init];
        CLGeocodeCompletionHandler handle = ^(NSArray *placemarks,NSError *error)
        {
            for (CLPlacemark * placeMark in placemarks)
            {
                NSDictionary *addressDic=placeMark.addressDictionary;
                
                NSString *state=[addressDic objectForKey:@"State"];
                NSString *city=[addressDic objectForKey:@"City"];
                NSString *subLocality=[addressDic objectForKey:@"SubLocality"];
                NSString *street=[addressDic objectForKey:@"Street"];
                
                [self stopLocation];
            }
            
        };
        
        [clGeoCoder reverseGeocodeLocation:newLocation completionHandler:handle];
    }
    
    - (void)mapView:(MKMapView *)mapView didFailToLocateUserWithError:(NSError *)error
    {
        [self stopLocation];
    }
    
    

    实测使用MKMapView获取到的地址是比较精准的。

    最后别忘记添加隐私权限:
    requestAlwaysAuthorization : 请求获得应用一直使用定位服务授权,注意使用此方法前要在info.plist中配置NSLocationAlwaysUsageDescription
    requestWhenInUseAuthorization : 请求获得应用使用时的定位服务授权,注意使用此方法前在要在info.plist中配置NSLocationWhenInUseUsageDescription

    相关文章

      网友评论

          本文标题:iOS 定位坐标

          本文链接:https://www.haomeiwen.com/subject/nxzhtctx.html