Abhi Abhi - 1 year ago 79
iOS Question

iOS: How to get route path between two coordinates

In my project I've to find out the route path between two locations with the help of latitude and longitude.

I'm using the following code for it

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[mapvw setDelegate:self];
[self 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;

With this code I'm getting the output on simulator like this

enter image description here

But I want the route map which shows direction by road not by straight line.
Please help me to solve it i m in trouble from the last 2 days

Answer Source

To draw path between two lat long, you can use below code.


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

@interface ViewController : UIViewController<MKMapViewDelegate>

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



#import "ViewController.h"

@interface ViewController ()

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


@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;
    [_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 localizedDescription]);
          } else {
              [self showRoute:response];

-(void)showRoute:(MKDirectionsResponse *)response
    for (MKRoute *route in response.routes)
         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;

Hope it will help you out! Change lat long in above code as per your requirement.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download