Cesium 利用path实现卫星轨道

实现轨道之前,先来看几个公式

1、T=2π*√(a^3/GM)
2、T=2π*√(a^3/μ)
3、T=√4π²r³/GM

1和2都是卫星运动周期公式,3是天体运动周期,a表示卫星的轨道半长轴,μ表示行星的引力常数,同时又等于G*M,G是万有引力常数,M是中心天体质量,参考如下:

中心天体引力常数

在cesium中,path定义为,描述Entity随时间移动时形成的路径的折线。故而,通过以下代码实现卫星轨道

let samp_icrf = new Cesium.SampledPositionProperty(
   Cesium.ReferenceFrame.INERTIAL
);
samp_icrf.setInterpolationOptions({
   interpolationDegree: 5,
   interpolationAlgorithm: Cesium.LagrangePolynomialApproximation,
});
// sample-原始坐标值
sample.forEach(
    (
      {
        epoch,
        x_ICRF,
        y_ICRF,
        z_ICRF
      }
    ) => {
      const time = Cesium.JulianDate.fromDate(new Date(epoch));
      samp_icrf.addSample(time, new Cesium.Cartesian3(x_ICRF, y_ICRF, z_ICRF));
      // samp_q.addSample(time, new Cesium.Quaternion(x, y, z, w));
    }
  );
viewer.entities.add(
{
    id: "sate_test",
    model: {
      uri: "model/wide.glb",
      minimumPixelSize: 120,
      maximumScale: 4800,
      skipLevelOfDetail: true,
      immediatelyLoadDesiredLevelOfDetail: true,
      runAnimations: false,
      incrementallyLoadTextures: false,
    },
    label: {
      text: "sate_test",
      font: "normal 30px 楷体",
      fillColor: Cesium.Color.fromCssColorString("#ffffff"),
      outlineColor: Cesium.Color.fromCssColorString("#000000"),
      outlineWidth: 3,
      pixelOffset: new Cesium.Cartesian2(0, -20), // 偏移量
      showBackground: true,
      backgroundColor:
        Cesium.Color.fromCssColorString("#000000").withAlpha(0.5),
      scaleByDistance: new Cesium.NearFarScalar(100000, 1.0, 10000000, 0.4),
      backgroundPadding: new Cesium.Cartesian2(10, 10), //指定以像素为单位的水平和垂直背景填充padding
      pixelOffsetScaleByDistance: new Cesium.NearFarScalar(
        100000,
        3.5,
        30000000,
        1
      ),
    },
    position: samp_icrf,
    // orientation: new Cesium.CallbackProperty((time) => {
//       const position = samp_icrf.getValue(time);
//       const hpr = new Cesium.HeadingPitchRoll(
//         Cesium.Math.toRadians(80),
//         Cesium.Math.toRadians(-90),
//         0
//       );
//       return Cesium.Transforms.headingPitchRollQuaternion(position, hpr);
//     }, false),
    path: {
      resolution: 60,
      material: Cesium.Color.GREEN,
      leadTime: a ? calcT(a) : calcTByTle2(tle2),
      trailTime: a ? calcT(a) : calcTByTle2(tle2),
      width: 1,
    },
  });

samp_icrf是插值计算出来的惯性系坐标值,用于控制卫星模型移动,leadTime和trailTime可以理解为卫星的运行周期值,用到上面说的公式:

// 根据六要素,生成卫星轨道
function calcT(a) {
  return 2 * Math.PI * Math.sqrt((a * a * a) / 3.986e14);
}

如果是tle卫星,则使用以下公式:

// 根据tle,生成卫星轨道
function calcTByTle2(line2) {
  if (line2.length !== 69) {
    return 0;
  }
  let nums = line2.substring(53, 63);
  return 86400 / nums;
}

根据两行根计算卫星运动周期(86400 / 每天环绕地球圈数[tle第二行53-63])

tle含义参考:mars3d-tle参数含义

以上的sample是后台计算得到的数据,也可以使用satellite.js插件转换tle得到位置信息,然后根据时间推算一圈位置信息,再根据上面说的代码实现卫星轨道,如此少了发送请求,可以快速将tle建模至地球上。

satellite.js官方地址: github地址

要使用Cesium绘制卫星轨道,您需要了解两个基本概念:TLE和CZML。 TLE(Two-Line Element)是一种描述卫星轨道的格式,通常由两行数字组成。第一行包括了卫星编号、轨道周期、轨道倾角、近地点角度、升交点经度、平近点角以及修正因子。第二行包括了卫星轨道的一些时间信息。TLE可以通过多种方式获取,例如NASA的网站、Space-Track等。 CZML(Cesium Language)是一种用于描述三维场景的JSON格式。它允许您在Cesium上创建实例、位置、姿态、时间等。CZML文件可以通过多种方式创建,例如手动编写、使用Cesium的CZML工具、使用第三方工具等。 要在Cesium中绘制卫星轨道,您需要执行以下步骤: 1. 获取TLE:从NASA网站、Space-Track等获取卫星TLE。 2. 使用Sgp4Propagator将TLE转换为卫星位置信息。Sgp4Propagator是一个用于计算卫星位置的工具,它使用TLE和当前时间来计算卫星位置。 3. 将位置信息转换为CZML格式。您可以使用Cesium的CZML工具或编写脚本来实现。 4. 在Cesium中加载CZML文件,绘制卫星轨道。 下面是一个简单的示例代码: ```javascript // 获取TLE var tle = "1 25544U 98067A 21200.54034253 .00001114 00000-0 32243-4 0 9995\n2 25544 51.6467 84.4509 0004939 77.1537 283.7394 15.48922298291569"; // 使用Sgp4Propagator计算卫星位置 var propagator = new Cesium.Sgp4Propagator.fromTle(tle); var startTime = Cesium.JulianDate.now(); var endTime = Cesium.JulianDate.addSeconds(startTime, 3600, new Cesium.JulianDate()); var interval = new Cesium.TimeInterval({ start: startTime, stop: endTime }); var positions = []; var time = new Cesium.JulianDate(); while (Cesium.JulianDate.lessThanOrEquals(time, endTime)) { var position = propagator.propagate(time); positions.push(position.x, position.y, position.z); time = Cesium.JulianDate.addSeconds(time, 60, new Cesium.JulianDate()); } // 将位置信息转换为CZML格式 var czml = [{ "id": "Satellite", "availability": interval.toString(), "position": { "epoch": startTime.toString(), "cartographicDegrees": positions }, "point": { "color": { "rgba": [255, 255, 255, 255] }, "pixelSize": 5 } }]; // 在Cesium中加载CZML文件 viewer.dataSources.add(Cesium.CzmlDataSource.load(czml)); ``` 这将在Cesium中绘制一个卫星轨道。您可以根据需要调整代码以适应不同的卫星和时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值