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

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章