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

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

java 卫星轨道6根数实现轨道预测_第1张图片

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

 java 卫星轨道6根数实现轨道预测_第2张图片

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

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

部分代码截图如下。

java 卫星轨道6根数实现轨道预测_第3张图片

 java 卫星轨道6根数实现轨道预测_第4张图片

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

/**
 * 判断点是否在多边形内
 *
 * @param point 检测点
 * @param pts   多边形的顶点
 * @return 点在多边形内返回true, 否则返回false
 */
public static boolean IsPtInPoly(Point2D.Double point, List 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,轨道6根数,轨道预测)