2013-08-19 9 views
6

我想實現以下目標,但我不知道它是否可行。我在路上有兩個點(想象一條終點線 - 它們是路面的兩條邊 - 它們在一條直線上),我想檢查用戶的路線是否在這些點之間通過。如何查找兩個谷歌地圖路線是否在iOS項目中相交

所以我想,我可以做這樣的事情:

  1. 得到這兩個點之間的航線(他們很接近 - 道路寬20 m,在大多數)
  2. 讓用戶路線
  3. 檢查這些路線是否相互影響,如果它們之間有任何交叉。

如果它是純幾何圖形,它會很容易。我有兩條線,我想知道它們之間是否有交集。

我想在IOS項目中使用以下內容,如果它有所不同。例如,我認爲可能是以編程方式繪製MKPolylines並查看是否存在交集。我不想看到它,我只是需要編程。

可能嗎?你能提出其他建議嗎?

+0

您是否試圖找出用戶是否交叉(通過位置服務的實際位置),還是試圖讓用戶獲取路線並嘗試找出這些路線是否通過特定線路? –

+0

@TimBodeit我想找到用戶是否穿過線(例如,如果他已經通過終點線) – ghostrider

回答

3

沒有直接的方法來檢查該交點。

通過將緯度/長度位置轉換爲地圖位置(將變換應用於展平到標準化網格上),可以將問題轉化爲幾何問題。這可以通過MKMapPointForCoordinate完成。

需要考慮的一件事是GPS報告位置的不準確性。在許多情況下,您會發現從GPS報告的軌道實際上並不在道路上,而是在道路上行駛。特別是在轉彎(緊張)轉彎時,您經常會在賽道上出現大彎曲。因此,您可能想要擴大「終點線」的寬度以彌補這一點。


如果你只關心用戶是否是一組點的一定距離內,那麼你可以創建一個CLRegion來表示目標位置,然後調用containsCoordinate:與當前用戶的位置。這將刪除任何投影並直接使用lat/long。您還可以讓系統爲您監控此情況,並在用戶使用startMonitoringForRegion:desiredAccuracy:進入或退出該地區時給予回撥。再次,您需要在設置半徑時考慮GPS精度。

+0

其實我不在乎它是否是十字路口。我想知道用戶是否已經從一個點通過(例如,如果我可以在一個點上設置半徑並查看用戶的位置是否在這個半徑內)。這比檢查交叉點容易嗎? – ghostrider

2

我會嘗試在三個步驟來解決這個問題:

步驟1.將每個座標用戶的軌道才能CGPoint並保存一個數組。

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

第2步。轉換MKPolylineViewCGPathRef
創建類型CGPathRef

{ 
    CGPathRef path; 
} 

這種方法,你必須實現兩點之間創建路線之類變量:

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

步驟3:創建一個自定義的方法來檢查無論點是否在CGPath

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

謝謝,我會試試看,如果有效,我會接受答案! – ghostrider