java 卫星轨道6根数实现轨道预测

最近公司有个卫星的项目。实现轨迹预测。也就是说在一定时间内。某个区域中,卫星画过的轨迹

这是一个星期内算出的预测轨迹 。在区域内的点数然后进行连线并生成响应缓冲区效果如下图

 

上图是计算的北京2022-06-02到 2022-06-09一个星期内经过的点位。

其中做到上图效果要首先根据6根数。计算出一个经纬度点位信息。然后根据某个时间段,迭代生成点位。生成的点位过境的(在区域内的)要进行加密处理。然后对相近时间段的数据进行连线处理。如果在相近时间段(30s)生成的点位,只有一个的情况下。要根据一定角度和距离。预测另个点的位置。然后再进行相连。然后返给前端。进行渲染。前端要实现的是。根据线数据进行缓冲区处理。也就实现了上图的效果。前端用的是openlayers实现的。需要注意的是,多普段:降轨 微光:升轨。然后根据极区66-90维度范围内,来判断选择区域大小。目前极区范围内的不做区域面积限制。

部分代码截图如下。

 

以下代码判断点是否在多边形内

/**
 * 判断点是否在多边形内
 *
 * @param point 检测点
 * @param pts   多边形的顶点
 * @return 点在多边形内返回true, 否则返回false
 */
public static boolean IsPtInPoly(Point2D.Double point, List<Point2D.Double> pts) {
    int N = pts.size();
    boolean boundOrVertex = true; //如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true
    int intersectCount = 0;//cross points count of x
    double precision = 2e-10; //浮点类型计算时候与0比较时候的容差
    Point2D.Double p1, p2;//neighbour bound vertices
    Point2D.Double p = point; //当前点

    p1 = pts.get(0);//left vertex
    for (int i = 1; i <= N; ++i) {//check all rays
        if (p.equals(p1)) {
            return boundOrVertex;//p is an vertex
        }

        p2 = pts.get(i % N);//right vertex
        if (p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)) {//ray is outside of our interests
            p1 = p2;
            continue;//next ray left point
        }

        if (p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)) {//ray is crossing over by the algorithm (common part of)
            if (p.y <= Math.max(p1.y, p2.y)) {//x is before of ray
                if (p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)) {//overlies on a horizontal ray
                    return boundOrVertex;
                }

                if (p1.y == p2.y) {//ray is vertical
                    if (p1.y == p.y) {//overlies on a vertical ray
                        return boundOrVertex;
                    } else {//before ray
                        ++intersectCount;
                    }
                } else {//cross point on the left side
                    double xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;//cross point of y
                    if (Math.abs(p.y - xinters) < precision) {//overlies on a ray
                        return boundOrVertex;
                    }

                    if (p.y < xinters) {//before ray
                        ++intersectCount;
                    }
                }
            }
        } else {//special case when ray is crossing through the vertex
            if (p.x == p2.x && p.y <= p2.y) {//p crossing over p2
                Point2D.Double p3 = pts.get((i + 1) % N); //next vertex
                if (p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)) {//p.x lies between p1.x & p3.x
                    ++intersectCount;
                } else {
                    intersectCount += 2;
                }
            }
        }
        p1 = p2;//next ray left point
    }
    if (intersectCount % 2 == 0) {//偶数在多边形外
        return false;
    } else { //奇数在多边形内
        return true;
    }

}
极区范围:66-90
关于预测轨道的星下点数据,请看我这个文章

java根据六根数文件生成星下点数据,实现轨道预测-CSDN博客

关于卫星其他文章链接如下:

stk 根据六根数文件生成卫星轨迹(一)_stk复现轨道-CSDN博客

STK 根据六根数文件导出星下点(二)_六根数对应的星下点经纬度示例-CSDN博客

java根据六根数文件生成星下点数据,实现轨道预测-CSDN博客

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王威振的csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值