1、什么是RhumbLine
rhumb line是民航术语中的一个重要概念,它在航空导航中具有重要的意义。rhumb line又称为loxodrome,指的是一条航线上的每一段都与指南针方向保持恒定夹角的曲线。在航空领域,rhumb line可以用来规划飞行航线,确保飞机以最短的距离到达目的地。
rhumb line的计算通常基于大圆航线的近似,这是由于大圆航线计算复杂且耗时较长。在航空导航中,大圆航线是地球上两点之间最短的弧线。而rhumb line则是为了简化计算而采用的近似方法,它可以在航空导航中提供足够的准确性和可行性。rhumb line的特点在于它表示一种恒定的航向,不论是向东、向西、向南还是向北。这种航线的计算相对简单,因为它只需考虑起点和终点的经纬度,并通过已知的方程式来确定航向角度。尽管rhumb line在距离上并不是最短路径,但在特定条件下,尤其是涉及短途飞行或在较为简单的水域内航行时,它的应用显得非常方便。
图片来自【数学】等角航线loxodrome/rhumb line - 知乎 。
【ref:rhumb line 民航术语 - 百度文库】有些Cesium网站直接利用翻译软件把RhumbLine翻译成椭球上的横线是明显不对的。
2、RhumbLine有哪些方法
2.1 fromStartHeadingDistance
这个函数就是“一条航线上的每一段都与指南针方向保持恒定夹角的曲线”。它的参数也比较容易理解,包括开始点(start)、跟指南针的角度(heading)、行进的距离(distance)
2.2 findIntersectionWithLatitude
这个函数是计算某个纬度对应的经度。
2.2 findIntersectionWithLongitude
这个函数是计算某个经度对应的纬度。
2.3 interpolateUsingSurfaceDistance
从起点开始,每隔一段距离的位置,直到终点。即求插值点。
3、计算函数浅析
好了,上面第二章吃了这个类的快餐,本章节挑选几个有意思的函数或方法进行品鉴下。
3.1 calculateSigma
众所周知,经纬度转墨卡托的公式是
calculateSigme得到的就是在墨卡托坐标系下的X值,但只是比例值,并不是实际值,因为没有乘以公式中的K。
有了这个方法,在已知目标点纬度的情况下,就可以推出目标点所在的经度(longitude),
const sigma1 = calculateSigma(ellipticity, start.latitude);
const sigma2 = calculateSigma(ellipticity, end.latitude);
deltaLongitude = Math.tan(heading) * (sigma2 - sigma1);
longitude = CesiumMath.negativePiToPi(start.longitude + deltaLongitude);
同理,有了这个方法,在已知起点终点的情况下,就可以推出两点之间应该与指南针的角度
const sigma1 = calculateSigma(ellipsoidRhumbLine._ellipticity, firstLatitude);
const sigma2 = calculateSigma(ellipsoidRhumbLine._ellipticity,secondLatitude);
return Math.atan2( CesiumMath.negativePiToPi(secondLongitude - firstLongitude),
sigma2 - sigma1,
);
3.2 calculateM
众所周知,高斯-克吕格投影正算-即经纬度转为x和y 的公式就很复杂。
calculateM就是传递纬度,求得其中央子午线弧长。
有了这个方法,那么求两点之间的距离,即下面的代码:
const M1 = calculateM(ellipsoidRhumbLine._ellipticity, major,firstLatitude,);
const M2 = calculateM( ellipsoidRhumbLine._ellipticity,major,secondLatitude,);
distance = (M2 - M1) / Math.cos(heading);
需要注意,这个距离可能不是真实地球上的距离,可能因为跨带情况误差增大。
4、什么时候触发本类
这个类一般情况下用的还是比较少的,因为我们不是玩“大航海时代”。如果要触发本类,那么需要设定多线段跨域的经度要超过90°(还是180°?),并且需要设定线段的ArcType.RHUMB。