利用系統(tǒng)App導(dǎo)航
1. 導(dǎo)航的三種實(shí)現(xiàn)方案
1. 可以將需要導(dǎo)航的位置丟給系統(tǒng)的地圖APP進(jìn)行導(dǎo)航
2. 發(fā)送網(wǎng)絡(luò)請(qǐng)求到公司服務(wù)器獲取導(dǎo)航數(shù)據(jù), 然后自己手動(dòng)繪制導(dǎo)航
3. 利用三方SDK實(shí)現(xiàn)導(dǎo)航(百度)
2. 直接將起點(diǎn)和終點(diǎn), 傳遞給系統(tǒng)地圖, 利用系統(tǒng)APP, 進(jìn)行導(dǎo)航
- 利用"反推法", 記住關(guān)鍵代碼即可
- 代碼如下:
// 根據(jù)兩個(gè)地標(biāo)對(duì)象進(jìn)行調(diào)用系統(tǒng)導(dǎo)航
- (void)beginNavWithBeginPlacemark:(CLPlacemark *)beginPlacemark andEndPlacemark:(CLPlacemark *)endPlacemark
{
// 創(chuàng)建起點(diǎn):根據(jù) CLPlacemark 地標(biāo)對(duì)象創(chuàng)建 MKPlacemark 地標(biāo)對(duì)象
MKPlacemark *itemP1 = [[MKPlacemark alloc] initWithPlacemark:beginPlacemark];
MKMapItem *item1 = [[MKMapItem alloc] initWithPlacemark:itemP1];
// 創(chuàng)建終點(diǎn):根據(jù) CLPlacemark 地標(biāo)對(duì)象創(chuàng)建 MKPlacemark 地標(biāo)對(duì)象
MKPlacemark *itemP2 = [[MKPlacemark alloc] initWithPlacemark:endPlacemark];
MKMapItem *item2 = [[MKMapItem alloc] initWithPlacemark:itemP2];
NSDictionary *launchDic = @{
// 設(shè)置導(dǎo)航模式參數(shù)
MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving,
// 設(shè)置地圖類型
MKLaunchOptionsMapTypeKey : @(MKMapTypeHybridFlyover),
// 設(shè)置是否顯示交通
MKLaunchOptionsShowsTrafficKey : @(YES),
};
// 根據(jù) MKMapItem 數(shù)組 和 啟動(dòng)參數(shù)字典 來(lái)調(diào)用系統(tǒng)地圖進(jìn)行導(dǎo)航
[MKMapItem openMapsWithItems:@[item1, item2] launchOptions:launchDic];
}
3. 注意: CLPlacemark地標(biāo)對(duì)象沒(méi)法直接手動(dòng)創(chuàng)建, 只能通過(guò)(反)地理編碼獲取
```
### 3. 補(bǔ)充
1. 3D視圖
```objc
補(bǔ)充1:類似于地圖街景,增強(qiáng)用戶體驗(yàn)
CLLocationCoordinate2D center = CLLocationCoordinate2DMake(23.132931, 113.375924);
MKMapCamera *camera = [MKMapCamera cameraLookingAtCenterCoordinate:center fromEyeCoordinate:CLLocationCoordinate2DMake(center.latitude, center.longitude + 0.001) eyeAltitude:1];
self.mapView.camera = camera;
```
2. 地圖截圖
```objc
// 截圖附加選項(xiàng)
MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init];
// 設(shè)置截圖區(qū)域(在地圖上的區(qū)域,作用在地圖)
options.region = self.mapView.region;
// options.mapRect = self.mapView.visibleMapRect;
// 設(shè)置截圖后的圖片大小(作用在輸出圖像)
options.size = self.mapView.frame.size;
// 設(shè)置截圖后的圖片比例(默認(rèn)是屏幕比例, 作用在輸出圖像)
options.scale = [[UIScreen mainScreen] scale];
MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc] initWithOptions:options];
[snapshotter startWithCompletionHandler:^(MKMapSnapshot * _Nullable snapshot, NSError * _Nullable error) {
if (error) {
NSLog(@"截圖錯(cuò)誤:%@",error.localizedDescription);
}else
{
// 設(shè)置屏幕上圖片顯示
self.snapshootImageView.image = snapshot.image;
// 將圖片保存到指定路徑(此處是桌面路徑,需要根據(jù)個(gè)人電腦不同進(jìn)行修改)
NSData *data = UIImagePNGRepresentation(snapshot.image);
[data writeToFile:@"/Users/wangshunzi/Desktop/snap.png" atomically:YES];
}
}];
4. 測(cè)試環(huán)境
1. 加載地圖數(shù)據(jù)需要聯(lián)網(wǎng)
2. XCode版本不限
3. iOS系統(tǒng)版本不限
5. 常見(jiàn)問(wèn)題總結(jié)
1. 需要注意地標(biāo)對(duì)象不能手動(dòng)創(chuàng)建, 因?yàn)槔锩娴膶傩允莚eadonly; 只能通過(guò)(反)地理編碼獲取