LBS-Object C 定位,地图,导航

来源:互联网 发布:unity3d 寻路插件 编辑:程序博客网 时间:2024/05/18 00:07

1.定位

  • CoreLocation: 用于地理定位
    • 该框架中所有数据类型的前缀都是 CL
    • 位置管理类 : CoreLocationManager
  • Map Kit: 用于地图显示

2.个热门专业术语

  • LBS: Location Based Service
  • SoloMo: Social Local Mobile(索罗门)

    1. 10.26-12.1号,苹果的定位在真机和模拟器都不能用
    2. 模拟器 bug, 定位时不打印,切换模拟器就可以了

NSLocationAlwaysUsageDescription
NSLocationWhenInUseUsageDescription

3.经纬度coordinate

  • latitude 纬度
  • longitude 经度
  • course 方向

在某些特殊情况下需要开启永久定位授权

  • 需要判断版本信息

    if ([UIDevice currentDevice].systemVersion.floatValue >= 9.0){        //配置 plist--如果未配置,就会崩溃        manager.allowsBackgroundLocationUpdates = YES;}

4.计算两点间距离

  • 直线距离
  • distanceFromLocation: 返回结果是 double 类型

5.地理编码和反地理编码

地理编码

  • 将地址翻译成经纬度
  • CLGeocoder geocodeAddressString:
    • 获取 CLPlacemark
      • name 具体地名
      • locatity 城市名
      • location 位置
        • coordinate 经纬度

反地理编码

  • 将经纬度翻译成地址
  • CLGeocoder reverseGeocodeAddressString:

6. 导入框架问题

  • 在 Xcode5之后,系统会默认帮你导入你需要的框架
    • 原理是,根据你导入的头文件自动导入对应的框架
    • 如果在 storyboard 中添加第三方框架中的控件(除了 UIKit的框架)时,必须要手动导入框架,否则会崩溃,例如添加了 MapKit

7.地图

  1. iOS9新特性

    • 实时交通
      • mapView.showsTraffic = YES
  2. 地图类型 mapType

    • 标准 standard
    • 卫星 satellite
    • 鸟瞰 HyBrid
  3. 用户跟踪模式

    • mapView.userTrackingMode
      • MKUserTrackingModeNone
      • MKUserTrackingModeFollow 跟踪
      • MKUserTrackingModeFollowWithHeading 跟踪位置和方向
    • 在设置跟踪模式之前要先获取授权
        //1.获取授权CLLocationManager *manager = [[CLLocationManager alloc] init];self.manager = manager;[manager requestWhenInUseAuthorization];//2.设置跟踪模式self.mapView.userTrackingMode = MKUserTrackingModeFollow;

回到用户当前位置

  • 确定中心点经纬度
  • 确定经纬度跨度

  • 事例

//返回到我的当前位置- (IBAction)goBack:(id)sender {    self.mapView.centerCoordinate = self.mapView.userLocation.location.coordinate;    //经纬度跨度+中心点 = 区域    // region 中包含两个结构体: 1.中心点结构体 2.经纬度跨度结构体    //1.设置经纬度跨度    MKCoordinateSpan span = MKCoordinateSpanMake(0.2, 0.2);    //不使用动画    //self.mapView.region = MKCoordinateRegionMake(self.mapView.userLocation.location.coordinate, span);    //使用系统动画    [self.mapView setRegion:MKCoordinateRegionMake(self.mapView.userLocation.location.coordinate, span) animated:YES];}

添加大头针

  • 导入框架
  • 遵循协议
  • 拷贝属性

点击屏幕添加大头针

其实应该使用长按添加,这里为了方便使用点击添加
- 获取用户点击的位置
- 转换为经纬度
- 获取 location
- 反地理编码

  • 事例代码
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    //1.获取 用户点击的位置    CGPoint point = [[touches anyObject] locationInView:self.mapView];    //2.转换位置信息为经纬度    CLLocationCoordinate2D  lc = [self.mapView convertPoint:point toCoordinateFromView:self.mapView];    //3.反地理编码    CLGeocoder *geocoder = [[CLGeocoder alloc] init];    CLLocation *location = [[CLLocation alloc] initWithLatitude:lc.latitude longitude:lc.longitude];    //4.转换经纬度    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {        if (error) {            NSLog(@"%@",error);            return ;        }        CLPlacemark *placemark = placemarks.firstObject;        //5.添加大头针        AMAnnotation *tip = [[AMAnnotation alloc] init];        tip.title = placemark.locality;        tip.subtitle = placemark.name;        tip.coordinate = lc;        [self.mapView addAnnotation:tip];    }];}

手动控制大头针的样式和内容

  • 大头针视图的代理方法
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{    //与 tableviewcell 不同的地方,可以返回 nil    //如果是MKUserLocation类的,就是当前定位位置,不需要设置大头针    if ([annotation isKindOfClass:[MKUserLocation class]]) {        return nil;    }    //1.设置重用标识    static NSString *ID = @"MKAnnotationView";    //MKAnnotationView默认没有界面--可以显示图片    //MKPinAnnotationView有界面 -- 不可以显示图片    MKPinAnnotationView *view = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];    if (view == nil) {        view = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ID];    }    //iOS9之后才出现,之前使用 pinColor, 只有三种颜色可用    view.pinTintColor = [UIColor purpleColor];    //设置掉落动画效果    view.animatesDrop = YES;    //显示大头针信息    view.canShowCallout = YES;    //一下三个视图都必须设置大头针的 title,否则没有任何信息    //大头针左右视图控件    view.leftCalloutAccessoryView = [UISwitch new];    view.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeContactAdd];    //iOS9新特性    //中间的视图,会遮挡subTitle    view.detailCalloutAccessoryView = [UISwitch new];    return view;}
0 0
原创粉丝点击