【发布时间】:2015-12-28 11:00:59
【问题描述】:
我目前正在使用一个使用 Cesium 查看器的应用程序。我需要能够显示将动态更新的形状集合。我无法理解执行此操作的最佳方法。
我目前正在使用实体并使用 CallbackProperties 来更新形状。
你可以通过这个进入沙堡来了解我是如何做到这一点的。有一个多边形对象被用作 cesiumCallback 的基础,它正在被另一段代码编辑。 (用setTimeout模拟)
var viewer = new Cesium.Viewer('cesiumContainer', {});
var polygon = {};
polygon.coordinates = [
{longitude: 0, latitude: 0, altitude: 0},
{longitude: 10, latitude: 10, altitude: 0},
{longitude: 10, latitude: 0, altitude: 0}
];
// converts generic style options to cesium one (aka color -> material)
var polOpts = {};
// function for getting location
polOpts.hierarchy = new Cesium.CallbackProperty(function() {
var hierarchy = [];
for (var i = 0; i < polygon.coordinates.length; i++) {
var coordinate = polygon.coordinates[i];
hierarchy.push(Cesium.Cartesian3.fromDegrees(coordinate.longitude, coordinate.latitude, coordinate.altitude));
}
return hierarchy;
}, false);
viewer.entities.add({polygon: polOpts});
setInterval(function(polygon){
polygon.coordinates[0].longitude--;
}.bind(this, polygon), 1000);
传入的多边形是一个通用描述多边形的类,所以它有一个坐标和样式选项的数组,还有一个调用这个方法的渲染方法renderPolygon传入。 这种渲染形状的方法适用于我需要的一切,但性能不是很好。形状更新有两种情况,一种形状会在很长一段时间内更新,速度很慢,比如每隔几秒一次。另一种是形状会在几秒钟内更新很多次,比如数千次,然后在很长一段时间内不会再改变,如果有的话。
我对如何解决这个问题有两个想法。
想法 1: 有两个方法,一个 renderDynamicPolygon 和一个 renderStaticPolygon。 renderDynamicPolygon 方法将使用 cesiumCallbackProperties 完成上述功能。这将用于在短时间内更新多次的形状。 一旦更新完成,renderStaticPolygon 方法将使用常量值替换使用 callbackProperties 的实体属性。
这会产生很多其他工作来确保形状处于正确状态,并且无助于长时间缓慢更新的形状。
想法 2: 与原语的工作方式类似,我尝试删除旧实体,并在每次需要更新时使用其更新的属性再次添加它,但这会导致闪烁,并且与原语不同,我找不到实体的异步属性。
我也尝试过使用原语。它对折线非常有用,我只需删除旧的并添加具有更新属性的新的。我还使用 async = false 来确保没有闪烁。我在这里遇到的这个问题并不是所有的形状都可以使用基元创建。 (这是真的吗?)
我尝试的另一件事是使用几何和外观的几何实例。在浏览了 cesium 网站上的教程后,我能够渲染一些形状,并且可以更新外观,但发现几乎不可能弄清楚如何正确更新形状,而且很难让它们看起来正确。形状需要具有正确的形状、填充颜色和不透明度以及描边颜色、不透明度和重量。我尝试使用polygonOutlineGeometry,但没有运气。
实现这一点的最佳方法是什么?这些选项之一是否朝着正确的方向前进,或者是否有其他一些我尚未发现的方法?
[编辑] 我添加了我得到的答案,但仍然不完整并正在寻找答案。
【问题讨论】:
-
不要绑定,而是以粗略的方式使用实体 API。 GetByID,然后更新实体。如果您有很多每秒更新很多次的形状,我建议您实现自己的着色器。
标签: cesium