访问器属性不直接渲染水位线,而是作为调度中枢串联地理坐标转换、3D几何构建、异步资源加载和材质更新;需封装waterLevel访问器,实现状态检查、按需加载、动态重绘、坐标转换及缓存清理。
访问器属性本身不直接实现水位线渲染,它只是提供一种可控的、带逻辑的属性读写方式。真正实现“按需加载的水位线”,需要把访问器作为调度中枢,串联地理坐标计算、3d几何构建、异步资源获取和材质更新四个环节。
用访问器封装水位状态与触发逻辑
定义一个 waterLevel 访问器属性,它的 set 逻辑不只是存数值,而是启动一整套响应流程:
- 检查新水位是否超出当前已加载的管道范围(比如垂直管高度为10米,新水位设为12米 → 需扩展加载)
- 若需扩展,触发对应区域的 3D Tiles 或自定义几何体的异步加载(例如调用
Cesium3DTileset.loadTile或自建loadWaterVolumeAsync()) - 加载完成后,自动更新水位几何体的高度、顶点位置及半透明材质参数
水位几何体必须支持动态重绘
不能每次改水位都重建整个圆柱体。推荐做法是:
- 预先创建一个可变高度的圆柱体缓冲区(
Cesium.Geometry.createCylinderGeometry),保留其vertexBuffer引用 - 在访问器 set 中,仅重写顶点 Y 坐标(或使用
Cesium.GeometryInstance+modelMatrix缩放控制高度) - 配合
Cesium.Material.fromType('Translucent')实现水体通透感,并通过uniforms动态传入水位高度值
地理坐标到水位空间坐标的实时转换
水位不是简单 Z 轴偏移,而是随地球曲率变化的真实高程。访问器内部应调用 Cesium 内置转换:
- 输入:经纬度坐标 + 水位海拔(如 45.2 米)
- 调用
Cesium.Cartographic.fromDegrees(long, lat, height)得到球面坐标 - 再转为笛卡尔坐标
Cesium.Cartesian3.fromCartographic(...),用于定位水位几何体原点 - 该过程必须放在访问器 setter 中,确保每次赋值都基于最新地理基准
避免重复加载与内存泄漏
访问器要自带状态缓存和清理机制:
- 记录上次加载的管道 ID 和水位区间(如
pipe_001: [0, 8.5]) - 新水位落在已有区间内 → 直接更新几何体,不触发加载
- 新水位超出 → 卸载旧水位体(
dataSource.entities.removeById),再加载新区间 - 配合
Cesium.RequestScheduler控制并发请求数,防止水位频繁抖动引发请求风暴

















