我们应该可能都用过一些健身类的app,都会有在你跑步的起点和终点给你跑步的路线进行画线,如果我们也要实现这个功能我们可以做如下的步骤
1、创建地理编码对象
2、调用方法去获取地标
3、获取CLPlacemark对象
4、创建MKPlaceMark
5、创建MKMapItem起点位置
6、创建MKMapItem终点的位置
7、创建方向请求的对象
8.、创建方向对象
9、计算两个点之间的路线,去获取路线的信息,route中有个polyline折线属性
10、添加到地图上面调用addOverly,被添加的对象需要遵守<MKOverlay>这个协议
11、在代理方法中创建地图的渲染物,设置线条的颜色,如果我们不设置就会导致看不见,然后返回对象
代码如下所示
#import "ViewController.h"
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()<MKMapViewDelegate>
//在storyboard中的一个文本输入框,让我们输入地点使用
@property (weak, nonatomic) IBOutlet UITextField *TextField;
@property (nonatomic ,strong)CLGeocoder *geocoder;
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@property (nonatomic ,strong)CLLocationManager *manager;
@end
@implementation ViewController
-(CLGeocoder *)geocoder
{
if(_geocoder==nil)
{
_geocoder = [[CLGeocoder alloc]init];
}
return _geocoder;
}
-(CLLocationManager *)manager
{
if(_manager==nil)
{
_manager = [CLLocationManager new];
}
return _manager;
}
- (IBAction)startGuide:(id)sender {
//地理编码,根据地名去获取经纬度
[self.geocoder geocodeAddressString:self.TextField.text completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
//判断输入的内容有没有出错
if(placemarks.count==0||error!=nil)
{
return;
}
//遍历数组去选取数据,取最后一个地标
CLPlacemark *placemark = placemarks.lastObject;
//创建MKPlaceMark对象
MKPlacemark * pmk = [[MKPlacemark alloc]initWithPlacemark:placemark];
//获取现在的地标
MKMapItem * currentItem = [MKMapItem mapItemForCurrentLocation];
//获取目的的地标
MKMapItem * destinationItem = [[MKMapItem alloc]initWithPlacemark:pmk];
//实现画线的方法
//导航和画线其实都是像苹果服务器去发送请求
//1、首先我们要去创建方向的请求对象
MKDirectionsRequest * request = [MKDirectionsRequest new];
//设置起点
request.source = currentItem;
//设置终点
request.destination = destinationItem;
//2、创建方向对象
MKDirections * directions = [[MKDirections alloc]initWithRequest:request];
//3.计算两点之间的路线
[directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse * _Nullable response, NSError * _Nullable error) {
//4、获取路线的信息
if(response.routes.count==0||error)
{
return;
}
//5、获取路线信息
for(MKRoute * route in response.routes)
{
//6、获取折线
MKPolyline * polyline = route.polyline;
//7、添加到地图上
[self.mapView addOverlay:polyline];
}
}];
}];
}
- (void)viewDidLoad {
[super viewDidLoad];
if([self.manager respondsToSelector:@selector(requestAlwaysAuthorization)])
{
//请求授权
[self.manager requestAlwaysAuthorization];
}
//显示用户的位置
self.mapView.userTrackingMode = MKUserTrackingModeFollow;
//设置代理属性
self.mapView.delegate = self;
}
#pragma mark 设置地图渲染物
-(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
//1、创建折线渲染物对象,下面这个MKPolylineRenderer是MKOverlayPathRenderer的子类,然后MKOverlayPathRenderer是MKOverlayRenderer的子类
MKPolylineRenderer * polyline = [[MKPolylineRenderer alloc]initWithOverlay:overlay];
//2、设置线条的颜色
polyline.strokeColor = [UIColor blueColor];
//设置线宽
polyline.lineWidth = 5;
//3、返回对象
return polyline;
}
效果图如下