如何无报错衔接不同时间区间的CZML多边形实时展示
解决CZML时间区间衔接报错的方案
问题根源
这个报错的本质是文档的clock时间区间和population_sampled属性的采样时间范围不匹配。当Cesium尝试在clock指定的区间内插值采样数据时,如果采样数据的时间范围完全落在clock区间之外,或者两者没有重叠,就会出现归一化结果为NaN的错误。
解决办法
1. 严格对齐时间范围
每次生成新CZML时,必须保证:
document.clock.interval的起止时间,和population_sampled.number里的时间戳范围完全一致- 比如切换到2:00-3:00的区间时,
TotalDate2要设成对应区间的ISO格式字符串,同时date_re1和date_re2也要改成这个区间的起止时间,和采样值对应上
2. 切换CZML时手动重置时钟
加载新CZML前,先重置Cesium时钟,避免旧状态干扰:
// 假设viewer是你的Cesium实例 viewer.clock.stop(); viewer.clock.currentTime = Cesium.JulianDate.fromIso8601(newCZML[0].clock.currentTime); viewer.clock.multiplier = newCZML[0].clock.multiplier; viewer.clock.interval = Cesium.TimeInterval.fromIso8601(newCZML[0].clock.interval); // 再加载新的CZML viewer.dataSources.add(Cesium.CzmlDataSource.load(newCZML));
3. 给采样数据加边界点
如果没法保证时间完全对齐,可以在采样数据的首尾加上和clock区间一致的边界点,确保插值时有有效数据:
比如clock区间是2:00-3:00,population_sampled.number可以这么写:
number: [ "202X-XX-XXT02:00:00Z", result6[0], // 区间起点 "202X-XX-XXT02:30:00Z", result6[1], // 中间数据 "202X-XX-XXT03:00:00Z", result6[2] // 区间终点 ]
这样就算时钟走到区间两端,也能拿到有效数值,不会出现NaN。
4. 统一时间格式
所有时间戳都用ISO 8601格式(比如YYYY-MM-DDTHH:mm:ssZ),避免Cesium解析时间出错,导致范围判断偏差。
验证方式
改完后切换CZML时,可以这么确认:
- 在浏览器控制台打印
viewer.clock.interval和采样数据的时间范围,检查是否重叠 - 观察多边形高度是否正常变化,控制台有没有报错
内容的提问来源于stack exchange,提问作者chan
相关产品推荐
相关产品推荐

