to view route between two points in map +iphone+Ma

2019-03-17 02:26发布

问题:

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

回答1:

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];
}