2013-09-24 45 views
13

Tôi đang sử dụng MKDirectionsRequest để tìm MKRoute giữa hai điểm. Câu trả lời sẽ được hiển thị trên MKMapView sử dụng mã này:Hiển thị MKRoute trên MKMapView trong iOS7

MKDirections *directions = [[MKDirections alloc] initWithRequest:request]; 
    [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) 
    { 
     if (error) 
     { 
      NSLog(@"Error : %@", error); 
     } 
     else 
     { 
      [_mapView removeOverlays:_mapView.overlays]; 
      for (MKRoute *route in response.routes) 
      { 
       [_mapView insertOverlay:route.polyline atIndex:0 level:MKOverlayLevelAboveRoads]; 
      } 
     } 
    }]; 

Câu hỏi của tôi là, nếu có một cách thích hợp để cập nhật các MKRoute nếu người dùng đang di chuyển. Atm Tôi đang sử dụng

- (void)mapView:(MKMapView *)aMapView didUpdateUserLocation:(MKUserLocation *)aUserLocation 

để nhận dạng chuyển động và cách tính này tôi đang loại bỏ lớp phủ MKRoute và tính toán và thêm mới với vị trí người dùng mới. Tôi tự hỏi liệu có cách tính toán tuyến đường chỉ một lần và cập nhật lớp phủ theo chương trình không?

Chỉnh sửa: Tôi tìm thấy điều này https://developer.apple.com/library/ios/documentation/MapKit/Reference/MKRouteStep_class/Reference/Reference.html#//apple_ref/occ/cl/MKRouteStep trong Apple Dev Docs. Tôi đoán tôi phải làm một cái gì đó giống như

for (MKRoute *route in response.routes) 
{ 
    for (MKRouteStep *step in route.steps) 
    { 
     [_mapView insertOverlay:step.polyline atIndex:0 level:MKOverlayLevelAboveRoads]; 
    } 
} 

nhưng làm thế nào tôi có thể nhận ra các bước thực hiện đằng sau vị trí người sử dụng thực tế?

Chỉnh sửa: Một tùy chọn khác có thể là sử dụng bộ hẹn giờ kích hoạt sự kiện (loại bỏ lớp phủ cũ và thêm lớp phủ mới). Bạn nghĩ sao?

[NSTimer scheduledTimerWithTimeInterval:15 target:self selector:@selector(addRouteOverlay) userInfo:nil repeats:YES]; 
+1

Tôi không khuyên bạn nên hẹn giờ vì sau đó bạn có thể không cần cập nhật lộ trình ngay cả khi người dùng chưa di chuyển. Tùy chọn đơn giản nhất là làm điều đó trong didUpdateUserLocation nhưng chỉ khi người dùng đã di chuyển X mét kể từ khi tuyến đường cuối cùng được vẽ. Không liên quan nhưng nếu bạn thêm thẻ "iOS" đơn giản vào câu hỏi, thẻ có thể thu hút sự chú ý nhiều hơn (cũng như làm nổi bật cú pháp mã đúng cách). – Anna

+0

Tôi đã thực hiện một số điều như thế này trước đây, nhưng không chắc chắn lý do tại sao bạn muốn tạo bản đồ tuyến đường chỉ khi người dùng đang di chuyển. Bạn có thể tạo lộ trình với MKPolyLine trên bản đồ lần đầu tiên giữa điểm bắt đầu và điểm kết thúc.Sau đó nếu người dùng di chuyển, bạn có thể hiển thị vị trí được cập nhật của người dùng trên bản đồ với Biểu tượng Vị trí Hiện tại mặc định (Vòng tròn Nhỏ màu xanh lam). Vui lòng làm rõ để tôi có thể đề xuất điều gì đó, –

+0

Vị trí của người dùng được hiển thị chính xác. ví dụ. đối với tuyến đường từ A-> B-> C, vị trí của người dùng là A và tuyến đường được hiển thị chính xác nhưng khi người dùng chuyển sang B, tuyến đường vẫn được hiển thị từ A-> C không phải từ B-> C. – matthias

Trả lời

0

Liên kết bên dưới chứa mã mẫu để hiển thị chỉ đường trên MKMapView, chúng tôi chỉ cần chuyển giá trị vĩ độ và kinh độ vào nó.

https://github.com/kadirpekel/MapWithRoutes

+0

Hoạt động như một sự quyến rũ Tôi đang tìm kiếm –

+3

Điều này không trả lời được câu hỏi. Liên kết trỏ đến dự án cũ 2 năm bằng cách sử dụng api của Google để nhận chỉ đường. Câu hỏi đặt ra là về cách sử dụng lại hiệu quả các kết quả từ MKDirections trong iOS 7. OP đã biết cách nhận chỉ đường ngay từ đầu. – Anna

+0

@Anna Nó là một lựa chọn onother mà có thể được sử dụng cho đến khi chúng tôi nhận được giải pháp của vấn đề này .. :) – Ashutosh

-2

Tôi có giải pháp tốt để thực hiện loại công việc này.

Chỉ cần nhận vị trí đích như dưới đây với lat (như -34.059811) và dài (như 150.769238).

CLLocation *destinationLocation=[[CLLocation alloc] initWithLatitude:-34.059811 longitude:150.769238]; 

và chuyển thông tin này lat dài trong chuỗi url dưới đây, bạn có thể trực tiếp chuyển thông tin này lat dài trong chuỗi,

NSString* strLink = [NSString stringWithFormat:@"http://maps.google.com/maps?saddr=Current+Location&daddr=%f,%f",destinationLocation.latitude,destinationLocation.longitude]; 

Bây giờ làm cho một url,

NSURL *url = [NSURL URLWithString: [strLink stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; 

mở url này trong trình duyệt hoặc UIWebView và làm mới trang đó bằng bộ hẹn giờ và xem ma thuật, tuyến đường sẽ tự động cập nhật theo vị trí hiện tại và vị trí đích, bạn không ' t cần phải cập nhật vị trí hiện tại mỗi lần.

Cảm ơn.