2013-08-19 67 views
6

Tôi muốn đạt được những điều sau đây và tôi không biết liệu nó có khả thi hay không. Tôi đang có hai điểm trên một con đường (tưởng tượng như một đường hoàn thiện - chúng là hai cạnh của vỉa hè - chúng nằm trong một đường thẳng) và tôi muốn kiểm tra xem tuyến đường của người dùng đã đi qua giữa các điểm này chưa.Cách tìm hai tuyến đường bản đồ google đang được giao nhau trong dự án IOS

Vì vậy, tôi nghĩ, tôi có thể làm một cái gì đó như thế này:

  1. có được con đường giữa hai điểm này (họ khá gần - đường rộng 20 m nhiều nhất)
  2. có được con đường người dùng
  3. kiểm tra xem các tuyến đường này có đang giao nhau hay không, nếu có bất kỳ sự giao nhau nào giữa chúng.

Nếu đó là hình học thuần túy, sẽ dễ dàng. Tôi có hai dòng và tôi muốn biết nếu có bất kỳ giao lộ nào giữa chúng.

Tôi muốn sử dụng các mục sau trong dự án IOS, nếu có bất kỳ sự khác biệt nào. Ví dụ, tôi nghĩ rằng có lẽ có một cách lập trình để vẽ MKPolylines và xem liệu có giao lộ hay không. Tôi không muốn nhìn thấy nó một cách trực quan, tôi chỉ cần nó theo chương trình.

Có thể không? Bạn có thể gợi ý cho tôi điều gì khác không?

+0

Bạn đang cố gắng tìm hiểu xem người dùng có bỏ qua ses dòng đó (vị trí thực tế thông qua dịch vụ vị trí) hoặc bạn đang cố gắng để cho người dùng nhận chỉ đường và cố gắng tìm hiểu xem tuyến đường của các hướng này có đi qua một dòng cụ thể không? –

+0

@TimBodeit Tôi muốn tìm xem liệu người dùng có vượt qua đường không (nếu anh ta đã vượt qua dòng kết thúc chẳng hạn) – ghostrider

Trả lời

3

Không có phương pháp trực tiếp nào để kiểm tra giao lộ đó.

Bạn có thể biến vấn đề thành một vấn đề hình học bằng cách chuyển đổi vị trí vĩ độ/dài thành vị trí bản đồ (áp dụng biến đổi để làm phẳng lên lưới bình thường). Điều này có thể được thực hiện với MKMapPointForCoordinate.

Một điều cần xem xét là tính không chính xác của GPS đã báo cáo vị trí. Trong một số trường hợp, bạn sẽ thấy rằng tuyến đường được báo cáo từ GPS không thực sự trên đường nhưng chạy bên cạnh đường. Đặc biệt khi quay (chặt) góc, bạn thường sẽ có được một đường cong lớn trong đường đua. Như vậy bạn có thể muốn mở rộng chiều rộng của 'dòng kết thúc' để bù đắp cho điều này.


Nếu bạn chỉ quan tâm đến việc người dùng nằm trong một khoảng cách nhất định của một set point sau đó bạn có thể tạo một CLRegion để đại diện cho vị trí mục tiêu và sau đó gọi containsCoordinate: với vị trí người dùng hiện hành. Việc này sẽ loại bỏ bất kỳ phép chiếu nào và sử dụng trực tiếp lat/long. Bạn cũng có thể yêu cầu hệ thống giám sát điều này cho bạn và cung cấp cho bạn một cuộc gọi lại khi người dùng vào hoặc ra khỏi khu vực với startMonitoringForRegion:desiredAccuracy:. Một lần nữa, bạn cần phải xem xét độ chính xác của GPS khi thiết lập bán kính.

+0

Thực ra tôi không quan tâm nếu đó là giao lộ hay không. Tôi muốn tìm hiểu xem liệu người dùng đã vượt qua từ một điểm (ví dụ: nếu tôi có thể đặt bán kính trong một điểm và xem liệu vị trí của người dùng có nằm trong bán kính này hay không). Điều đó có dễ hơn kiểm tra giao lộ không? – ghostrider

2

tôi sẽ cố gắng để giải quyết vấn đề này trong ba bước:

Bước 1. Chuyển đổi theo dõi từng phối hợp của người dùng phải CGPoint và lưu nó một mảng.

// in viewDidLoad 
locManager = [[CLLocationManager alloc] init]; 
[locManager setDelegate:self]; 
[locManager setDesiredAccuracy:kCLLocationAccuracyBest]; 
[locManager startPdatingLocation]; 
self.userCoordinatePoints = [NSMutableArray alloc]init]; 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 

    CLLocationCoordinate2D loc = [newLocation coordinate]; 
    CGPoint *currentPoint = [self.mapView convertCoordinate:loc toPointToView:self.mapView]; 
    // add points to array 
    self.userCoordinatePoints addObject:currentpoint]; 
} 

Bước 2.Chuyển đổi MKPolylineView-CGPathRef
Tạo một biến lớp học của loại CGPathRef

{ 
    CGPathRef path; 
} 

Phương pháp này bạn phải thực hiện để tạo ra con đường giữa hai điểm:

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

Bước 3: Tạo một phương pháp tùy chỉnh để kiểm tra cho dù điểm nằm trong CGPath hay không

- (BOOL)userRouteIntersectsGoogleRoute 
{ 
// Loop through all CGPoints 
    for(CGPoint point in self.userCoordinatePoints) 
{ 
    BOOL val = CGPathContainsPoint(path, NULL, point); 
    if(val) 
    { 
    return YES; 
    } 
} 
return NO; 
} 
+0

cảm ơn, tôi sẽ thử và nếu nó hoạt động, tôi sẽ chấp nhận câu trả lời! – ghostrider

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