Calculate new coordinates with starting position and distance

前端 未结 1 857
醉酒成梦
醉酒成梦 2020-12-29 17:30

I am trying to get the coordinates of a point, that is on a set distance from a starting position, but the end result is wrong.

First, I calculate the angle between

相关标签:
1条回答
  • 2020-12-29 18:02

    Ok, after some more digging, I found this answer, which resolves my problem. Here is my complete solution in swift:

    internal func moveToLocation(location: CLLocationCoordinate2D, distance: Double) {
        let angle = self.calculateAngleBetweenLocations(self.currentLocation, targetLocation: location)
        let newLocation = self.coordinates(self.currentLocation, atDistance: distance, atAngle: angle)
    
        self.moveUser(newLocation: newLocation) 
    }
    
    private func coordinates(startingCoordinates: CLLocationCoordinate2D, atDistance: Double, atAngle: Double) -> CLLocationCoordinate2D {
        let distanceRadians = atDistance / 6371
        let bearingRadians = self.degreesToRadians(atAngle)
        let fromLatRadians = self.degreesToRadians(startingCoordinates.latitude)
        let fromLonRadians = self.degreesToRadians(startingCoordinates.longitude)
    
        let toLatRadians = asin(sin(fromLatRadians) * cos(distanceRadians) + cos(fromLatRadians) * sin(distanceRadians) * cos(bearingRadians))
        var toLonRadians = fromLonRadians + atan2(sin(bearingRadians) * sin(distanceRadians) * cos(fromLatRadians), cos(distanceRadians) - sin(fromLatRadians) * sin(toLatRadians));
    
        toLonRadians = fmod((toLonRadians + 3 * M_PI), (2 * M_PI)) - M_PI
    
        let lat = self.radiansToDegrees(toLatRadians)
        let lon = self.radiansToDegrees(toLonRadians)
    
        return CLLocationCoordinate2D(latitude: lat, longitude: lon)
    }
    
    private func calculateAngleBetweenLocations(currentLocation: CLLocationCoordinate2D, targetLocation: CLLocationCoordinate2D) -> Double {
        let fLat = self.degreesToRadians(currentLocation.latitude);
        let fLng = self.degreesToRadians(currentLocation.longitude);
        let tLat = self.degreesToRadians(targetLocation.latitude);
        let tLng = self.degreesToRadians(targetLocation.longitude);
        let deltaLng = tLng - fLng
    
        let y = sin(deltaLng) * cos(tLat)
        let x = cos(fLat) * sin(tLat) - sin(fLat) * cos(tLat) * cos(deltaLng)
    
        let bearing = atan2(y, x)
    
        return self.radiansToDegrees(bearing)
    }
    
    private func degreesToRadians(x: Double) -> Double {
        return M_PI * x / 180.0
    }
    
    private func radiansToDegrees(x: Double) -> Double {
        return x * 180.0 / M_PI
    }
    
    0 讨论(0)
提交回复
热议问题