2014-10-07 37 views
0

我有一個路線(MKPolyline派生自MKRoute從蘋果的MKDirections API中檢索到)以及一組靠近路線的興趣點(數組MKAnnotation s)。如何確定導航路線中的下一個POI?

我想知道如何選擇用戶將要遵循路線的下一個POI,以便通過UI呈現它。

兩種不同的方法浮現在腦海中,但他們都不是真的足夠:

  • 第一個是標記POI的每個你得到足夠接近他們時進行檢查,並簡單地顯示數組中第一個未標記的POI(我們假定它們的順序是正確的)。問題是,如果出於某種原因或另一個POI沒有被選中,那麼該應用將永久顯示它而不是顯示實際的下一個POI即將到來。這種情況可能出現如果用戶所採用的路線與建議的路線稍有不同,那麼它與POI的距離並不近,無法檢查;或者用戶在第一POI之後開始導航;等等。

  • 第二個將是選擇離用戶最近的POI(可能還帶有標記系統以避免呈現剛剛檢查過的POI)。但是,這隻適用於足夠直的路線:有時在山區或其他彎曲的路線上,您可以更接近稍後實際會穿過的點。我預計這種情況實際上經常發生。

任何想法?

回答

0

使用以下僞距,我將打電話路線距離。直觀上,它的工作原理類似於highway location markers。假設路線多段線不接觸或交叉(很簡單)。有關一些段,其中p至上折線的PR,在我們的1D該點的座標系統中的位置的每個點q是歐幾里德(球形?)從pq距離,加所有段的長度都在之前,比如。兩個點之間的路徑距離是它們在我們的一維座標系中的位置差的絕對值。將路線的距離作爲路線上最近的點(通過this question about computing point-to-segment distance應該有助於計算最近的路線點),將路線距離擴大到路線上的點。

通過路線距離向用戶呈現最近的POI(當距離足夠小時檢查它)。

+0

感謝您的回答。我認爲不清楚的是,我將如何根據距離_沿着路線_(直線)來計算出最近的POI。 – KPM 2014-10-07 16:28:43

+0

@KPM我添加了說明。 – 2014-10-07 16:39:56

+0

謝謝!我也發現這個相關的問答很有用:http://stackoverflow.com/questions/14789706/calculate-distance-of-mkpolyline-path – KPM 2014-10-07 16:45:18

2

當我必須在我們的一個應用程序中實現turn-by-turn時,我使用了你描述的第一個項目符號。爲了弄清楚用戶是否偏離了原始多段線,我每次讀新位置時都會計算出當前位置和線段之間的距離。一旦我檢測到我沒有遵循路徑,我重新計算路線,同時顯示用戶的「重新計算...」消息。

這是我的代碼

- (BOOL)isCoordinate:(CLLocationCoordinate2D)coordinate closeToPolyline:(MKPolyline *)polyline { 
    CLLocationCoordinate2D polylineCoordinates[polyline.pointCount]; 
    [polyline getCoordinates:polylineCoordinates range:NSMakeRange(0, polyline.pointCount)]; 

    for (int i = 0; i < polyline.pointCount - 1; i++) { 
    CLLocationCoordinate2D a = polylineCoordinates[i]; 
    CLLocationCoordinate2D b = polylineCoordinates[i + 1]; 

    double distance = [self distanceToPoint:MKMapPointForCoordinate(coordinate) fromLineSegmentBetween:MKMapPointForCoordinate(a) and:MKMapPointForCoordinate(b)]; 
    if (distance < 25) { 
     return YES; 
    } 
    } 

    return NO; 
} 

- (double)distanceToPoint:(MKMapPoint)p fromLineSegmentBetween:(MKMapPoint)l1 and:(MKMapPoint)l2 { 
    double A = p.x - l1.x; 
    double B = p.y - l1.y; 
    double C = l2.x - l1.x; 
    double D = l2.y - l1.y; 

    double dot = A * C + B * D; 
    double len_sq = C * C + D * D; 
    double param = dot/len_sq; 

    double xx, yy; 

    if (param < 0 || (l1.x == l2.x && l1.y == l2.y)) { 
    xx = l1.x; 
    yy = l1.y; 
    } 
    else if (param > 1) { 
    xx = l2.x; 
    yy = l2.y; 
    } 
    else { 
    xx = l1.x + param * C; 
    yy = l1.y + param * D; 
    } 

    return MKMetersBetweenMapPoints(p, MKMapPointMake(xx, yy)); 
} 

然後我叫- (BOOL)isCoordinate:(CLLocationCoordinate2D)coordinate closeToPolyline:(MKPolyline *)polyline {coordinate是用戶當前的位置和polylineMKDirections是路徑。

在我的情況下,我不會允許超過25米的距離,但它可能取決於您的緯度/經度精度。

也許它會幫助你或某人。

+0

謝謝!在我的情況下,我不想重新計算路由,因爲它是向用戶提出的預定義路徑(公路旅行的組織者已經爲參與者選擇了該特定路徑)。但我相信這在另一個項目中會很有用。 – KPM 2015-10-05 14:21:36

相關問題