I want to show a route on a MKMapView between the current location and a desired location as an annotation.
What is the best way to do this?
///in .h
add delegate MKMapViewDelegate
///in .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;
}
I have try following code...it works very well in my project...try it..
First download KMLParser.h and KMLParser.m from this link:-
Also download DDAnnotation.h and DDAnnotation.m file from this link:-
Now Create a View Controller Like SomeViewController.
Add following library:-
In SomeViewController.h import KMLParser.h file.
Write 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 the SomeViewController.xib drag and drop the MapView and give link it with mapView from File's Owner. Also set delegate of MapView to File's 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's Title";
myAnnotation1.subtitle= @"Desired Location's 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's 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;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With