iOS:如何获取两个坐标之间的路径路径

时间:2016-06-24 07:26:00

标签: ios objective-c maps mkmapview

在我的项目中,我借助纬度和经度找出两个地点之间的路线。

我正在使用以下代码

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [mapvw setDelegate:self];    
    [self mapp];
}


-(void)mapp
{
    CLLocationCoordinate2D coordinateArray[2];
    coordinateArray[0] = CLLocationCoordinate2DMake(28.6129, 77.2295);
    coordinateArray[1] = CLLocationCoordinate2DMake(28.6562, 77.2410);

    self.routeLine = [MKPolyline polylineWithCoordinates:coordinateArray count:2];
    [mapvw setVisibleMapRect:[self.routeLine boundingMapRect]]; //If you want the route to be visible
    [mapvw addOverlay:self.routeLine];
}


-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
{
    if(overlay == self.routeLine)
    {
        if(nil == self.routeLineView)
        {
            self.routeLineView = [[MKPolylineView alloc] initWithPolyline:self.routeLine];
            self.routeLineView.fillColor = [UIColor redColor];
            self.routeLineView.strokeColor = [UIColor redColor];
            self.routeLineView.lineWidth = 3;

        }

        return self.routeLineView;
    }

    return nil;
}

使用此代码,我可以在模拟器上获得输出

enter image description here

但是我想要不用直线显示道路方向的路线图。 请帮助我解决这个问题,我在最近2天遇到了麻烦 ....

1 个答案:

答案 0 :(得分:9)

要在两个lat long之间绘制路径,可以使用下面的代码。

ViewController.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>

@interface ViewController : UIViewController<MKMapViewDelegate>

@property (strong, nonatomic) IBOutlet MKMapView *myMapView;

@end

<强> ViewController.m

#import "ViewController.h"

@interface ViewController ()

@property (strong, nonatomic) MKPlacemark *destination;
@property (strong,nonatomic) MKPlacemark *source;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    [self getDirections];

}

-(void)getDirections {

    CLLocationCoordinate2D sourceCoords = CLLocationCoordinate2DMake(37.773972, -122.431297);

    MKCoordinateRegion region;
    //Set Zoom level using Span
    MKCoordinateSpan span;
    region.center = sourceCoords;

    span.latitudeDelta = 1;
    span.longitudeDelta = 1;
    region.span=span;
    [_myMapView setRegion:region animated:TRUE];

    MKPlacemark *placemark  = [[MKPlacemark alloc] initWithCoordinate:sourceCoords addressDictionary:nil];

    MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
    annotation.coordinate = sourceCoords;
    annotation.title = @"San Francisco";
    [self.myMapView addAnnotation:annotation];
    //[self.myMapView addAnnotation:placemark];

     _destination = placemark;

     MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:_destination];

     CLLocationCoordinate2D destCoords = CLLocationCoordinate2DMake(37.615223, -122.389977);
     MKPlacemark *placemark1  = [[MKPlacemark alloc] initWithCoordinate:destCoords addressDictionary:nil];

    MKPointAnnotation *annotation1 = [[MKPointAnnotation alloc] init];
    annotation1.coordinate = destCoords;
    annotation1.title = @"San Francisco University";
    [self.myMapView addAnnotation:annotation1];

    //[self.myMapView addAnnotation:placemark1];

     _source = placemark1;

     MKMapItem *mapItem1 = [[MKMapItem alloc] initWithPlacemark:_source];

     MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];
     request.source = mapItem1;

     request.destination = mapItem;
     request.requestsAlternateRoutes = NO;

     MKDirections *directions = [[MKDirections alloc] initWithRequest:request];

     [directions calculateDirectionsWithCompletionHandler:
      ^(MKDirectionsResponse *response, NSError *error) {
          if (error) {
              NSLog(@"ERROR");
              NSLog(@"%@",[error localizedDescription]);
          } else {
              [self showRoute:response];
          }
      }];
}

-(void)showRoute:(MKDirectionsResponse *)response
{
    for (MKRoute *route in response.routes)
    {
        [_myMapView
         addOverlay:route.polyline level:MKOverlayLevelAboveRoads];

        for (MKRouteStep *step in route.steps)
        {
            NSLog(@"%@", step.instructions);
        }
    }
}

#pragma mark - MKMapViewDelegate methods

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
    MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithPolyline:overlay];
    renderer.strokeColor = [UIColor colorWithRed:0.0/255.0 green:171.0/255.0 blue:253.0/255.0 alpha:1.0];
    renderer.lineWidth = 10.0;
    return  renderer;
}

更新:Swift 4

import MapKit
import UIKit

class ViewController: UIViewController, MKMapViewDelegate {

    var destination: MKPlacemark?
    var source: MKPlacemark?
    @IBOutlet var myMapView: MKMapView!

    func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        getDirections()
    }

    func getDirections() {
        let sourceCoords: CLLocationCoordinate2D = CLLocationCoordinate2DMake(37.773972, -122.431297)
        let region: MKCoordinateRegion
            //Set Zoom level using Span
        let span: MKCoordinateSpan
        region.center = sourceCoords
        span.latitudeDelta = CLLocationDegrees(1)
        span.longitudeDelta = CLLocationDegrees(1)
        region.span = span
        myMapView.setRegion(region, animated: true)
        let placemark = MKPlacemark(coordinate: sourceCoords, addressDictionary: nil)
        let annotation = MKPointAnnotation()
        annotation.coordinate = sourceCoords
        annotation.title = "San Francisco"
        myMapView.addAnnotation(annotation)
        //[self.myMapView addAnnotation:placemark];
        destination = placemark
        var mapItem: MKMapItem? = nil
        if let aDestination = destination {
            mapItem = MKMapItem(placemark: aDestination)
        }
        let destCoords: CLLocationCoordinate2D = CLLocationCoordinate2DMake(37.615223, -122.389977)
        let placemark1 = MKPlacemark(coordinate: destCoords, addressDictionary: nil)
        let annotation1 = MKPointAnnotation()
        annotation1.coordinate = destCoords
        annotation1.title = "San Francisco University"
        myMapView.addAnnotation(annotation1)
        //[self.myMapView addAnnotation:placemark1];
        source = placemark1
        var mapItem1: MKMapItem? = nil
        if let aSource = source {
            mapItem1 = MKMapItem(placemark: aSource)
        }
        let request = MKDirectionsRequest()
        request.source = mapItem1
        request.destination = mapItem
        request.requestsAlternateRoutes = false
        let directions = MKDirections(request: request)
        directions.calculate(completionHandler: {(_ response: MKDirectionsResponse, _ error: Error?) -> Void in
            if error != nil {
                print("ERROR")
                print("\(error?.localizedDescription ?? "")")
            } else {
                self.showRoute(response)
            }
        })
    }

    func showRoute(_ response: MKDirectionsResponse?) {
        for route: MKRoute in response?.routes {
            myMapView.add(route.polyline, level: .aboveRoads)
            for step: MKRouteStep in route.steps {
                print("\(step.instructions)")
            }
        }
    }

    // MARK: - MKMapViewDelegate methods
    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        var renderer: MKPolylineRenderer? = nil
        if let anOverlay = overlay as? MKPolyline {
            renderer = MKPolylineRenderer(polyline: anOverlay)
        }
        renderer?.strokeColor = UIColor(red: 0.0 / 255.0, green: 171.0 / 255.0, blue: 253.0 / 255.0, alpha: 1.0)
        renderer?.lineWidth = 10.0
        if let aRenderer = renderer {
            return aRenderer
        }
        return MKOverlayRenderer()
    }
}

希望它会帮助你!根据您的要求在上面的代码中更改lat。