2016-04-03 13 views
0

Ich arbeite mit Google Maps SDK für iOS.Moving GMSMarker von X-Meter dividiert

Mein Projekt erfordert die Möglichkeit, die aktuelle Positionsmarkierung entlang des vorgegebenen Pfads, der in die Kartenansicht gezeichnet wird, um x Meter zu verschieben. Deshalb habe ich die folgende Methode aus this question (die Antwort von Koray Birand) umgesetzt:

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

Also, wenn ich das obige Verfahren wie das nennen folgende:

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

Daraus ergibt sich mir eine neue Stelle 0,5 Meter vom aktuellen Standort entfernt.

Allerdings gibt es ein kleines Problem, dass die Bewegung wie unten noch ein wenig abzulenken beginnt, obwohl der Ausgangspunkt der gleiche ist:

Path being drawn as deflected

ich konnte nicht herausfinden, warum eine solche Ablenkung geschieht und geht nicht geradeaus. Irgendwelche Ideen?

Antwort

1

Ich glaube, Sie haben diese Lösung von this answer, richtig? Wenn ja, feststellen, dass, wenn die lon2 Berechnung Sie tun:

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

nehmen nun einen Blick auf den Code der ursprünglichen Antwort:

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

Und Mitteilung das letzte Bit: ...- sin(lat1) * sin(lat2)), die in ihrem Code statt Breitengrade verwendet einen Breitengrad und einen Längengrad: ...- sin(longitude) * sin(lat2))

Also wahrscheinlich die richtige Lösung w Ould sein:

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

Vielleicht ist dies die Ursache des Problems ist ??

Ich hoffe es hilft =)