Cesium PolygonGeometry 添加面完整知识点 & TS 代码

PolygonGeometry + Primitive + PerInstanceColorAppearance 专门渲染 MULTIPOLYGON Z 带逐点高程三维空间面(当前项目当前使用) 区分:

  • PolygonGeometry:三维空间面,支持 perPositionHeight:true,每个顶点独立 Z 高程 ✅
  • GroundPolygonGeometry:贴地面,丢弃顶点高程,强制贴地形,不能用在 MultiPolygon‑Z 数据

一、核心 API 说明

PolygonGeometry 参数

const fillGeo = new Cesium.PolygonGeometry({
  polygonHierarchy: hierarchy,   // 多边形层级:外环 + 内环(洞)
  perPositionHeight: true,       // ✅开启逐点高程,MULTIPOLYGON‑Z必须打开
  vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT
});
  • polygonHierarchyPolygonHierarchy(外环Cartesian3[], 内环洞数组),支持挖洞
  • perPositionHeight:true:每个顶点使用自身 Cartesian3 的高度,形成起伏三维面
  • vertexFormat:使用PerInstanceColorAppearance必须配套这个顶点格式

GeometryInstance(实现每个面不同颜色)

new Cesium.GeometryInstance({
  geometry: fillGeo,
  id: item.id, //拾取ID
  attributes: {
    // 每个实例独立颜色
    color: Cesium.ColorGeometryInstanceAttribute.fromColor(fillColor)
  }
})

Primitive + PerInstanceColorAppearance

const prim = new Cesium.Primitive({
  geometryInstances: instances,
  appearance: new Cesium.PerInstanceColorAppearance({
    translucent: true,   //支持透明度
    closed: true         //几何体闭合
  }),
  asynchronous: true
});

⚠️重要限制

  1. PerInstanceColorAppearance 不支持 depthFailAppearance,面被地形埋住直接看不见,不能切换地下材质
  2. 如果需要被遮挡也可见:prim.depthTestEnabled = false; 关闭深度测试(会浮在最上层,牺牲三维真实感)
  3. 依靠attributes.color,实现同一个 Primitive 里面多个面各自不同颜色。
属性说明
geometryInstancesGeometryInstance 数组,一个面 = 一个实例
appearancePerInstanceColorAppearance,支持实例独立颜色
asynchronoustrue 异步构建几何体,大数据不阻塞页面
prim.depthTestEnabledtrue 开启深度测试;false 关闭,永远显示在顶层

二、基础完整示例(单一个三维面,带洞)

// 1.外环顶点,带高程Z
const outerRing = [
  Cesium.Cartesian3.fromDegrees(102.48, 24.70, 1600),
  Cesium.Cartesian3.fromDegrees(102.49, 24.71, 1620),
  Cesium.Cartesian3.fromDegrees(102.50, 24.70, 1580),
  Cesium.Cartesian3.fromDegrees(102.48, 24.70, 1600), // 闭合,首尾相同
];

// 2.内环(挖洞,可选)
const holeRing = [
  Cesium.Cartesian3.fromDegrees(102.485, 24.703, 1605),
  Cesium.Cartesian3.fromDegrees(102.488, 24.706, 1610),
  Cesium.Cartesian3.fromDegrees(102.486, 24.702, 1602),
  Cesium.Cartesian3.fromDegrees(102.485, 24.703, 1605),
];

// 3.构建层级,外环 + 多个内环洞
const hierarchy = new Cesium.PolygonHierarchy(outerRing, [
  new Cesium.PolygonHierarchy(holeRing)
]);

// 4.生成几何体,开启逐点高程
const polygonGeo = new Cesium.PolygonGeometry({
  polygonHierarchy: hierarchy,
  perPositionHeight: true,
  vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT
});

// 5.包装实例,设置本面颜色
const instance = new Cesium.GeometryInstance({
  geometry: polygonGeo,
  id: "poly_001",
  attributes: {
    color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.BLUE.withAlpha(0.35))
  }
});

// 6.创建Primitive
const prim = new Cesium.Primitive({
  geometryInstances: instance,
  appearance: new Cesium.PerInstanceColorAppearance({
    translucent: true,
    closed: true
  }),
  asynchronous: true
});

// 如果需要被地形遮挡也可见,打开下面
// prim.depthTestEnabled = false;

this.viewer.scene.primitives.add(prim);

三、批量渲染(多面,你项目 MULTIPOLYGON Z 逻辑)

const tempFillInstances: Cesium.GeometryInstance[] = [];

// wktGeo.coordinates  MULTIPOLYGON‑Z结构
wktGeo.coordinates.forEach((polygonParts: number[][][]) => {
  if (!Array.isArray(polygonParts) || polygonParts.length === 0) return;
  // polygonParts[0] = 外环;polygonParts[1...] = 内环洞
  const outerRingCoord = polygonParts[0];
  if (!Array.isArray(outerRingCoord) || outerRingCoord.length < 3) return;

  //外环转Cartesian3
  const outerPositions = outerRingCoord.map(([lon, lat, h]) =>
    Cesium.Cartesian3.fromDegrees(lon, lat, h ?? 0)
  );

  //处理挖洞内环
  const holes: Cesium.PolygonHierarchy[] = [];
  for (let i = 1; i < polygonParts.length; i++) {
    const innerCoord = polygonParts[i];
    if (!Array.isArray(innerCoord) || innerCoord.length < 3) continue;
    const innerPositions = innerCoord.map(([lon, lat, h]) =>
      Cesium.Cartesian3.fromDegrees(lon, lat, h ?? 0)
    );
    holes.push(new Cesium.PolygonHierarchy(innerPositions));
  }

  const hierarchy = new Cesium.PolygonHierarchy(outerPositions, holes);
  const fillGeo = new Cesium.PolygonGeometry({
    polygonHierarchy: hierarchy,
    perPositionHeight: true,
    vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT
  });

  const fillColor = Cesium.Color.fromCssColorString(colorStr).withAlpha(0.35);
  tempFillInstances.push(new Cesium.GeometryInstance({
    geometry: fillGeo,
    id: item.id,
    attributes: {
      color: Cesium.ColorGeometryInstanceAttribute.fromColor(fillColor)
    }
  }));
});

// 渲染Primitive
if(tempFillInstances.length > 0){
  const prim = new Cesium.Primitive({
    geometryInstances: tempFillInstances,
    appearance: new Cesium.PerInstanceColorAppearance({
      translucent: true,
      closed: true
    }),
    asynchronous: true
  });
  // prim.depthTestEnabled = false; //需要强制可见打开
  this.viewer.scene.primitives.add(prim);
  this.polygonPrimitiveMap.set(`fill_${Math.random()}`, prim);
}

四、拾取点击


const handler = new Cesium.ScreenSpaceEventHandler(this.viewer.canvas);
handler.setInputAction((click) => {
  const pick = this.viewer.scene.pick(click.position);
  if (Cesium.defined(pick)) {
    console.log('面要素ID', pick.id);
  }
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

五、销毁清除(内存泄漏)

private polygonPrimitiveMap = new Map<string, Cesium.Primitive>();

public clearPolygonPrimitive(){
  this.polygonPrimitiveMap.forEach(prim=>{
    this.viewer.scene.primitives.remove(prim);
  })
  this.polygonPrimitiveMap.clear();
}

六、重要坑清单

  1. perPositionHeight:true 只对 PolygonGeometry 生效;GroundPolygonGeometry 不支持,会丢失 Z 高程。
  2. PerInstanceColorAppearance 没有 depthFailAppearance,三维面埋进山体直接看不见,没有地下半透明方案。兜底:prim.depthTestEnabled=false
  3. 多边形顶点最少 3 个;WKT 解析要校验,少于 3 个直接跳过,否则渲染崩溃。
  4. 外环 / 内环建议首尾闭合,即使不闭合 Cesium 内部会自动闭合。
  5. Primitive 一旦创建,不能修改顶点坐标、不能修改单一面颜色;更新数据必须全部销毁重新构建。
  6. 想要每个面不同颜色:必须给每个GeometryInstance设置attributes.color,不能改 appearance 材质。
  7. 透明度依靠withAlpha()PerInstanceColorAppearance构造参数translucent:true必须打开,否则透明度失效。

七、对比总表(线 / 点 / 面)

要素几何体Appearance地下遮挡变色支持独立高程 Z
三维折线PolylineGeometryPolylineMaterialAppearance✅ depthFailAppearance
节点点PointPrimitiveCollection-✅ depthFailColor
三维空间面PolygonGeometryPerInstanceColorAppearance❌无 API,只能关闭 depthTestEnabled
贴地面GroundPolygonGeometryPerInstanceColorAppearance❌丢弃高程

业务选型总结

  1. MultiLineString‑Z 三维线:PolylineGeometry + Primitive + depthFailAppearance
  2. 折线上节点:PointPrimitiveCollection + depthFailColor
  3. MultiPolygon‑Z 带高程面:PolygonGeometry + PerInstanceColorAppearance,地下看不见只能depthTestEnabled=false兜底
内容概要:本文围绕&ldquo;基于分布式模型预测控制的多个固定翼无人机一致性控制&rdquo;展开,利用Matlab代码实现相关算法的仿真,旨在通过分布式控制策略实现多架固定翼无人机在复杂动态环境中的协同飞行与一致性控制。研究结合模型预测控制(MPC)方法,构建适用于多无人机系统的分布式优化框架,重点解决了通信受限、信息延迟及无中心化指挥条件下的协同稳定性问题。内容涵盖固定翼无人机的动力学建模、分布式MPC优化求解机制、一致性协议设计、通信拓扑结构分析以及仿真验证全过程,确保多机系统在保持队形一致的同时完成协同任务。; 适合人群:具备自动控制理论、无人机系统建模或多智能体协同控制基础,从事智能无人系统、集群控制、自动化与机器人等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于多无人机协同编队飞行、集群侦察、分布式任务执行等实际工程场景;②为分布式MPC算法在多智能体系统中的一致性控制提供可复现的Matlab仿真案例,推动先进控制理论向工程实践转化;③服务于科研论文复现、算法验证、控制系统课程设计与毕业课题参考。; 阅读建议:建议读者结合文中提供的Matlab代码逐模块运行与调试,重点关注分布式MPC在不同通信拓扑下对一致性收敛性能的影响,并可通过调整预测时域、权重矩阵与噪声参数等方式深化对算法鲁棒性与适应性的理解。
内容概要:本文提出了一种基于变分模态分解(VMD)、麻雀搜索算法(SSA)优化与长短期记忆网络(LSTM)相结合的光伏功率预测模型(VMD-SSA-LSTM),旨在提升光伏发电预测的精度与鲁棒性。该方法首先利用VMD对原始非平稳光伏功率序列进行自适应分解,获得一系列具有更稳定特征的本征模态分量(IMFs),有效降低数据复杂性与噪声干扰;随后引入麻雀搜索算法(SSA)对LSTM网络的关键超参数(如学习率、隐层节点数等)进行全局寻优,克服传统试凑法效率低、易陷入局部最优的问题,显著提升模型收敛速度与泛化能力;最后,构建多个LSTM子模型分别预测各模态分量,并将结果重构得到最终的光伏功率预测值。该混合模型充分融合了VMD在信号预处理中的优异分解性能、SSA在参数优化中的高效搜索能力以及LSTM在捕捉时间序列长期依赖关系上的强大建模优势,实现了对复杂气象因素影响下光伏出力波动的高精度拟合与预测。; 适合人群:具备一定电力系统、新能源发电或时间序列预测基础知识,熟悉MATLAB编程环境,从事光伏功率预测、智能电网调度、可再生能源集成、负荷预测等领域研究的科研人员、工程技术人员及高校研究生。; 使用场景及目标:①应用于光伏电站的短期与超短期功率预测,为电网安全调度、电力市场交易、储能系统配置及需求侧响应提供精准数据支撑;②解决传统单一预测模型(如ARIMA、BPNN、单一LSTM)在处理非平稳、强波动性光伏数据时存在的精度不足、稳定性差等问题;③为风电、负荷等其他非平稳时序预测问题提供一种有效的&ldquo;分解-优化-预测&rdquo;混合建模范式与技术实现路径。; 阅读建议:建议读者结合文中提供的完整MATLAB代码,深入理解VMD信号分解、SSA优化算法流程及LSTM网络构建的每一个技术环节,通过实际历史数据进行模型复现与对比实验(如与VMD-LSTM、SSA-LSTM等模型比较),掌握参数调优技巧与模型性能评估方法,从而真正掌握该先进混合预测模型的核心思想与应用精髓。
代码转载自:https://pan.quark.cn/s/a4b39357ea24 在当代信息技术行业,深度学习技术的应用已经全渗透到众多实际情境中,其中生成对抗网络(GAN)以及深度卷积生成对抗网络(DCGAN)被视为促进人工智能领域发展的核心技术之一。接下来将具体阐述如何借助Pytorch框架与MNIST数据集来完成基础GAN和DCGAN的开发,并解析过程中涉及的关键概念。 ### Pytorch框架与MNIST数据集概述 **Pytorch** 被视为一种广受欢迎的开源机器学习平台,其具备动态计算图与高度适应性等特性,因此在学术研究领域备受推崇,能够支持多种类型的深度学习架构。 **MNIST数据集** 是一个包含手写数字的图像集合,常用于训练各类图像识别系统,涵盖从0至9的数字图像,每张图像的尺寸为28x28像素。由于其入门级难度,MNIST数据集特别适合用于教学演示和实验操作。 ### 基础生成对抗网络(GAN)核心概念 **基础GAN** 是一种由生成器(Generator)和判别器(Discriminator)构成的无监督学习框架。生成器的核心任务是创造足以乱真的图像数据,而判别器的关键职责在于精确辨别真实图像与生成图像之间的差异。 1. **生成器**:该模块以随机噪声为输入,通过深度神经网络进行转换,最终输出接近真实图像的数据。其根本目的在于迷惑判别器。 2. **判别器**:对输入数据(无论是真实图像还是生成图像)进行评估,并输出其属于真实样本的概率。判别器的训练重点在于提升识别的精确度。 3. **训练机制**:GAN的训练过程涉及两个网络之间的交替训练,即在锁定一个网络参数的情况下对另一个网络进行训练。首先优化判别器以增强其区分能力...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值