ios - 将两个坐标点转换为东西向和南北向的距离
问题描述
我试图找出如何在给定两点坐标(经纬度)的情况下分别计算两点之间的“东西向”距离和“南北向”距离,以便找出这条线与北方方向不同的程度。 简而言之,当 x 和 y 由经度和纬度给出时,我需要以米为单位计算 x 和 y 以获得 alpha 的度数。
我知道 CLLocation 有一个函数来计算两点之间的距离:
距离(从位置:CLLocation)-> CLLocationDistance
我试图打开该函数的源代码以弄清楚如何分离这两个组件,但我没有找到如何打开该代码。
解决方案
你可以用这个
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 来使其正确。
推荐阅读
- sql-server - 尽管修复了防火墙设置,但 Azure 服务器访问问题
- reactjs - Reselect:如何缓存写入reducer的数据?
- jenkins-pipeline - 根据作业执行某些阶段
- reactjs - .ts 和 .tsx 扩展名有什么区别。两者都用作响应中打字稿文件的扩展。那么我们应该在哪里使用它们呢?
- c# - 是否可以将 select 作为表达式传递以进行投影 DbSet?
- objective-c - 如何在 Objective C 或 Swift 中使用重复线性渐变
- azure - 仅部分用户出现“权限不足,无法完成操作”错误
- c++ - 为什么编译器选项会影响模板实现的选择?
- javascript - PWA 链接 http(s) 依赖项
- jquery - 如何在 jQuery Datatable 中的每个组之后添加分页?