0

I am trying to draw route between two points using polyline . I got somewhat route but not correct and I think it will get confused at the turn . I am using google api for getting points of route .Following is code what i tried please check .

 - (IBAction)onclickDrawButton:(id)sender

{
    flag=TRUE;
    NSString *startpoint=[satrtTextfield text];    
    NSString *endpoint=[endTextfield text];

    NSMutableString *urlString=[NSMutableString stringWithFormat:@"http://maps.googleapis.com/maps/api/directions/json?origin=%@&destination=%@&sensor=false",startpoint,endpoint];
    NSURL *url = [NSURL URLWithString:urlString];


    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
     NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request 
    delegate:self];
    if(connection)
    {
        NSLog(@"connectin done");
    }

}

 -(void)connection:(NSURLConnection*)connection didReceiveResponse: (NSURLResponse*)response
{    
 if(flag)
 {
    recievedRoutes=[[NSMutableData alloc]init];

 }

}

 - (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    if(flag){
          NSString *jsonResult = [[NSString alloc] initWithData:recievedRoutes   encoding:NSUTF8StringEncoding];
    NSLog(@"json response %@",jsonResult);

    NSDictionary *partialJsonDict=[jsonResult JSONValue];
    NSArray *items=[partialJsonDict valueForKey:@"routes"];

    //NSLog(@"responsed valued %@",[[items objectAtIndex:0]valueForKey:@"legs"]);


    NSArray *aary=[[items objectAtIndex:0]valueForKey:@"legs"];
    NSLog(@"legs array wuth polyline %@",[[aary objectAtIndex:0]valueForKey:@"steps"]);
    NSArray *steps=[[aary objectAtIndex:0]valueForKey:@"steps"];
    NSLog(@"steps %@",[[steps objectAtIndex:1]objectForKey:@"polyline"]);
    NSMutableString *string=[[NSMutableString alloc]init];
    for(int i=0;i<[steps count];i++)
    {
        //NSLog(@"steps  i value %@",[[[steps objectAtIndex:i]objectForKey:@"polyline"]objectForKey:@"sttpoints"]);

        [string appendString:[[[steps objectAtIndex:i]objectForKey:@"polyline"]objectForKey:@"points"]];
    }
    NSLog(@"final %@",string);

    MKPolyline *polyline=[self polylineWithEncodedString:string];
    [mapView addOverlay:polyline];
    [self zoomToFitMapAnnotations:mapView];

}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
 {   
   if(flag){
    [recievedRoutes appendData:data];
   }

}

//to decode polyline and retrives coordintes i have used following method

-(MKPolyline *)polylineWithEncodedString:(NSString *)encodedString {

const char *bytes = [encodedString UTF8String];
NSUInteger length = [encodedString lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
NSUInteger idx = 0;

NSUInteger count = length / 4;
CLLocationCoordinate2D *coords = calloc(count, sizeof(CLLocationCoordinate2D));
NSUInteger coordIdx = 0;

float latitude = 0;
float longitude = 0;
while (idx < length) {
    char byte = 0;
    int res = 0;
    char shift = 0;

    do {
        byte = bytes[idx++] - 63;
        res |= (byte & 0x1F) << shift;
        shift += 5;
    } while (byte >= 0x20);

    float deltaLat = ((res & 1) ? ~(res >> 1) : (res >> 1));
    latitude += deltaLat;

    shift = 0;
    res = 0;

    do {
        byte = bytes[idx++] - 0x3F;
        res |= (byte & 0x1F) << shift;
        shift += 5;
    } while (byte >= 0x20);

    float deltaLon = ((res & 1) ? ~(res >> 1) : (res >> 1));
    longitude += deltaLon;

    float finalLat = latitude * 1E-5;
    float finalLon = longitude * 1E-5;

    CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(finalLat, finalLon);
    coords[coordIdx++] = coord;
    NSLog(@"in encoding  %f %f ",latitude,longitude);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
    if (coordIdx == count) {
        NSUInteger newCount = count + 10;
        coords = realloc(coords, newCount * sizeof(CLLocationCoordinate2D));
        count = newCount;
    }
}

MKPolyline *polyline = [MKPolyline polylineWithCoordinates:coords count:coordIdx];
free(coords);

 return polyline;
  }

// to draw actual route

 - (MKOverlayView *)mapView:(MKMapView *)mapView
        viewForOverlay:(id<MKOverlay>)overlay {
MKPolylineView *overlayView = [[MKPolylineView alloc] initWithOverlay:overlay];
overlayView.lineWidth = 2;
overlayView.strokeColor = [UIColor purpleColor];
overlayView.fillColor = [[UIColor purpleColor] colorWithAlphaComponent:0.1f];
return overlayView;

}

enter image description here

enter image description here

Toseef Khilji
  • 17,192
  • 12
  • 80
  • 121
The iCoder
  • 1,414
  • 3
  • 19
  • 39
  • 1
    I would suggest you take a look at the points you got from your route, you might have gotten a weird point. Does this happen with every route you map, or just this one case? – Alan Moore Jun 01 '12 at 13:49
  • No this happen with every route. – The iCoder Jun 04 '12 at 04:34
  • Thanks Alan as you suggested i am not getting right points of path.Actually i am trying encoding polyline and appending it to previous polling like making single polyline string and passing this string to polylineWithEncodedString method so that not getting accurate points. Now called this encoding method for each and every polyline and also add overlay method for each point. That works for me...:) – The iCoder Jun 20 '12 at 16:01
  • Hello Pavan What change you made over here..? I have same issue Please help me. – Dipen Chudasama Jan 03 '14 at 10:53

1 Answers1

0

After your line

NSArray *steps=[[aary objectAtIndex:0]valueForKey:@"steps"];   

replace lines with this may work

NSMutableArray *polyLinesArray = [[NSMutableArray alloc] init];

for (int i = 0; i < [steps count]; i++)
{
    NSString* encodedPoints = [[[steps objectAtIndex:i] objectForKey:@"polyline"] valueForKey:@"points"];
    MKPolyline *route = [self polylineWithEncodedString:encodedPoints];
    [polyLinesArray addObject:route];
}

[self.mapView addOverlays:polyLinesArray];
[polyLinesArray release];
Warif Akhand Rishi
  • 23,920
  • 8
  • 80
  • 107