2012-05-31 2 views
0

Я пытаюсь провести маршрут между двумя точками, используя полилинию. Я получил несколько маршрутов, но не правильно, и я думаю, что он будет запутан на повороте. Я использую google api для получения точек маршрута. Следующее - это код, который я пробовал, пожалуйста, проверьте.Маршрут рисования частично не получает требуемый результат в iPhone MapView

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

}

// для декодирования полилинии и retrives coordintes я использовали следующий метод

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

// нарисовать фактический маршрут

- (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

+1

Я бы предложил вам взглянуть на пункты, которые вы получили на своем маршруте, возможно, вы получили странный момент. Это происходит с каждым вашим маршрутом или только с одним случаем? –

+0

Это не происходит с каждым маршрутом. –

+0

Спасибо Алан, как вы предположили, я не получаю правильные точки пути. Фактически я пытаюсь кодировать полилинию и добавлять ее к предыдущему опросу, как сделать одиночную строку полилинии и передать эту строку в метод polylineWithEncodedString, чтобы не получать точные точки. Теперь вызывается этот метод кодирования для каждой полилинии, а также добавляет метод наложения для каждой точки. Это работает для меня ... :) –

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^