You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cesium中GPS轨迹样式优化需求及部分解决方案

Cesium GPS轨迹起始段高程渐变区域实现方案

看起来你已经搞定了无轮廓彩色轨迹的问题,那咱们来解决第二个需求——给轨迹起始段加地面到轨迹高程的渐变区域。这个需求本质上是要创建一个贴合地面、沿着起始轨迹延伸的渐变坡面,下面是具体的实现思路和代码:

核心思路

我们需要生成一个闭合的多边形区域,一边贴合地面(或指定基准高程),另一边沿着轨迹起始段的实际高程,然后通过材质实现从地面到轨迹高度的透明度/颜色渐变。

具体代码实现

假设你已经有了GPS轨迹的坐标数组trajectoryPositions(格式为Cesium.Cartographic或Cesium.Cartesian3),可以按以下步骤操作:

// 1. 配置起始段参数:这里取前5个轨迹点作为起始渐变区域,可根据需求调整数量/距离
const startSegmentLength = 5;
const startTrajectoryPoints = trajectoryPositions.slice(0, startSegmentLength);

// 2. 获取起始段轨迹点对应的地面高程(需确保Cesium地形已加载完成)
const terrainProvider = viewer.terrainProvider;
// 转换为Cartographic格式用于地形采样
const cartographicPoints = startTrajectoryPoints.map(pos => 
  Cesium.Cartographic.fromCartesian(pos)
);
// 采样获取最精细的地面高程
const groundCartographics = await Cesium.sampleTerrainMostDetailed(terrainProvider, cartographicPoints);
// 转换回Cartesian3坐标
const groundPositions = groundCartographics.map(cart => 
  Cesium.Cartesian3.fromRadians(cart.longitude, cart.latitude, cart.height)
);

// 3. 构建渐变区域的多边形顶点:形成闭合面
const polygonVertices = [];
// 先反向添加地面点,再正向添加轨迹点,最后闭合到第一个地面点
for (let i = groundPositions.length - 1; i >= 0; i--) {
  polygonVertices.push(groundPositions[i]);
}
startTrajectoryPoints.forEach(pos => polygonVertices.push(pos));
polygonVertices.push(groundPositions[0]);

// 4. 创建渐变区域实体,使用自定义Shader实现高程驱动的渐变效果
viewer.entities.add({
  polygon: {
    hierarchy: new Cesium.PolygonHierarchy(polygonVertices),
    // 用CustomShader实现随高程变化的透明度渐变
    material: new Cesium.CustomMaterialProperty({
      fabric: {
        type: 'Color',
        uniforms: {
          // 起始和结束高程,用于计算渐变比例
          baseHeight: groundPositions[0].height,
          topHeight: startTrajectoryPoints[startSegmentLength - 1].height,
          // 渐变的基础颜色,和你的轨迹颜色保持一致
          trackColor: Cesium.Color.fromBytes(255, 66, 68, 255)
        },
        source: `
          czm_material czm_getMaterial(czm_materialInput materialInput)
          {
            czm_material material = czm_getDefaultMaterial(materialInput);
            // 计算当前点高程在渐变区间的比例
            float heightRatio = clamp((materialInput.positionMC.z - baseHeight) / (topHeight - baseHeight), 0.0, 1.0);
            // 设置漫反射颜色,透明度随高程升高逐渐增加
            material.diffuse = trackColor.rgb;
            material.alpha = heightRatio * 0.6; // 0.6是最大透明度,可调整
            return material;
          }
        `
      }
    }),
    // 关闭多边形轮廓,避免干扰轨迹显示
    outline: false
  }
});

关键注意事项

  • 地形加载时机:如果你的Cesium应用使用了地形,必须确保地形加载完成后再调用sampleTerrainMostDetailed,否则会获取不到正确的地面高程。可以通过viewer.terrainProvider.readyPromise来等待地形加载完毕。
  • 起始段范围调整:如果不想用固定点数,也可以根据轨迹点的距离来筛选起始段(比如取前100米的轨迹点),这样渐变区域的长度会更合理。
  • 简化方案:如果不需要贴合真实地形,也可以直接把地面点的高程设为0,跳过地形采样步骤,适合不需要高精度地形的场景。
  • 颜色统一:调整trackColor参数,让渐变区域的颜色和你已实现的轨迹颜色保持一致,视觉上更协调。

这样就能实现轨迹起始段从地面到实际高程的平滑渐变区域了,和你之前的无轮廓彩色轨迹搭配起来效果应该会很好。

内容的提问来源于stack exchange,提问作者luhu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:08:39