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