2012-10-22 37 views
5

Tôi đã viết ứng dụng đơn giản vẽ đường giữa hai vị trí trên MapKit. Tôi đang sử dụng API Google Map. Tôi đã sử dụng các tài nguyên tôi tìm thấy trực tuyến và đây là mã tôi đang sử dụng để gửi yêu cầu tới Google:MapKit - Thực hiện tuyến đường theo các đường phố khi bản đồ được phóng to

_httpClient = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://maps.googleapis.com/"]]; 
    [_httpClient registerHTTPOperationClass: [AFJSONRequestOperation class]]; 
    [_httpClient setDefaultHeader:@"Accept" value:@"application/json"]; 

    NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; 
    [parameters setObject:[NSString stringWithFormat:@"%f,%f", coordinate.latitude, coordinate.longitude] forKey:@"origin"]; 
    [parameters setObject:[NSString stringWithFormat:@"%f,%f", endCoordinate.latitude, endCoordinate.longitude] forKey:@"destination"]; 
    [parameters setObject:@"true" forKey:@"sensor"]; 

    NSMutableURLRequest *request = [_httpClient requestWithMethod:@"GET" path: @"maps/api/directions/json" parameters:parameters]; 
    request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request];  
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject){ 
     NSInteger statusCode = operation.response.statusCode; 

     if (statusCode == 200) 
     { 
      NSLog(@"Success: %@", operation.responseString); 
     } 
     else 
     { 
      NSLog(@"Status code = %d", statusCode); 
     } 
    } 
             failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
              NSLog(@"Error: %@", operation.responseString); 

             } 
    ]; 

    [_httpClient enqueueHTTPRequestOperation:operation]; 

Điều này hoạt động hoàn hảo. Khi tôi chạy này và cố gắng hiển thị tuyến đường giữa LA và Chicago, dưới đây là cách nó trông giống như:

LA - Chicago route zoomed out

NHƯNG. Khi tôi phóng to bản đồ đến cấp đường phố, dưới đây là cách tuyến đường trông giống như:

LA - Chicago route zoomed in

Có ai biết làm thế nào tôi có thể đạt được điều đó đường Tôi vẽ sau đường phố khi bản đồ được thu nhỏ? Tôi muốn lộ trình hiển thị con đường chính xác qua các đường phố. Tôi không biết liệu có cần thêm một số thông số nào đó vào yêu cầu của tôi cho Google hay không.

Bất kỳ trợ giúp hoặc lời khuyên nào đều tuyệt vời. Rất cám ơn trước!


[sửa # 1: Thêm URL request và response từ Google]

URL yêu cầu của tôi sau khi tạo đối tượng hoạt động từ mã trên trông như thế này:

http://maps.googleapis.com/maps/api/directions/json?sensor=true&destination=34%2E052360,-118%2E243560&origin=41%2E903630,-87%2E629790 

Chỉ cần dán mà URL đến trình duyệt của bạn và bạn sẽ thấy dữ liệu JSON mà Google gửi dưới dạng phản hồi mà tôi cũng nhận được trong mã của mình.


[sửa # 2: Phân tích câu trả lời từ Google và xây dựng con đường]

- (void)parseResponse:(NSData *)response 
{ 
    NSDictionary *dictResponse = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableContainers error:nil]; 
    NSArray *routes = [dictResponse objectForKey:@"routes"]; 
    NSDictionary *route = [routes lastObject]; 

    if (route) 
    { 
     NSString *overviewPolyline = [[route objectForKey: @"overview_polyline"] objectForKey:@"points"]; 
     _path = [self decodePolyLine:overviewPolyline]; 
    } 
} 

- (NSMutableArray *)decodePolyLine:(NSString *)encodedStr 
{ 
    NSMutableString *encoded = [[NSMutableString alloc] initWithCapacity:[encodedStr length]]; 
    [encoded appendString:encodedStr]; 
    [encoded replaceOccurrencesOfString:@"\\\\" withString:@"\\" 
           options:NSLiteralSearch 
            range:NSMakeRange(0, [encoded length])]; 
    NSInteger len = [encoded length]; 
    NSInteger index = 0; 
    NSMutableArray *array = [[NSMutableArray alloc] init]; 
    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]; 
     NSNumber *longitude = [[NSNumber alloc] initWithFloat:lng * 1e-5]; 

     CLLocation *location = [[CLLocation alloc] initWithLatitude:[latitude floatValue] longitude:[longitude floatValue]]; 
     [array addObject:location]; 
    } 

    return array; 
} 
+0

tôi đang sử dụng thư viện này. điều này làm việc tốt cho tôi. https://github.com/kadirpekel/MapWithRoutes –

Trả lời

1

Có vẻ như Google không đem lại cho bạn tất cả các điểm, hoặc bạn đang không nhìn vào tất cả các điểm. Trên thực tế, tôi mong đợi các polylines giữa các dấu vị trí, không chỉ các dấu vị trí như bạn dường như có (với một đường thẳng).

  • Kiểm tra DirectionsStatus trong phản ứng để xem nếu bạn được giới hạn
  • Cung cấp dữ liệu json mà Google gửi lại.

Tôi không chắc chắn rằng họ sử dụng phép chiếu Mercator hoàn toàn khác với phép chiếu được Google sử dụng.

+0

Cảm ơn bạn đã trả lời, Cyril. Kiểm tra chỉnh sửa số 1 trong câu hỏi của tôi, tôi đã cung cấp dữ liệu bạn đã yêu cầu ở đó. – uerceg

+0

Trong chỉnh sửa # 2 tôi đã thêm mã nguồn phân tích câu trả lời từ Google và xây dựng đường dẫn. Bây giờ tôi đã thử thay đổi chế độ từ DRIVING sang WALKING và điều thú vị là mặc dù phản hồi JSON từ Google rõ ràng là lớn hơn trong chế độ DRIVING, tôi vẫn nhận được 205 tọa độ cho WALKING trong đường dẫn, và cho DRIVING tôi nhận được 203 tọa độ con đường. Lạ thật. – uerceg

+0

Rất tiếc, tôi không có đủ kiến ​​thức về API chỉ đường để giúp bạn thêm. Tôi nghĩ rằng một yếu tố quan trọng là câu này trong tài liệu: "overview_polyline chứa một đối tượng đang nắm giữ một mảng các điểm mã hóa đại diện cho một con đường gần đúng (mịn) của các hướng kết quả." Hãy thử yêu cầu tương tự với một tuyến đường ngắn và xem liệu nó có chính xác hơn hay chưa, hãy thử một tuyến đường thực sự vuông như ở NY hoặc LA, để xem đường đi của bạn có tốt hơn khi bạn yêu cầu tuyến đường gần hơn không. –

0

Tôi tin rằng dự báo được sử dụng bởi MapKit là khác nhau hơn so với sử dụng bởi Google Maps. MapKit uses Cylindrical Mercator, trong khi Google uses a variant of the Mercator Projection.

Chuyển đổi giữa Phối hợp hệ thống Mặc dù bạn thường chỉ định điểm trên bản đồ bằng vĩ độ và kinh độ giá trị, có thể có lần khi bạn cần chuyển đổi sang và từ phối hợp các hệ thống khác. Ví dụ: bạn thường sử dụng các điểm bản đồ khi chỉ định hình dạng của các lớp phủ .

Quoted from Apple:

Các vấn đề liên quan