2016-04-03 20 views
0

iOS için Google Maps SDK ile çalışıyorum.GMSMarker'ı X Metre İle Hareket Ettirme

Projem, geçerli konum işaretleyicisini, harita görünümüne çizilen önceden belirlenmiş yol boyunca x metre ile hareket ettirme yeteneğini gerektiriyor. Bu yüzden this question (Koray Birand tarafından cevap) den şu yöntemi uyguladık: Yukarıdaki yöntem gibi ararsanız Yani

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) 
} 

aşağıdadır:

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

Bu bana yeni bir konum verir 0.5 mevcut konumdan metre uzakta. Böyle bir sapma olur ve neden çözemedim

Path being drawn as deflected

: Başlangıç ​​noktası aynı olsa bile

Ancak hareketi aşağıda gibi küçük saptırmak için başladığı hafif sorun var düz gitmez. Herhangi bir fikir?

cevap

1

Bu çözümü this answer'dan aldığınızı düşünüyorum, değil mi? Eğer öyleyse , lon2 hesaplarken yapmanız fark:

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

Ve haber son bit:

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

şimdi özgün cevabım koduna bakmak içinde ...- sin(lat1) * sin(lat2)) hangi senin enlem yerine bir enlem ve bir boylam kullanır: ...- sin(longitude) * sin(lat2))

Muhtemelen doğru çözüm w ould:

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

Belki de bu sorun kaynağıdır ??

Umarım yardımcı olur =)