iOS定位,地图详解

定位

LBS: location Based Service (基于定位服务)位置服务

要实现地图、导航功能,首先要熟悉定位功能,苹果提供给咱们 CoreLocation 框架进行定位CoreLocation 可以独立使用

Core Location 中主要包含了 定位、地理编码、地理反编码 功能

CoreLocation 框架中的所有数据类型都是以 CL开头

CoreLocation 这个类里面 封装了位置 和 高度信息


1,地理编码与反地理编码

     (1)地理编码

          地理位置(通过地理位置的字符串)得到这个指定位置的物理位置(物理位置即经纬度、海拔等)

      (2)反地理编码

          与地理编码相反,通过 经纬度 得到具体的字符串的位置(具体位置名,地名)


2,经纬度

本初子午线:穿过英国伦敦格林文治天文台

往东,东经(E)

往西,西经(W)

东西经各 180度,共360°


赤道:(0°纬度)

往北,北纬(N)

往南,南纬(S)

南北纬各90°,共180°


在iOS代码中使用 CoreLocationCoordinate2D来表示 经纬度

typedef struct {

CLLocationDegrees latitude;纬度

CLLocationDegrees longitude;经度

}CLLocationCoordinate2D;



3,定位

   (1)使用定位之前,需要先判断用户是否打开了定位服务

          locationServicesEnabled
     (2)向用户说明为是什么要使用定位服务,(苹果会自动弹出一个窗口,提示用户,需要使用定位服务)

         由于位置信息 是用户的隐私,需要用户去授权 ,这里系统也会自动弹出一个对话框 让用户授权

      在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy - Location Usage     Description)key 写为什么让用户打开定位

判断用户是否开启了定位功能

 在使用定位服务的时候,我们需要获取用户是否在手机里开启了定位功能



判读用户是否开启定位服务的具体实现

使用定位服务前,要先导入  

#import


      1,用户是否打开了定位服务

       BOOL isOpen = [CLLocationaManagerlocationServicesEnabled];

       if (!isOpen) {

       UIAlertView *alert = [[UIAlertViewalloc]initWithTitle:nilmessage:@"请在设置中打开定位服务"delegate:selfcancelButtonTitle:@"OK"otherButtonTitles:nil,nil];

    [alert show];

     return;

}


   2,初始化定位服务的对象

    manager = [[CLLocationManager alloc]init];


    

    info.plist里面设置 key  value的时候,一定要和代理里面相对应

    当使用的时候 用户允许咱们使用定位

    [manager requestWhenInUseAuthorization];

//   一直使用定位功能

//    [manager requestAlwaysAuthorization];




//   使用定位服务非常耗电

//   所以 当在使用完定位服务后 ,需要把定位服务关闭(节省电量)



 

让系统帮助管理定位的开关

    manager.pausesLocationUpdatesAutomatically = YES;



//设置定位精准度,(注意越精准越耗电,这里我设置为最精确)

manager.desiredAccuracy = kCLLocationAccuracyBest;


// 设置多少米更新一次(处理设置的范围Location) 位置 Location

//  distanceFilter当获取到位置 或者更新位置的时候 会调⽤用代理⽅方法 

manager.distanceFilter = 500;

//当获取到位置 或者 更新新位置的时候 会调用代理方法 -(void)locationManager:(CLLocationManager *)manager

     didUpdateLocations:(NSArray *)locations;


manager.delegate = self;







获取最新的位置

CLLocation *curLocation  = [locations lastObject];

通过location获得到 当前位置的经纬度

CLLocationCoordinate2D curCoordinate2D = curLocation.coordinate;


获得当前的⾼高度verticalAccuracy (负数的时候 是不能获取到 海拔的精准度)

CLLocationAccuracy curAccuracy = curLocation.verticalAccuracy;


通过location 更新位置的时间 (nsdate)可以通过更新时间计算出 行驶的速度

NSDate *updateTime = curLocation.timestamp;


 获得当前的行驶速度

double speed = curLocation.speed;


如果在室内可以检测到用户在几楼<8.0之后>

    CLFloor *curFloor = curLocation.floor;


 

获得航向航向是double 类型的

//    course当前设备前进的方向。该值为表示向北,90°表示向东,180°表示向南,270°表示向西

    CLLocationDirection curDirection = curLocation.course;

//    获得当前的高度 verticalAccuracy  (负数的时候是不能获取到 海拔的精准度)

    CLLocationAccuracy curAccuracy = curLocation.verticalAccuracy;


获得海拔的高度

    double aititude = curLocation.altitude;



开启更新定位

    [manager startUpdatingLocation];


 关闭定位

    [manager stopUpdatingLocation];





地图

MKMapTypeStandard = 0,默认MKMapTypeSatellite,卫星MKMapTypeHybrid鸟瞰

*/
myMapView.mapType = MKMapTypeStandard;
 设置是否允许⽤用户旋转地图
myMapView.rotateEnabled = YES;
 设置是否允许放⼤大或者缩⼩小地图
myMapView.zoomEnabled = YES;

设置是否允许地图滚动

myMapView.scrollEnabled = YES;

设置是否有3D效果myMapView.pitchEnabled = YES;

设置是否显⽰示⽤用户的位置

使⽤用地图 需要导⼊入MapKit同样也需要 请求⽤用户授权

CoreLocation是数据类,定位信息 ,地理编码 ,翻地编码mapKit控件 显⽰示在屏幕上的视图
MK开头
地图:
MKMapView


MKMapTypeStandard = 0,默认MKMapTypeSatellite,卫星MKMapTypeHybrid鸟瞰

*/
myMapView.mapType = MKMapTypeStandard;
 设置是否允许⽤用户旋转地图
myMapView.rotateEnabled = YES;
 设置是否允许放⼤大或者缩⼩小地图
myMapView.zoomEnabled = YES;

设置是否允许地图滚动

myMapView.scrollEnabled = YES;

设置是否有3D效果myMapView.pitchEnabled = YES;

设置是否显⽰示⽤用户的位置

myMapView.showsUserLocation = YES;

设置⽤用户 移动地图的样式

MKUserTrackingModeNone = 0,不跟踪⽤用户的轨迹

MKUserTrackingModeFollow,跟踪⽤用户轨迹 地图移动

MKUserTrackingModeFollowWithHeading,跟踪⽤用户轨迹,地图移动,并且航向也跟随变化

 */
  myMapView.userTrackingMode  = MKUserTrackingModeFollow;
 设置是否显⽰示附近的建筑物(必须在普通样式,鸟瞰样式有效)
myMapView.showsBuildings = YES;

是否允许使⽤用兴趣点 必须在 普通样式 鸟瞰 样式 有效

/*

坐标转点

         - (CGPoint)convertCoordinate:(CLLocationCoordinate2D)coordinate toPointToView:
(UIView *)view;

点转坐标

         - (CLLocationCoordinate2D)convertPoint:(CGPoint)point toCoordinateFromView:(UIView
*)view;

区域范围转CGRect
- (CGRect)convertRegion:(MKCoordinateRegion)region toRectToView:(UIView *)view;CGRect
转 区域范围

         - (MKCoordinateRegion)convertRect:(CGRect)rect toRegionFromView:(UIView *)view;

经纬度变化的⽐比例范围

     typedef struct {
     CLLocationDegrees latitudeDelta;
     CLLocationDegrees longitudeDelta;
     } MKCoordinateSpan;
  • //  区域范围

  • //  center为中⼼心span为⽐比例typedef struct {CLLocationCoordinate2D center;MKCoordinateSpan span;

         } MKCoordinateRegion;
    

    ⾃自定义⼤大头针:

    - (instancetype)initWithAnnotation:(id)annotation reuseIdentifier:(NSString
    *)reuseIdentifier
    {
    
        self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
        if (self) {
    
            self.image = [UIImage imageNamed:@"{)}4%0JTT7}4720(`AFJ1HD.jpg"];
    

// annotation⼤大头针数据self.annotation = annotation;

// canShowCallout是否可以显⽰示 ⼤大头针上⾯面的标题 副标题 。。。
self.canShowCallout = YES;
//
设置⼤大头针上⾯面显⽰示详情的左侧视图
UIImageView *iamgeView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 100,

50)];
        iamgeView.image = [UIImage imageNamed:@"BR3}A`NYWPET~UV%}~KME01.jpg"];
        self.leftCalloutAccessoryView = iamgeView;
        self.draggable = NO;
    }
    return self;



你可能感兴趣的:(iOS)