Cesium中EllipsoidRhumbLine的算法实现

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值