概 述
本方案将离散点标量数据 (如温度、降水等)通过 Python 三角网格插值渲染为 PNG / TIF 纹理,再用 Geometry Script(几何脚本)根据四至生成贴合球面的网格并赋予纹理材质。

整体流程:

Python 端输出 EPSG:4326(WGS84 经纬度)的 PNG/TIF,详见第 2 节。
UE 端有两种常见实现方式:球体模型 + 材质遮罩 ,和 动态网格体贴合地表(本文档主方案)。两种方案的对比见第 4 节。
1.前置条件
1.1.Python 环境
bash
pip install matplotlib numpy pillow #绘图
pip install rasterio #导出TIF
1.2.Unreal Engine
-
已启用 Cesium for Unreal 插件
-
已启用 Geometry Script 插件(动态网格体相关节点)
-
场景中加载 Cesium 地球
1.3.数据处理
本文不包含 具体的数据读取与解析代码(JSON、CSV、NetCDF 等格式因项目而异)。以下为示例数据,数据需包含经度 +维度 +数值:
bash
[
{
"latitude": 31.5457,
"longitude": 108.3912,
"temperature_2m": 0.32
},
{
"latitude": 31.5475,
"longitude": 108.3921,
"temperature_2m": 0.68
},
{
"latitude": 31.5487,
"longitude": 108.3934,
"temperature_2m": 0.47
}
]
2.Python:生成 EPSG:4326 的 PNG 与 TIF
2.1.Python生成PNG/TIF逻辑
核心步骤:
-
根据数据范围计算输出图像尺寸并记录边界点
-
构建自定义色卡
-
根据三个顶点数值做平滑颜色插值
-
从画布中读取 RGBA 像素阵列
-
保存为4326坐标系的 PNG / GeoTIFF (带地理信息的TIF)以及一份
bounds.json边界数据


2.2.生成的边界数据
bash
{
"minLongitude": 90.96088, //最小经度
"maxLongitude": 115.777555, //最大经度
"minLatitude": 28.685457, //最小纬度
"maxLatitude": 45.877124 //最大纬度
}
3.数据验证
3.1.验证数据准确性(QGIS 对照)
建议在导入 UE 前,先用 QGIS 对出图结果做地理位置校验,确认纹理范围与内容无误后再贴到 Cesium 场景。
步骤:
-
添加底图参考图层(如影像地图、省市行政边界、河流水网等)。
-
将得到的 GeoTIFF 导入 QGIS。
-
在边界数据中选择几个边界点添加到QGIS中,检查图片范围、边界有无偏差。
-
气温、降水、风速会受地形、海拔等因素的影响,气象要素应与区域内易于辨认的地理特征(山脉、河流走向、迎风坡/背风坡、高原、沙漠等)匹配。

4.UE 方案对比:完整球体遮罩 vs 动态网格体
在 Cesium 地球表面展示气象 PNG 时,常见有两种 UE 实现路径。本文档后续章节以动态网格体方案为主,但有必要先说明两者差异,便于按项目选型。
4.1.方案 A:球体模型 + 材质遮罩
思路: 在地球外围放置一个与地球同心的球体模型(或略大一点的包裹球),在材质中用遮罩(Mask)控制显示指定经纬度范围内的气象图。


典型流程:

特点:
-
实现相对简单,一次建球即可复用于多个区域(改遮罩参数)
-
适合矩形经纬度范围的全球/半球级展示
-
球体与地球同心,高度固定,只能统一调整
-
非矩形区域(省界、流域)需复杂遮罩纹理,不够灵活
4.2.方案 B:动态网格体贴地(本文档主方案)
思路: 根据数据区域的四角边界用 Dynamic Mesh 生成 Plane,将纹理平铺到 Plane 上,再把 Plane 细分,最后使细分面顶点逐一转换到 Cesium 地球表面。

典型流程:

特点:
-
可任意修改高度
顶点的高度可设为固定抬升值或随数据变化
-
可生成不同形状
不限于矩形,
AppendTriangulatedPolygon支持任意简单多边形边界(行政区、流域、自定义轮廓) -
无需生成完成球体模型
按实际边界生成网格,不需要生成整个球体模型,边界外不生成网格。
4.3.方案对比
请添加图片描述
选型建议:
-
需要全球一层包裹、只裁切矩形窗口看气象图 → 球体遮罩方案更简单
-
需要异形边界、可调高度、精准贴地、多区域各自独立网格 → 动态网格体方案更合适
5.UE动态网格体方案
本节详述动态网格体方案 :根据数据区域的边界点经纬度(矩形四角或任意多边形顶点)创建动态网格体,细分后逐顶点贴到 Cesium 地球表面;高度可在坐标转换阶段自由指定。
5.1.导入 PNG
将 Python 生成的 PNG 导入 UE 并创建材质。


5.2.获取边界经纬度
Python 脚本会输出一份 bounds.json 文件,里面包含四个边界的经纬度,组合一下就能得到四个点的经纬度坐标:


5.3.根据边界四点生成 Plane
使用 Geometry Script 的动态网格体节点,根据四个边界点经纬度坐标生成一个矩形面片:
-
添加
Dynamic Mesh Component -
Reset Mesh重设已有网络 -
构造多边形顶点数组
-
调用
Append Triangulated Polygon
由于 UE 坐标系 Y 轴朝南,所以在构造多边形顶点数组时,纬度应乘-1,然后按照逆时针的顺序添加顶点。
bash
点0:(最小经度,-最小纬度)
点1:(最大经度,-最小纬度)
点2:(最大经度,-最大纬度)
点3:(最小经度,-最大纬度)


5.4.添加材质
将创建的材质赋予给动态网格体。


5.5.将纹理平铺到 Plane 上
PNG 纹理需要与网格对齐,使用 Set Mesh UVs from Planar Projection函数,输入参数 Plane Transform 中:
Location:面片左上角坐标(最小经度,-最大纬度,0)
Rotation:(0,0,0)
Scale:(经度差,纬度差,0)
将 PNG 完整平铺到整个Plane。



设置UV前 vs 设置UV后
5.6.Plane 网格细分
初始四边形只有 4个顶点,无法贴合地球曲率。使用 Apply Uniform Remesh进行细分:

细分前 vs 细分后

细分后顶点数显著增加,为下一步逐顶点贴地提供足够采样密度,推荐三角面数量5000。
5.7.顶点移到 Cesium 球面上
细分后每个面的顶点Location就是**(经度,-纬度,0)**,根据每个顶点的经度、纬度、高度计算出 Cesium 地球上对应的 UE 坐标,并设置到地球表面上。


6.结果检验与问题排查
6.1.生成结果准确性判断
-
纹理四至边界与 TIF 在 QGIS 中吻合
-
至少 2~3 个特征点在 QGIS 与 UE 中相对位置一致,无明显整体偏移、缩放或镜像
若 QGIS 中位置正确而 UE 中偏差,问题大概率出在边界配置、UV 映射或顶点贴地流程。
6.2.问题排查清单
-
Python 生成的 PNG 坐标系与 UE 中生成 Plane 的坐标系要一致(4326 或 3857)
-
PNG 四个顶点处经纬度确认一致
-
确认 UV 有进行平面投影,四至准确
7.总 结
-
生成纹理
利用Python将散点插值为 RGBA 栅格数据,生成纹理和边界数据,计算逻辑也可以放到 UE 的C++ 中。
-
UE 方案选型
全球矩形裁切可用球体模型 + 材质遮罩 ;需异形边界、可调高度、精细贴地时采用动态网格体方案(本文档主流程)。
-
动态网格体流程
用4个边界点生成平面网格,使用平面投影平铺 UV,平面经过细分后逐顶点贴合地球表面。
按以上流程即可将离散点标量数据可视化并贴合到 Cesium 地球表面。