// ViewController.m
import <MapKit/MapKit.h>
import "YYAnnotation.h"
@interface ViewController ()<MKMapViewDelegate>
@property(strong,nonatomic)MKMapItem *mapItem;
//編碼工具
@property(strong,nonatomic)CLGeocoder *geocoder;
@property(weak,nonatomic)MKMapView *mapView;
//用于發(fā)送請求給服務(wù)器
@property(strong,nonatomic)MKDirections *direct;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 添加一個地圖到界面上
MKMapView *mapView = [[MKMapView alloc]initWithFrame:self.view.bounds];
[self.view addSubview:mapView];
mapView.delegate = self;
self.mapView = mapView;
// 添加一個視圖
// 提供兩個點(diǎn)叙凡,自動規(guī)劃線路
_geocoder = [[CLGeocoder alloc]init];
[_geocoder geocodeAddressString:@"滑縣" completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
MKPlacemark *placemark = [[MKPlacemark alloc]initWithPlacemark:placemarks.lastObject];
//intrItem可以理解為地圖上的一個點(diǎn)
MKMapItem *intrItem = [[MKMapItem alloc]initWithPlacemark:placemark];
// 添加一個小別針到地圖上
YYAnnotation *anno = [[YYAnnotation alloc]init];
anno.coordinate = intrItem.placemark.location.coordinate;
[self.mapView addAnnotation:anno];
// 讓地圖跳轉(zhuǎn)到起點(diǎn)所在的區(qū)域
MKCoordinateRegion region = MKCoordinateRegionMake(intrItem.placemark.location.coordinate, MKCoordinateSpanMake(0.1, 0.1));
[self.mapView setRegion:region];
//創(chuàng)建終點(diǎn)
[_geocoder geocodeAddressString:@"西二旗" completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
//destItem可以理解為地圖上的一個點(diǎn)
MKMapItem *destItem = [[MKMapItem alloc]initWithPlacemark:[[MKPlacemark alloc]initWithPlacemark:[placemarks lastObject]]];
// 添加一個小別針到地圖上
YYAnnotation *anno = [[YYAnnotation alloc]init];
anno.coordinate = destItem.placemark.location.coordinate;
[self.mapView addAnnotation:anno];
//調(diào)用下面方法發(fā)送請求
[self moveWith:intrItem toDestination:destItem];
}];
}];
}
//提供兩個點(diǎn)挠说,在地圖上進(jìn)行規(guī)劃的方法
-(void)moveWith:(MKMapItem *)formPlce toDestination:(MKMapItem *)endPlace{
// 創(chuàng)建請求體
// 創(chuàng)建請求體 (起點(diǎn)與終點(diǎn))
MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];
request.source = formPlce;
request.destination = endPlace;
self.direct = [[MKDirections alloc]initWithRequest:request];
// 計算路線規(guī)劃信息 (向服務(wù)器發(fā)請求)
[self.direct calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse * _Nullable response, NSError * _Nullable error) {
//獲取到所有路線
NSArray <MKRoute *> *routesArray = response.routes;
//取出最后一條路線
MKRoute *rute = routesArray.lastObject;
//路線中的每一步
NSArray <MKRouteStep *>*stepsArray = rute.steps;
//遍歷
for (MKRouteStep *step in stepsArray) {
[self.mapView addOverlay:step.polyline];
}
// 收響應(yīng)結(jié)果 MKDirectionsResponse
// MKRoute 表示的一條完整的路線信息 (從起點(diǎn)到終點(diǎn)) (包含多個步驟)
}];
}
// 返回指定的遮蓋模型所對應(yīng)的遮蓋視圖, renderer-渲染
-
(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
// 判斷類型
if ([overlay isKindOfClass:[MKPolyline class]]) {
// 針對線段, 系統(tǒng)有提供好的遮蓋視圖
MKPolylineRenderer *render = [[MKPolylineRenderer alloc] initWithPolyline:overlay];// 配置滓走,遮蓋線的顏色 render.lineWidth = 5; render.strokeColor = [UIColor colorWithRed:arc4random_uniform(256) / 255.0 green:arc4random_uniform(256) / 255.0 blue:arc4random_uniform(256) / 255.0 alpha:1.0]; return render;
}
// 返回nil, 是沒有默認(rèn)效果
return nil;
}
//跳轉(zhuǎn)頁面.h
import <MapKit/MapKit.h>
import <CoreLocation/CoreLocation.h>
@interface YYAnnotation : NSObject<MKAnnotation>
@property(assign,nonatomic)CLLocationCoordinate2D coordinate;