我的应用程序需要能够获取用户的起始位置,然后计算距离该位置特定距离(在所有方向上)的纬度/经度坐标。有人知道我如何实现这一点吗?
我的应用程序需要能够获取用户的起始位置,然后计算距离该位置特定距离(在所有方向上)的纬度/经度坐标。有人知道我如何实现这一点吗?
我在这个链接中找到了答案:移动CLLocation x米,并将其移植为适用于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)
}
摩根·陈写道:
此方法中所有的数学计算均以弧度为单位进行。 在方法开始时,lon1和lat1也会被转换为弧度以此为目的。 方位角也是以弧度为单位的。请记住,此方法考虑了地球的曲率,对于小距离您实际上不需要这样做。
一组与中心点距离相等的点具有无限成员,因此不可能列出每一个点。但是,通过使用distanceFromLocation:
方法,可以检查单个点是否在该集合内。
从数学上讲,给定一个半径坐标(经度,纬度),并假设地球是平的,则半径(距离)为r的圆的方程为
r^2 =(x-long)^2 +(y-lat)^2
借助一些魔法,这变成了
x = r cosθ - long; y = r sinθ - 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];
}
编辑:我不小心漏掉了几个术语
locationForAngle:
方法完全没有使用给定的 center
参数,所以肯定有什么问题... - Martin R
CLLocation
上使用distanceFromLocation:
来实现此功能。 - rckoenes