标签:
定位
1. LBS (Location Based Service)
基于位置的服务,它是通过电信移动运营商的无线电通讯网络(如GSM网、CDMA网)或外部定位方式(如GPS)获取移动终端用户的位置信息),在地理信息系统(GIS、外语全称:Geographic Information System)平台的支持下,为用户提供相应服务的一种增值业务。
2. iOS 定位服务
需要引入CoreLocation.framework
[此框架不仅提供定位,还有地理编码,包括反编码功能]
在程序需要使用定位的地方 #import <CoreLocation/CoreLocation.h>
需使用的类:CLLocationManager 位置管理器
> 需实现 CLLocationManagerDelegate 协议的方法
> 定义CLLocationManager 为属性对象
> 初始化 CLLocationManager
[[CLLocationManager alloc] init]
> 指定其代理对象 .delegate
> 设置位置管理器的精度
locationManager.desiredAccuracy
可选值:精度越高,耗电越大
kCLLocationAccuracyBestForNavigation 最高精度,这种级别用于导航程序
kCLLocationAccuracyBest 最高精度
kCLLocationAccuracyHundredMeters 精度为100米内
kCLLocationAccuracyKilometer 精度到公里范围内
kCLLocationAccuracyNearestTenMeters 精度到10米内
kCLLocationAccuracyThreeKilometers 精度到3公里范围内
> 设置距离筛选值
locationManager.distanceFilter
作用是移动一段距离后,当移动距离大于距离筛选值时,通知代理对象更新位置。但若此值设置的过小,会导致频繁的更新,耗电大。可以设置没有筛选值 ,即:kCLDistanceFilterNone
> ios8开始增加了定位授权方法
// 先判断当前设备系统版本是否>= 8.0 ,通过[UIDevice currentDevice].systemVersion
// 询问授权方式,两种
a. 是否允许在使用应用时访问用户的位置
[locationMannager requestWhenInUseAuthorization];
同时需要在info.plist中添加设置项 NSLocationWhenInUseUsageDescription 显示在授权框里的内容
b. 是否允许无论时使用还是关闭应用时访问用户位置
[locationMannager requestAlwaysAuthorization];
同时需要在info.plist中添加设置项 NSLocationAlwaysUsageDescription 显示在授权框里的内容
> 开启更新位置
[locationMannager startUpdatingLocation];
// 停止更新位置
[_locationMannager stopUpdatingLocation]
> 实现协议方法
// 获取到定位位置信息
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
在此方法中从位置信息里获取经纬度
CLLocationCoordinate2D coordinate = location.coordinate; // 获取坐标
CLLocationDegrees longitude = coordinate.longitude; // 经度
CLLocationDegrees latitude = coordinate.latitude; // 纬度
// 定位失败
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
> 在当前视图控制器页面将要消失时 停止更新位置
// 停止更新位置
[_locationMannager stopUpdatingLocation]
iOS自带地图====================================================
1. iOS自带地图库 MapKit.framework
使用地图功能需要先熟悉定位功能,即 CoreLocation 框架下的定位。它和地图开发框架独立,两者一般配合使用。
1).初始化地图
[[MKMapView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
_mapView.delegate = self;
跟踪显示用户的位置 (需要权限)
设置MKMapView的userTrackingMode属性可以跟踪显示用户的当前位置
MKUserTrackingModeNone :不跟踪用户的位置
MKUserTrackingModeFollow :跟踪并在地图上显示用户的当前位置
MKUserTrackingModeFollowWithHeading :跟踪并在地图上显示用户的当前位 置,地图会跟随用户的前进方向进行旋转
3).地图的类型
_mapView.mapType = MKMapTypeStandard;
4).表示经纬度的结构体CLLocationCoordinate2D
CLLocationCoordinate2DMake(22.28468100, 114.15817700);
5).表示经纬度跨度的结构体MKCoordinateSpan
MKCoordinateSpanMake(0.03, 0.03);
6).表示范围的结构体MKCoordinateRegion
MKCoordinateRegionMake(coordinate, span);
7).设置地图的显示范围
[_mapView setRegion:region animated:YES];
8). 地图定位协议方法
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
2.标注(大头针)
必须实现遵循MKAnnotation 协议的标注类
1).添加标注
[_mapView addAnnotation:ann];
2).标注显示的代理函数
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation;
3).标注复用
[mapView dequeueReusableAnnotationViewWithIdentifier:@"Pin"];
4).标注创建
[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Pin"];
5).标注配置
pin.image // 设置标注图标
pin.canShowCallout // 设置点击标注是否显示气泡
pin.calloutOffset // 调整气泡的位置
pin.leftCalloutAccessoryView // 设置气泡的左边图标
pin.rightCalloutAccessoryView // 设置气泡的右边图标
3. POI热点/兴趣点搜索
POI是“Point of Interest”的缩写,中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。
相关结构体:
MKCoordinateRegion
MKCoordinateSpan
CLLocationCoordinate2D
1).创建搜索请求
[[MKLocalSearchRequest alloc] init];
2).设置搜索关键字
request.naturalLanguageQuery = poiName;
3).设置搜索范围
MKCoordinateSpan span = MKCoordinateSpanMake(0.03, 0.03);
CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(36.6, 120.3);
MKCoordinateRegion region = MKCoordinateRegionMake(coordinate, span);
request.region = region;
4).创建用于搜索的对象
[[MKLocalSearch alloc] initWithRequest:request];
5).开始搜索
[search startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) { }];
6).表示搜索结果的类MKMapItem
item.placemark // 表示地方信息
item.name // 表示热点的名字
item.phoneNumber // 表示热点的电话号码
………
4. 地理编码 CoreLocation框架下
CLGeocoder
使用CLGeocoder可以完成“地理编码”和“反地理编码”
地理编码:根据给定的地名,获得具体的位置信息(比如经纬度、地址的全称等)
反地理编码:根据给定的经纬度,获得具体的位置信息
地理编码方法
-(void)geocodeAddressString:(NSString*)addressString completionHandler: (CLGeocodeCompletionHandler)completionHandler;
反地理编码方法
-(void)reverseGeocodeLocation:(CLLocation*)location completionHandler: (CLGeocodeCompletionHandler)completionHandler;
CLGeocodeCompletionHandler
当地理反地理编码完成时,就会调用CLGeocodeCompletionHandler typedef void (^CLGeocodeCompletionHandler)(NSArray *placemarks, NSError *error);
这个block传递2个参数
error :当编码出错时(比如编码不出具体的信息)
有值 placemarks :里面装着CLPlacemark对象
CLPlacemark
CLPlacemark的字面意思是地标,封装详细的地址位置信息
@property(nonatomic,readonly)CLLocation*location; 地理位置
@property(nonatomic,readonly)CLRegion*region; 区域@property(nonatomic,readonly)NSDictionary*addressDictionary; 详细的地址信息
@property(nonatomic,readonly)NSString*name; 地址名称
@property(nonatomic,readonly)NSString*locality; 城市
标签:
原文地址:http://www.cnblogs.com/GJ-ios/p/5738647.html