首页 > 解决方案 > 将两个坐标点转换为东西向和南北向的距离

问题描述

我试图找出如何在给定两点坐标(经纬度)的情况下分别计算两点之间的“东西向”距离和“南北向”距离,以便找出这条线与北方方向不同的程度。 简而言之,当 x 和 y 由经度和纬度给出时,我需要以米为单位计算 x 和 y 以获得 alpha 的度数。

我知道 CLLocation 有一个函数来计算两点之间的距离:

距离(从位置:CLLocation)-> CLLocationDistance

我试图打开该函数的源代码以弄清楚如何分离这两个组件,但我没有找到如何打开该代码。

标签: ioscore-locationcllocationmanagercllocation

解决方案


你可以用这个

func getDistanceAndAngle(positionA: CLLocation, positionB: CLLocation) -> (Float, Float, Float){

    let distanceInMeters = Float(positionA.distance(from: positionB)) // result is in meters
    print(distanceInMeters)
    //search for the degree
    let angle = bearingFromLocation(fromLocation: positionA.coordinate, toLocation: positionB.coordinate)
    print("ANGLE", angle)
    let xDistance = abs(distanceInMeters * cos(DegreesToRadians(degrees: angle)))
    let yDistance = abs(distanceInMeters * sin(DegreesToRadians(degrees: angle)))

    return (xDistance,yDistance,angle)
}


func bearingFromLocation(fromLocation:CLLocationCoordinate2D, toLocation: CLLocationCoordinate2D)-> Float{

    let lat1 = DegreesToRadians(degrees: Float(fromLocation.latitude))
    let lon1 = DegreesToRadians(degrees: Float(fromLocation.longitude))

    let lat2 = DegreesToRadians(degrees: Float(toLocation.latitude))
    let lon2 = DegreesToRadians(degrees: Float(toLocation.longitude))

    let dLon = lon2 - lon1

    let y = sin(dLon) * cos(lat2)
    let x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon)
    let radiansBearing = atan2(y, x)
    print("radian", radiansBearing)
    let degreesBearing = RadiansToDegrees(radians: radiansBearing)
    print("deg", degreesBearing)

    if (degreesBearing >= 0) {
        return degreesBearing
    } else {
        return degreesBearing + 360.0
    }
}

func DegreesToRadians(degrees: Float)->Float {return degrees * Float.pi / 180.0}
func RadiansToDegrees(radians: Float)->Float {return radians * 180.0/Float.pi}

注意:角度是从北到东,所以北是0度,东是90度。X 和 Y 始终为正。所以如果你想让它向左和向下负数,你可以尝试使用 degree 来使其正确。


推荐阅读