码迷,mamicode.com
首页 > 其他好文 > 详细

定位地图

时间:2016-03-08 21:15:25      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:

  1.在iOSApp开发中,尤其是O2O类型的的App往往包含着定位或地图这两项功能,所以说定位和地图是iOS开发中一种常用的第三方(iOS自带高德地图)。

  2.定位:首先我们先来说说定位:废话不多说,直接上干货。

    (1)首先我们先要知道定位需要什么:

    静态包:

    技术分享

    导入#import <CoreLocation/CoreLocation.h>

    (2)代码

//宏定义
#define IS_IOS8 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) 
//声明
@property(nonatomic, strong) CLLocationManager *locationManager;
- (void)viewDidLoad {
       //定位
        _locationManager = [[CLLocationManager alloc] init];
        _locationManager.delegate = self;
        if (IS_IOS8)
        {
            [_locationManager requestAlwaysAuthorization];
            [_locationManager requestWhenInUseAuthorization];
        }
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        _locationManager.distanceFilter = kCLLocationAccuracyBest;
        [_locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    [_locationManager stopUpdatingLocation];
     CLLocation *location=[[CLLocation alloc]initWithLatitude:newLocation.coordinate.latitude longitude:newLocation.coordinate.longitude];
    self.geocoder = [[CLGeocoder alloc] init];
   [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
       if (error||placemarks.count==0) {
           [self zhHUD_showErrorWithStatus:@"你输入的地址没找到"];
       }
       else{
           //编码成功
           //显示最前面的地标信息
           CLPlacemark *firstPlacemark=[placemarks firstObject];
           //经纬度
//           CLLocationDegrees latitude=firstPlacemark.location.coordinate.latitude;
//           CLLocationDegrees longitude=firstPlacemark.location.coordinate.longitude;
           //地理位置名
           NSLog(@"name,%@",firstPlacemark.name);                       // 位置名
           NSLog(@"thoroughfare,%@",firstPlacemark.thoroughfare);       // 街道
           NSLog(@"subThoroughfare,%@",firstPlacemark.subThoroughfare); // 子街道
           NSLog(@"locality,%@",firstPlacemark.locality);               // 市
           NSLog(@"subLocality,%@",firstPlacemark.subLocality);         // 区
           NSLog(@"country,%@",firstPlacemark.country);                 // 国家
           NSLog(@"country,%@",firstPlacemark.administrativeArea);      // 省份
           _province =firstPlacemark.administrativeArea;
           _city =firstPlacemark.locality;
           //数据
           self.payBtn.enabled = YES;
           [self requestData];
       }
   }];
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    [self zhHUD_showErrorWithStatus:@"请打开你的gps"];
    self.payBtn.enabled = NO;
}

   (3)以上代码写完后,意味着定位代码已完成,但是你运行后就会发现,定位代理不会调用。我擦,坑了!好的,我们这时候需要配置plist文件

技术分享

  (4)运行代码,定位成功(必须真机)

  3.当然你如果想将定位学习透彻,你需要了解他的所有代理和属性:介绍如下()

CLLocationManager相关方法解读:

+ (BOOL)locationServicesEnabled;

判断设备是否支持定位服务

+ (BOOL)headingAvailable;

判断设备是否支持航向信息功能(海拔,速度,方向等传感器的支持)

+ (BOOL)significantLocationChangeMonitoringAvailable;

判断设备是否支持更新位置信息

+ (BOOL)isMonitoringAvailableForClass:(Class)regionClass;

判断设备是否支持区域检测,regionClass是地图框架中的类。

+ (BOOL)isRangingAvailabl;

判断设备是否支持蓝牙测距

+ (CLAuthorizationStatus)authorizationStatus;

获得定位服务的授权状态,CLAuthorizationStatus的枚举如下:

1
2
3
4
5
6
7
typedef NS_ENUM(int, CLAuthorizationStatus) {
    kCLAuthorizationStatusNotDetermined = 0,//用户还没有做选择
    kCLAuthorizationStatusRestricted,//应用拒接使用定位服务
    kCLAuthorizationStatusDenied,//用户拒绝授权
    kCLAuthorizationStatusAuthorizedAlways,//8.0后可用,始终授权位置服务
    kCLAuthorizationStatusAuthorizedWhenInUse,//8.0后可用,只在前台授权位置服务
};

@property(assign, nonatomic) CLActivityType activityType;

这个属性用来设置位置更新的模式,枚举如下:

1
2
3
4
5
6
typedef NS_ENUM(NSInteger, CLActivityType) {
    CLActivityTypeOther = 1,//未知模式,默认为此
    CLActivityTypeAutomotiveNavigation,    //车辆导航模式
    CLActivityTypeFitness,                //行人模式
    CLActivityTypeOtherNavigation         //其他交通工具模式
};

模式的应用可以起到节省电量的作用,例如车辆导航模式,当汽车停止时,位置更新服务会暂停。

@property(assign, nonatomic) CLLocationDistance distanceFilter;

设置位置更新的敏感范围,单位为米。

@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;

设置定位服务的精确度,系统定义好的几个参数如下:

kCLLocationAccuracyBestForNavigation;//导航最高精确
kCLLocationAccuracyBest;//高精确
kCLLocationAccuracyNearestTenMeters;//10米
kCLLocationAccuracyHundredMeters;//百米
kCLLocationAccuracyKilometer;//千米
kCLLocationAccuracyThreeKilometers;//三公里

@property(assign, nonatomic) BOOL pausesLocationUpdatesAutomatically;

设置位置更新是否自动暂停

@property(readonly, nonatomic, copy) CLLocation *location;

最后一次更新的位置信息,只读属性

@property(assign, nonatomic) CLLocationDegrees headingFilter;

相关航向更新的敏感范围

@property(assign, nonatomic) CLDeviceOrientation headingOrientation;

typedef NS_ENUM(int, CLDeviceOrientation) {

CLDeviceOrientationUnknown = 0,随机

CLDeviceOrientationPortrait,纵向

CLDeviceOrientationPortraitUpsideDown,纵向倒置

CLDeviceOrientationLandscapeLeft,左向横向

CLDeviceOrientationLandscapeRight,右向横向

CLDeviceOrientationFaceUp,水平屏幕向上

CLDeviceOrientationFaceDown水平屏幕

};

定位航向时的参照方向默认为正北,枚举如下:

@property(readonly, nonatomic, copy) CLHeading *heading;

最后一个定位得到的航向信息

- (void)startUpdatingLocation;

开启定位服务

- (void)stopUpdatingLocation;

停止定位服务

- (void)startUpdatingHeading;

开启航向地理信息服务

- (void)stopUpdatingHeading;

停止航向地理信息服务

三、定位服务代理的相关方法

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;

位置更新后调用的方法,数组中是所有定位到的位置信息,最后一个是最新的。

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading;

航向信息更新后调用的方法

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error;

定位异常时调用的方法

四、定位服务获取到的位置对象

上面也提到,定位后返回的数组中存放的都是CLLocation对象,这里面有很详细的位置信息,属性如下:

@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;

经纬度属性,CLLocationCoordinate2D是一个结构体,如下:

typedef struct {

CLLocationDegrees latitude;

CLLocationDegrees longitude;

} CLLocationCoordinate2D;

@property(readonly, nonatomic) CLLocationDistance altitude;

海拔高度,浮点型

@property(readonly, nonatomic) CLLocationAccuracy horizontalAccuracy;

水平方向的容错半径

@property(readonly, nonatomic) CLLocationAccuracy verticalAccuracy;

竖直方向的容错半径

@property(readonly, nonatomic) CLLocationDirection course;

设备前进的方向,取值范围为0-359.9,相对正北方向

@property(readonly, nonatomic) CLLocationSpeed speed;

速度,单位为m/s

@property(readonly, nonatomic, copy) NSDate *timestamp;

定位时的时间戳

五、航标定位得到的航标信息对象

CLHeading对象的属性信息:

@property(readonly, nonatomic) CLLocationDirection magneticHeading;

设备朝向航标方向,0为北磁极。

@property(readonly, nonatomic) CLLocationDirection trueHeading;

设备朝向真实方向,0被地理上的北极

@property(readonly, nonatomic) CLLocationDirection headingAccuracy;

方向偏差

@property(readonly, nonatomic) CLHeadingComponentValue x;

x轴的方向值

@property(readonly, nonatomic) CLHeadingComponentValue y;

y轴方向值

@property(readonly, nonatomic) CLHeadingComponentValue z;

z轴方向值

@property(readonly, nonatomic, copy) NSDate *timestamp;

方向定位时间戳

 

    

定位地图

标签:

原文地址:http://www.cnblogs.com/YU411524/p/5228146.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!