i want to get the route between the two point in the mapkit!
i had done some google work n found this :-http://spitzkoff.com/craig/?p=108
I had used this to display map and pin:-
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationController.navigationBarHidden=NO;
self.title=@"Map";
CLLocationCoordinate2D location;
location.latitude=[latLabel doubleValue];
location.longitude=[longLabel doubleValue];
MKCoordinateRegion region;// = MKCoordinateRegionMakeWithDistance(CLLocationCoordinate2DMake((location.latitude) / 2.0, (location.longitude) / 2.0), 1000.0, 1000.0);
region.center=location;
region.span.latitudeDelta =0.1;
region.span.longitudeDelta =0.1;
addAnnotation=[[AddressAnnotation alloc] initWithCoordinate:location];
NSLog(@"city=mapview=>%@",City);
NSLog(@"adress=mapview=>%@",Address);
addAnnotation.title=City;
addAnnotation.subtitle=Address;
[mapView addAnnotation:addAnnotation];
[mapView setRegion:region animated:YES];
}
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(AddressAnnotation *) annotation
{
MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentloc"];
annView.pinColor=MKPinAnnotationColorRed;
annView.draggable=TRUE;
annView.animatesDrop=TRUE;
annView.canShowCallout=YES;
annView.calloutOffset=CGPointMake(-5,5);
annView.draggable=TRUE;
return annView;
}
And annotation class to display the name and address.But how should i have to add more to display the route between the two points.
Please help me.
Thanks in advance
You need to invoke google's direction services. Read the documentation at
http://code.google.com/apis/maps/documentation/directions/
Use the URL that suits your need. Then you would need a JSON or XML parser. JSON has an API, you can download it here
https://github.com/stig/json-framework/
You can then get your route polyline points using:
if (error == nil) {
NSError *JSONError = nil;
SBJsonParser *JSONParser = [[SBJsonParser alloc] init];
id directions = [JSONParser objectWithString:directionsInJSON error:&JSONError];
if (JSONError == nil) {
directions = (NSDictionary*)directions;
//NSLog(@"Directions: %@",directions);
NSString *status = [directions objectForKey:@"status"];
if ([status isEqualToString:@"OK"]) {
gotDirections = YES;
NSArray *routes = [directions objectForKey:@"routes"];
NSDictionary *route = [routes objectAtIndex:0];
NSDictionary *polylineOverview = [route objectForKey:@"overview_polyline"];
NSString *polylinePoints = [polylineOverview objectForKey:@"points"];
NSArray *decodedPolyline = [self decodePolyLine:polylinePoints];
}
}
}
//handle elses
- (NSMutableArray *)decodePolyLine: (NSString *)encoded {
NSInteger len = [encoded length];
NSInteger index = 0;
NSMutableArray *array = [[[NSMutableArray alloc] init] autorelease];
NSInteger lat=0;
NSInteger lng=0;
while (index < len) {
NSInteger b;
NSInteger shift = 0;
NSInteger result = 0;
do {
b = [encoded characterAtIndex:index++] - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
NSInteger dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
lat += dlat;
shift = 0;
result = 0;
do {
b = [encoded characterAtIndex:index++] - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
NSInteger dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
lng += dlng;
NSNumber *latitude = [[[NSNumber alloc] initWithFloat:lat * 1e-5] autorelease];
NSNumber *longitude = [[[NSNumber alloc] initWithFloat:lng * 1e-5] autorelease];
CLLocation *loc = [[[CLLocation alloc] initWithLatitude:[latitude floatValue] longitude:[longitude floatValue]] autorelease];
[array addObject:loc];
}
return array;
}
Then display this array using mkpolyline:
CLLocationCoordinate2D coords[[routes count]];
for(int i = 0; i < route.count; i++) {
CLLocation* location = (CLLocation*)[NSKeyedUnarchiver unarchiveObjectWithData:[routes objectAtIndex:i]];
CLLocationCoordinate2D c;
c.latitude = location.coordinate.latitude;
c.longitude = location.coordinate.longitude;
coords[i] = c;
Annotation *ann = [[Annotation alloc] initWithTitle:@"" Subtitle:@"" andCoordinate:c];
[mapView addAnnotation:ann];
[ann release];
}
MKPolyline *line = [MKPolyline polylineWithCoordinates:(CLLocationCoordinate2D*)coords count:[route count]];
[self.mapView addOverlay:line];
Also implement mapView:viewForOverlay delegate method:
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay {
if ([overlay isKindOfClass:[MKPolyline class]]) {
MKPolylineView *polylineView = [[MKPolylineView alloc] initWithPolyline:overlay];
polylineView.strokeColor = [UIColor redColor];
polylineView.lineWidth = 1.5;
return polylineView;
}
return [[MKOverlayView alloc] initWithOverlay:overlay];
}