我的应用程序需要能够获取用户的起始位置,然后计算远离该点的纬度/长度坐标(在所有方向上)。有谁知道我怎么做到这一点?
答案 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];
}
编辑:我不小心丢掉了几个条款