计算远离另一对纬度/长度坐标的特定距离的纬度/长度坐标

时间:2014-10-21 15:20:06

标签: ios objective-c xcode swift latitude-longitude

我的应用程序需要能够获取用户的起始位置,然后计算远离该点的纬度/长度坐标(在所有方向上)。有谁知道我怎么做到这一点?

2 个答案:

答案 0 :(得分:4)

我在此链接Moving a CLLocation by x meters上找到了我的答案,并将其移植到Swift上工作。

func locationWithBearing(bearing:Double, distanceMeters:Double, origin:CLLocationCoordinate2D) -> CLLocationCoordinate2D {
    let distRadians = distanceMeters / (6372797.6) // earth radius in meters

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

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

    return CLLocationCoordinate2D(latitude: lat2 * 180 / M_PI, longitude: lon2 * 180 / M_PI)
}

Morgan Chen写道:

  

此方法中的所有数学运算均以弧度为单位。在开始时   方法,lon1和lat1为此目的转换为弧度   好。轴承也是弧度。请记住这个方法需要考虑   考虑到地球的曲率,你并不需要这样做   对于小距离。

答案 1 :(得分:3)

距离中心点固定距离的点集具有无限成员,因此无法列出每个点。但是,给定单个点,您可以使用distanceFromLocation:方法检查它是否在集合中。

在数学上,给定半径坐标(长,纬度)并假设地球是平坦的,半径(距离)r的圆的方程将是

r ^ 2 =(x - long)^ 2 +(y - lat)^ 2

使用一些魔法,这就变成了

x =rcosθ - long; y =rsinθ - lat

所以现在你可以任意角度打孔,并且对于已知的距离/半径,可以在圆的边缘上获得一个点。在地图方面,角度0将为您提供中心正东方圆上的点。正角度围绕中心逆时针旋转。

在代码中:

-(CLLocation*)locationForAngle:(float)angle fromCenterLocation:(CLLocation *)center withDistance:(float)distance {
    //angle must be in radians
    float longitude = distance * cosf(angle) - center.coordinate.longitude;
    float latitude = distance * sinf(angle) - center.coordinate.latitude;
    return [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];
}

编辑:我不小心丢掉了几个条款