我在 1 个 iphone 应用程序中工作,我们需要在其中显示从 1 个地方到另一个地方的方向,即从当前位置(N 或 E 或 W 或 S 或 NE 或 NW 或 SE 或 SW )目的地所在的方向。我知道如何从一个地方到另一个地方的方向,但我正在寻找显示方向。我的问题清楚吗?如果有人知道怎么做,请帮助我谢谢大家!
2 回答
你知道这两个位置的坐标吗?
纬度 以度为单位的纬度。正值表示赤道以北的纬度。负值表示赤道以南的纬度。
经度 以度为单位的经度。测量值是相对于零子午线的,正值在子午线以东延伸,负值在子午线以西延伸。
因此,纬度很简单,如果目的地的纬度小于当前位置的纬度,那么它位于北方,如果它大于当前位置的纬度,那么它位于南方。
latitudinal_distance = destination.latitude - origin.latitude
经度稍微复杂一些,因为您应该考虑到向东绕地球四分之三的目的地可能更好地表示为向西。再次比较经度值,考虑东西距离,处理穿越子午线,选择较短的距离。
distance_east = (origin.longitude > 0 && destination.longitude < 0) ? 180 - origin.longitude + destination.longitude - -180 : destination.longitude - origin.longitude; if (distance_east < 0) distance_east += 360
distance_west = (origin.longitude < 0 && destination.longitude > 0) ? -180 - origin.longitude - 180 - destination.longitude : origin.longitude - destination.longitude; if (distance_west < 0) distance_west += 360
longitudinal_distance = min(distance_east, distance_west)
一旦您知道将两点分开的纬度和经度多少度,您就可以计算到目的地的航向并决定哪个航向应该显示为哪个罗盘点。在只有四个点(N、E、S、W)的指南针上,每个点将覆盖 90 度。在一个有 8 个点的指南针上,每个点将覆盖 45 度。希望你明白这一点。
heading = arctan(longitudinal_distance / latitudinal_distance)
if (heading >= -45 || heading < 45) return 'N'; else if (heading >= 45 && heading < 135) return 'E'; else if ...
已经很晚了,我没有测试这些表达式,所以如果它们看起来有用,请确保你理解并测试它们,而不是盲目地应用它们。不幸的是,我转换符号或坐标对的几率很高。
看看苹果的磁力计/核心位置样本:特斯拉计