您的位置:首页 > 移动开发 > IOS开发

iOS定位,地图详解

2015-10-04 09:02 411 查看
定位

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 <CoreLocation/CoreLocation.h>

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当前设备前进的方向。该值为0°表示向北,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<MKAnnotation>)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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: