Show route between current and desired location on iPhone MapView

I want to show the route in MKMapView between the current location and the desired location as an annotation.

What is the best way to do this?

+4
source share
3 answers

/// in .h add delegate MKMapViewDelegate

/// in the .m file

 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { CLLocationCoordinate2D newcordinate = newLocation.coordinate; CLLocationCoordinate2D oldcordinate = oldLocation.coordinate; MKMapPoint * pointsArray = malloc(sizeof(CLLocationCoordinate2D)*2); pointsArray[0]= MKMapPointForCoordinate(oldcordinate); pointsArray[1]= MKMapPointForCoordinate(newcordinate); MKPolyline * routeLine = [MKPolyline polylineWithPoints:pointsArray count:2]; free(pointsArray); [MapView addOverlay:routeLine]; //MkMapView declared in .h } //MKMapViewDelegate - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay { MKOverlayView* overlayView = nil; MKPolylineView * _routeLineView = [[[MKPolylineView alloc] initWithPolyline:self.routeLine] autorelease]; _routeLineView.fillColor = self.PathColor; _routeLineView.strokeColor = self.PathColor; _routeLineView.lineWidth = 15; _routeLineView.lineCap = kCGLineCapSquare; overlayView = _routeLineView; return overlayView; } 
+8
source

I am trying to execute code ... it works very well in my project ... try ..

First download KMLParser.h and KMLParser.m from this link: -

Also download the file DDAnnotation.h and DDAnnotation.m from this link: -

Now create a controller like Like SomeViewController.

Add the following library: -

  • CoreLocation.framework
  • MapKit.framework
  • QuartzCore.framework

In the file SomeViewController.h, the file KMLParser.h is imported.

Write the following code in SomeViewController.h

 #import <UIKit/UIKit.h> #import <MapKit/MapKit.h> #import "KMLParser.h" @interface SomeViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate, MKOverlay>{ double currentLat; double currentLong; double desiredLatitude; double desiredLongitude; MKMapView *mapView; KMLParser *kml; NSMutableArray *annotations; } @property(nonatomic, retain)IBOutlet MKMapView *mapView; @end 

Now in SomeViewController.xib drag and drop the MapView and pass the link with mapView from File Owner. Also set a MapView delegate for the file owner.

Now in SomeViewController write the following code: -

 #import "SomeViewController.h" #import <QuartzCore/QuartzCore.h> #import "DDAnnotation.h" @implementation SomeViewController @synthesize mapView; - (void)viewDidLoad { [super viewDidLoad]; currentLat = 21.215538; //You can set current latitude here. currentLong = 72.858753; //You can set current longitude here. desiredLatitude = 21.211976; //You can set destination latitude here. desiredLongitude = 72.851593; //You can set destination longitude here. MKCoordinateRegion region = {{0.0f, 0.0f}, {100.0f, 100.0f}}; CLLocation* currentLocation = [[CLLocation alloc] initWithLatitude:currentLat longitude:currentLong]; region.center = currentLocation.coordinate; region.span.longitudeDelta = 0.05; region.span.latitudeDelta = 0.05; [self.mapView setRegion:region animated:YES]; annotations=[[NSMutableArray alloc] init]; CLLocationCoordinate2D theCoordinate; theCoordinate.latitude = currentLat; theCoordinate.longitude = currentLong; DDAnnotation* myAnnotation=[[DDAnnotation alloc] init]; myAnnotation.coordinate=theCoordinate; myAnnotation.title=@ "You are here"; myAnnotation.subtitle=@ "Current location"; [mapView addAnnotation:myAnnotation]; [annotations addObject:myAnnotation]; CLLocationCoordinate2D theCoordinate1; theCoordinate1.latitude = desiredLatitude; theCoordinate1.longitude = desiredLongitude; DDAnnotation* myAnnotation1=[[DDAnnotation alloc] init]; myAnnotation1.coordinate=theCoordinate1; myAnnotation1.title=@ "Desired Location Title"; myAnnotation1.subtitle= @"Desired Location Sub-title"; [mapView addAnnotation:myAnnotation1]; [annotations addObject:myAnnotation1]; NSString *path = [NSString stringWithFormat:@"http://maps.google.com/maps?f=d&hl=en&saddr=%f,%f&daddr=%f,%f&ie=UTF8&0&om=0&output=kml",currentLat,currentLong,desiredLatitude,desiredLongitude]; NSLog(@" Path String : %@", path); kml = [[KMLParser alloc] initWithURL:[NSURL URLWithString:path]]; [kml parseKML]; // Add all of the MKOverlay objects parsed from the KML file to the map. NSArray *overlays = [kml overlays]; [self.mapView addOverlays:overlays]; } #pragma mark MKMapViewDelegate - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay { return [kml viewForOverlay:overlay]; } - (MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation{ // if it the user location, just return nil. if ([annotation isKindOfClass:[MKUserLocation class]]){ return nil; } else{ static NSString* AnnotationIdentifier = @"AnnotationIdentifier"; MKPinAnnotationView* pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier] autorelease]; pinView.animatesDrop=YES; pinView.canShowCallout=YES; pinView.pinColor=MKPinAnnotationColorGreen; return pinView; } } 
+2
source

You must calculate your points yourself and draw a route as a layer. There is no public api for showing the route in MKMapView.

The quickest solution is to open the phone's map application using the route.

0
source

Source: https://habr.com/ru/post/1387566/


All Articles