ios-實現兩個地點畫線相連
阿新 • • 發佈:2019-01-02
我們應該可能都用過一些健身類的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; }
效果圖如下