ios-实现两个地点画线相连

本文介绍如何使用iOS设备上的MapKit框架来实现从当前位置到指定目的地的路线绘制功能。通过地理编码获取位置坐标,并利用MKDirections计算路径,最终在地图上展示出一条蓝色的跑步路线。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们应该可能都用过一些健身类的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;
    
    
}

效果图如下




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值