如何在Cesium中的SampledProperty中定义属性类型

时间:2016-04-11 02:40:37

标签: javascript polygon cesium

我正在使用Cesiumjs创建一个在一个区域内移动的多边形。

为了显示其动作,我尝试创建sampledProperty PolygonHierarchy。每个样本都是Cartesian3个位置的数组(每个时间步长的多边形的三个端点)。

我需要知道我在property中使用的sampledProperty的类型,正如Cesiumjs网站中提到的那样:Cesiumjs.org/SampledProperty

但我不知道如何定义它,我在网站上找不到关于如何识别属性类型的任何解释,特别是当每个样本本身是一个属性数组时。

1 个答案:

答案 0 :(得分:1)

SampledProperty在这里不起作用,因为它试图在你给它的点之间平滑插值,并且它不知道如何插入多边形层次结构。

相反,您可以使用TimeIntervalCollectionProperty。这里的区别在于此属性按步骤动画,而不是插值,因此属性不需要知道如何在控制点之间构造中间值。

我制作了一个小型演示,以展示它如何与多边形层次结构一起使用。点击底部的Run Code Snippet,或将JavaScript复制并粘贴到Sandcastle

var viewer = new Cesium.Viewer('cesiumContainer', {
    navigationInstructionsInitiallyVisible: false
});

// Set up a limited range of time for this demo.
var time = Cesium.JulianDate.fromIso8601('2016-04-08T12:00:00Z');
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;
viewer.clock.startTime = time;
viewer.clock.currentTime = time;
viewer.clock.stopTime = Cesium.JulianDate.addSeconds(time, 20, new Cesium.JulianDate());
viewer.clock.multiplier = 1;
viewer.timeline.updateFromClock();
viewer.timeline.zoomTo(time, viewer.clock.stopTime);

// Construct a TimeIntervalCollection showing the changes to the hierarchy over time.
var hierarchy = new Cesium.TimeIntervalCollectionProperty();

for (var i = 0; i < 40; ++i) {
    var nextTime = Cesium.JulianDate.addSeconds(time, 0.5, new Cesium.JulianDate());

    // Inside the loop, per iteration we add one window of time for this polygon.
    hierarchy.intervals.addInterval(new Cesium.TimeInterval({
        start: time,
        stop: nextTime,
        isStartIncluded : true,
        isStopIncluded : false,
        data : Cesium.Cartesian3.fromDegreesArrayHeights([-108.0+i/4, 35.0, 100000,
                                                          -100.0+i/4, 35.0, 100000,
                                                          -100.0+i/4, 40.0, 100000,
                                                          -108.0+i/4, 40.0, 100000])
    }));
    
    time = nextTime;
}

// Create the polygon, using the animated hierarchy.
var orangePolygon = viewer.entities.add({
    name : 'Orange polygon with time-varying position',
    polygon : {
        hierarchy : hierarchy,
        extrudedHeight: 0,
        perPositionHeight : true,
        material : Cesium.Color.ORANGE.withAlpha(0.5),
        outline : true,
        outlineColor : Cesium.Color.WHITE
    }
});

viewer.zoomTo(viewer.entities);
html, body, #cesiumContainer {
  width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden;
  font-family: sans-serif;
}
<link href="http://cesiumjs.org/releases/1.19/Build/Cesium/Widgets/widgets.css" 
      rel="stylesheet"/>
<script src="http://cesiumjs.org/releases/1.19/Build/Cesium/Cesium.js">
</script>
<div id="cesiumContainer"></div>