定位和地理編碼

--------------------------------------------------------

CLLocationManager 定位管理者

CLLocation 代表位置(經度/緯度/高度/速度/路線等)

CLHeading  代表移動方向


CLRegion   代表一個區域

>CLCircularRegion  圓形區域

>CLBeaconRegion 藍牙信號區域


// 返回定位服務是否可用

[CLLocationManager locationServicesEnabled];


// 後的系版本號

[UIDevice currentDevice].systemVersion.floatValue >= 8.0


// 跳轉到手機設置頁面

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];

if ([[UIApplication sharedApplication] canOpenURL:url]) {

    [[UIApplication sharedApplication] openURL:url];

}



// 配置info.plist

NSLocationWhenInUseUsageDescription // iOS 8.0 使用前臺定位服務

NSLocationAlwaysUsageDescription    // iOS 8.0 使用前後臺都會定位


// Title:@"定位系統不可用" message:@"請進入設置頁面 > 隱私 > 定位服務 > 打開定位服務 > 選擇當前應用 > 勾上'使用應用期間'.設置完畢後請重新啓動App運行."

--------------------------------------------------------

// 設置是否可以暫停定位來節省電池電量, YES不需要定位數據時自動暫停定位

mgr.pausesLocationUpdatesAutomatically


--------------------------------------------------------

// 每隔多少米定位一次, 只有水平方向超過該值時纔會重新定位

mgr.distanceFilter = 100;


--------------------------------------------------------

定位精確度

// mgr.desiredAccuracy;


kCLDistanceFilterNone;

kCLLocationAccuracyBestForNavigation    // 導航級最佳精準

kCLLocationAccuracyBest;                // 最佳精準

kCLLocationAccuracyNearestTenMeters;    // 10米誤差

kCLLocationAccuracyHundredMeters;       // 百米誤差

kCLLocationAccuracyKilometer;           // 千米誤差

kCLLocationAccuracyThreeKilometers;     // 3千米誤差


--------------------------------------------------------

定位數據的用途

// mgr.activityType;


CLActivityTypeOther                 // 作爲普通用途

CLActivityTypeAutomotiveNavigation  // 作爲車輛導航

CLActivityTypeFitness               // 作爲步行導航

CLActivityTypeOtherNavigation       // 作爲其它導航


--------------------------------------------------------

// CLLocation

location.coordinate;          // 座標, 包含經緯度

location.altitude;            // 設備海拔高度 單位是米

location.course;              // 設置前進方向 0表示北 90 180 270西

location.horizontalAccuracy;  // 水平精準度

location.verticalAccuracy;    // 垂直精準度

location.timestamp;           // 定位信息返回的時間

location.speed;               // 設備移動速度 單位是米/, 適用於行車速度而不太適用於不行


--------------------------------------------------------

CLAuthorizationStatus

// 用戶尚未決定授權權限

kCLAuthorizationStatusNotDetermined

// 無法使用定位服務,該狀態用戶無法改變

kCLAuthorizationStatusRestricted

// 用戶拒絕該應用使用定位服務,或是定位服務總開關處於關閉狀態

kCLAuthorizationStatusDenied

// 已經授權(廢棄)

kCLAuthorizationStatusAuthorized

// 用戶允許該程序無論何時都可以使用地理信息

kCLAuthorizationStatusAuthorizedAlways

// 用戶同意程序在可見時使用地理位置

kCLAuthorizationStatusAuthorizedWhenInUse


--------------------------------------------------------

注意:iOS9.0 可以單次請求用戶位置

- (void)requestLocation

// 成功調用,locations位置數組,元素按照時間排序

-(void)locationManager:(nonnull CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations

// 失敗調用

-(void)locationManager:(nonnull CLLocationManager *)manager didFailWithError:(nonnull NSError *)error


requestLocation 作用:

// 按照定位精確度從低到高進行排序,逐個進行定位。如果獲取到的位置不是精確度最高的那個,也會在定位超時後,通過代理告訴外界(必須實現代理的-locationManager:didFailWithError:方法)


不能與startUpdatingLocation方法同時使用


--------------------------------------------------------

// 計算兩個位置之間的距離, 單位是米

[newLocation distanceFromLocation:self.prevLocation];


--------------------------------------------------------

獲取方向信息不會提示用戶(不需要授權), 因爲不會泄露隱私

// [self.mgr startUpdatingHeading];


magneticHeading // 設備與磁北的相對角度

trueHeading     // 設置與真北的相對角度, 必須和定位一起使用, iOS需要位置來計算真北



--------------------------------------------------------

// 錯誤:使用CoreLocation獲取地理位置信息,報錯

Error Domain=kCLErrorDomain Code=0 "The operation couldn’t be completed. (kCLErrorDomain error 0.)"


解決方法:

1.確定模擬器(手機)已經聯網並且允許程序獲取地理位置

2.重置地理位置服務或者網絡服務


PS:如果是模擬器就果斷直接重置模擬器吧  IOS Simulator - Reset Content and Settings...


-----------------------------------


#pragma mark - 導航 MKDirections     MKDirectionsRequest


Demo: 根據起點與終點座標, Apple服務器請求路線規劃信息, 再繪製路線


1. 獲取起點與終點的地理座標

2. 創建 MKDirectionRequest , 配置起點與終點的 MapItem

3. 使用 MKDirection 進行路線規劃請求 ( MKRoute, MKRouteStep )

calculateDirectionsWithCompletionHandler

4. 將獲取到的路線信息繪製到地圖上. ( MKPolyLineRender )

// 渲染方法

[self.mapView addOverlay:toute.polyline];


// 設置顏色的代理方法

// 渲染路線

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {

    // 設置顏色

    MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay];

    renderer.lineWidth = 2.0;

    renderer.strokeColor = [UIColor blueColor];

    return renderer;

}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章