1. 程式人生 > >ios-實現兩個地點畫線相連

ios-實現兩個地點畫線相連

我們應該可能都用過一些健身類的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;
    
    
}

效果圖如下