2016-04-03 32 views
0

我正在使用適用於iOS的Google Maps SDK。移動GMSMarker by X Meters Deflections

我的項目需要能夠沿着繪製在地圖視圖上的預定路徑將當前位置標記移動x米。所以我從this question(由科瑞比蘭德答案)實施下面的方法:

func distance(distance: Double, AwayFromCoordinate origin: CLLocationCoordinate2D, WithBearing bearing: Double) -> CLLocationCoordinate2D { 
    let earthRadius = 6372797.6 // in meters 

    let radianDistance = distance/earthRadius 
    let radianBearing = bearing * M_PI/180.0 

    let latitude = origin.latitude * M_PI/180 
    let longitude = origin.longitude * M_PI/180 

    let lat2 = asin(sin(latitude) * cos(radianDistance) + cos(latitude) * sin(radianDistance) * cos(radianBearing)) 
    let lon2 = longitude + atan2(sin(radianBearing) * sin(radianDistance) * cos(latitude), cos(radianDistance) - sin(longitude) * sin(lat2)) 

    return CLLocationCoordinate2DMake(lat2 * 180/M_PI, lon2 * 180/M_PI) 
} 

所以,如果我把上面的方法如下所示:

currentLocationMarker.position = distance(0.5, AwayFromCoordinate: currentLocationMarker.position, WithBearing: bearing) 

這就產生了我一個新的位置0.5距離當前位置數米。

但是存在該運動開始偏轉有點像下面的一個小問題,即使出發點是一樣的:

Path being drawn as deflected

我無法弄清楚,爲什麼這樣的偏轉發生,不直。有任何想法嗎?

回答

1

我相信你從this answer得到了這個解決方案吧? 如果是這樣,請注意計算lon2當你這樣做:

let lon2 = longitude + atan2(sin(radianBearing) * sin(radianDistance) * cos(latitude), 
cos(radianDistance) - sin(longitude) * sin(lat2)) 

現在來看看原來的答案代碼:

let lon2 = lon1 + atan2(sin(rbearing) * sin(distRadians) * cos(lat1), 
cos(distRadians) - sin(lat1) * sin(lat2)) 

而且通知最後一位...- sin(lat1) * sin(lat2))這在你的代碼而不是緯度使用一個經度和一個經度:...- sin(longitude) * sin(lat2))

所以可能是正確的解決方案w烏爾德是:

let lon2 = longitude + atan2(sin(radianBearing) * sin(radianDistance) * cos(latitude), 
cos(radianDistance) - sin(latitude) * sin(lat2)) 

也許這是問題的根源??

我希望它有幫助=)