ios的 定位 及高德地图定位

最近休息了一段时间。老有朋友问我定位怎么做的。由于每个需求不同。总结如下。希望用到的朋友能做个参考。

关于定位可分为 普通定位和地图定位。

普通定位只需要显示城市信息或者位置信息。

地图定位需要显示并且标注大头针在地图。

其实原理是一样的。只是展示方式不同而已。

废话不多说了  附上代码

 - (id)init
{
    self = [super init];
    if (self) {
        //初始化定位
        _locationManager = [[CLLocationManager alloc] init];
        _locationManager.delegate = self;
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        _locationManager.distanceFilter = 1000.0;
        _locationSucsess = NO;
    }
    return self;
}

其次还需要考虑到版本不同的情况下

ios8的版本需要设置plist文件。

添加字段:

NSLocationAlawaysUsageDescription

NSlocationWhenInUseDescription

对应实现代码:

[locationManager requestAlwaysAuthorization];

- (void)locationManager:(CLLocationManager*)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status

  如果定位失败回掉的方法。
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
   
    NSLog(@"locError:%@", error);
    _locationSucsess = NO;
    [manager stopUpdatingLocation];
    NSLog(@"Error: %@",[error localizedDescription]);
     [[NSNotificationCenter defaultCenter]postNotificationName:@"failToLocation" object:nil];
    switch([error code]) {
        case kCLErrorDenied:
            //Access denied by user(发通知给getaround页面)
            NSLog(@"Access to Location Services denied by user");
          
            //Do something...
            break;
        case kCLErrorLocationUnknown:
            //Probably temporary...
            NSLog( @"Location data unavailable");
            //Do something else...
            break;
        default:
           NSLog( @"An unknown error has occurred");
            break;
    }
}

另外需要实现一个协议内的方法

- (void)locationManager:(CLLocationManager *)manager
 didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation;


到现在基本完成一半了。


最重要的需要提一点则是 关于地理编码 和逆向地理编码的。

经纬度信息转为位置信息。

位置信息转为经纬度信息。


这个可以根据具体需要的时候进行使用。

#pragma mark -- 根据地理位置信息获取经纬度 CLGeocoder
-(void)GetLatitudeAndLongitudeBasedOnLocation:(NSString*)loncation{
   
    CLGeocoder *myGeocoder = [[CLGeocoder alloc] init];
    [myGeocoder geocodeAddressString:loncation completionHandler:^(NSArray *placemarks, NSError *error)
     {
         if ([placemarks count] > 0 && error == nil) {
             NSLog(@"Found %lu placemark(s).", (unsigned long)[placemarks count]);
             CLPlacemark *firstPlacemark = [placemarks objectAtIndex:0];
             NSLog(@"coordAdressLongitude = %f", firstPlacemark.location.coordinate.longitude);
             NSLog(@"coordAdressLatitude = %f", firstPlacemark.location.coordinate.latitude);
                          
         }
         else if ([placemarks count] == 0 && error == nil) {
             NSLog(@"Found no placemarks.");
         }
         else if (error != nil) {
             NSLog(@"An error occurred = %@", error); }
     }];
   
}

#pragma mark -- 根据经纬度获取地理位置详细信息  CLGeocoder
-(void)GetmoreInformationInAccordanceWithTheLatitude:(CLLocationDegrees)latitude AndLongitudeLocation:(CLLocationDegrees)longitude{
   
    CLLocation *newLocation=[[CLLocation alloc]initWithLatitude:latitude longitude:longitude];
    CLGeocoder *geocoder=[[CLGeocoder alloc] init];
    [geocoder reverseGeocodeLocation:newLocation
                   completionHandler:^(NSArray *placemarks,
                                       NSError *error)
     {
         CLPlacemark *placemark=[placemarks objectAtIndex:0];
         NSLog(@"地址:%@\n country:%@\n postalCode:%@\n ISOcountryCode:%@\n ocean:%@\n inlandWater:%@\n locality:%@\n subLocality:%@ \n administrativeArea:%@\n subAdministrativeArea:%@\n thoroughfare:%@\n subThoroughfare:%@\n",
               placemark.name,
               placemark.country,
               placemark.postalCode,
               placemark.ISOcountryCode,
               placemark.ocean,
               placemark.inlandWater,
               placemark.administrativeArea,
               placemark.subAdministrativeArea,
               placemark.locality,
               placemark.subLocality,
               placemark.thoroughfare,
               placemark.subThoroughfare);
        
         
     }];
}

如果打印地理位置信息。则已经完成了定位操作。 其余的则需要根据自己的需求进行 将获取的信息存储并相应赋值即可。





你可能感兴趣的:(ios,高德地图)