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

4

1 回答 1

0

在你的线路之后

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

用这个替换行可能有效

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];
于 2012-10-02T11:58:03.670 回答