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

Map

时间:2016-08-04 23:13:13      阅读:303      评论:0      收藏:0      [点我收藏+]

标签:

定位

 

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; 城市 

 

Map

标签:

原文地址:http://www.cnblogs.com/GJ-ios/p/5738647.html

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