基于osgEarth的二维态势卫星瞬时覆盖绘制方法


一、基本方法

在二维态势中显示卫星瞬时覆盖也是各类应用中的常见需求。作者所见过的最为拙劣的实现方法是以卫星星下点为中心绘制一个圆或者矩形,这显然毫无意义,甚至都不如一个PPT,至少后者并不会给人以误导。

当把三维的地球表面投影到二维平面上时,由于投影产生变形,因此圆锥形状(如天线类传感器)的覆盖形状产生的投影一般不会是圆(当卫星星下点处于赤道附近时近似为圆),四棱锥形状(如相机类传感器)的覆盖形状也不会是矩形。

解决上述问题的常用技术为离散化:

①以圆锥形状传感器为例,根据卫星位置和传感器指向、圆锥半角,按固定个数(如120、360等)计算出圆锥与地球表面的交点;

②根据二维态势的投影方式,计算交点的投影坐标,首先计算各交点经纬度坐标,然后计算投影坐标,方法见 博文《基于osgEarth的卫星瞬时覆盖绘制方法》

③交点连线构成了地球表面的覆盖线,交点围城区域即为卫星瞬时覆盖区域。
在这里插入图片描述
上图中卫星所在纬度较低,其覆盖接近于圆。
在这里插入图片描述
而对于上图而言,卫星所处纬度较高,其形状已与标准的圆相去甚远了。


二、问题分析

但是问题在于,这些点存在2个跨越的可能:跨越东西半球交界;跨越南北极点。
在这里插入图片描述
如上图所示,卫星覆盖区域跨越了东西半球交界,在地球球面上的连续区域,在二维投影上不再连续。此时,如果仍然机械地按照采样点连线,则会突兀出现横跨地图的长线;按采样点绘制区域,则由于这些点已经不再构成简单多边形,因此其形状错误。

在这里插入图片描述
如上图所示,卫星覆盖区域包括地球的北极,此时交线形状会出现如图所示的情况,交线本身并不构成闭合区域,需要和北极结合起来,才可以构成闭合区域。


三、算法描述

设计算法如下:

(1)遍历所有采样点,计算出经度最小的位置,即为最左侧点;

(2)由最左侧点开始遍历,依次比较连续2点,如果后点经度始终大于前点,则意味着前述跨越了极点的情形。由于此时的区域并非凸多边形,因此不能采用osg::PrimitiveSet::POLYGON生成图元,而是采用osg::PrimitiveSet::QUAD_STRIP构造图元,对于每个点,构造对应的极点如交点坐标为(x,y),则过北极则对应加入(x,90°)。
在这里插入图片描述
需要指出的是,如上图所示,点的顺序有2种可能,即ABC或ACB,因此在遍历判断是否跨越极点的时候,需要进行2次遍历,一次顺序、一次倒序,只有2次遍历都不产生后点经度小于前点,才可判定为覆盖区域不包含极点。

(3)如不是上述情况,则有2种可能,即是否跨越东西半球。方法如下:

①构造2个空的点集,用于存储输出队列,记当前输出点集序号为i=0;

②如果连续2个点的经度差大于180°,则成为产生跨越;

③从最左侧点开始遍历所有点,将每个点输出到当前输出点集;产生跨越时,当前输出点集序号切换i^=1 。如果始终未产生跨越,则只有一个输出区域;产生跨越,则有2个输出区域。
在这里插入图片描述
如图所示,最左侧点为A,点集存在2种可能:A-B-D-C-A,或A-C-D-B-A。

如为A-B-D-C-A,则遍历时,首先将A沿逆时针到B的点输出到点集0,此时B和下一个点的经度差过大,产生跨越,i=1,当前输出点集序号变为1,由D到C的点输出到点集1中。

如为A-C-D-B-A,首先将A输出到点集0;然后产生跨越,当前点集序号变为1;由C沿顺时针到D的点输出到点集1;此时再次产生跨越,当前序号又变为0,继续将B沿顺时针到A的点输出到点集0中。

当然,由于采样点往往并不恰好落在180°分界线上,如果希望区域完整包含分界线,则还需要根据跳跃情况插入分界线上的点。


四、效果

在这里插入图片描述
上图为卫星覆盖区域包含北极的情况。
在这里插入图片描述
上图仍然为覆盖北极,对应的三维态势如右侧所示。

在这里插入图片描述
上图为卫星覆盖跨越了180°分界线的情况。
在这里插入图片描述
上图为场景中部署多颗不同卫星的情况。

算法的输出稳定,在各种情况下显示效果良好,再加上应用了 博文《基于osgEarth的二维态势中时变对象的绘制方法》中的二维绘制技术,在存在大量卫星的情况下,效率也满足实时绘制要求。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值