Cesium——Property机制

100 阅读2分钟

在Cesium中,Property 是一种用于动态或静态数据的机制,可用于定义图形元素在时间和空间上的演变。

如空间位置。比如几何体的某一属性随时间动态变化,如高度或长度或位置等,在三维中最常见的是时间演变效果。

image.png

Property的基类接口

1、definitionChanged

获取每当此属性的定义更改时引发的事件。每当使用与当前值不同的数据调用 setValue 时,定义都会更改。可以通过该事件,来监听该Property自身所发生的变化。(只读属性)

2、getValue

用来获取某个时间点的特定属性值。getValue(time【时间点】,result【储存属性值】),返回修改后的结果参数或新实例

setValue(value【属性值】) 设置属性值
toString()返回表示属性值的字符串。
valueOf() 获取该属性的值。

3、isConstant

用来判断该属性是否会随时间变化,是一个布尔值

4、equals

用来检测属性值是否相等。(具体不知道干什么用的)

基本Property类型

1、ConstantProperty

用于定义一个恒定的属性,即属性值在整个时间范围内保持不变。

const constantProperty = new Cesium.ConstantProperty(42);

2、SampleProperty

用于表示一个随时间变化的属性,以时间和值的样本点数组形式存储。

const sampledProperty = new Cesium.SampledProperty(Number);
sampledProperty.addSample(Cesium.JulianDate.now(), 42);
window.viewer.entities.add({
          id:"hyp",
          position : Cesium.Cartesian3.fromDegrees(104.1, 30.6, 200),
          box : { 
            dimensions : new Cesium.Cartesian3(200.0, 200.0, 200.0),
            material : Cesium.Color.fromRandom({alpha : 1.0})
          }
      }) 
      window.viewer.flyTo(window.viewer.entities.getById("hyp"))  
      const clock = window.viewer.cesiumWidget.clock;
      clock.currentTime = Cesium.JulianDate.fromDate(new Date()); 
      let handler = new Cesium.ScreenSpaceEventHandler(window.viewer.scene.canvas);
      handler.setInputAction(function (event) {      
          let pick = window.viewer.scene.pick(event.position); 
          if (Cesium.defined(pick)) {     
            const property = new Cesium.SampledProperty(Cesium.Cartesian3);
            const startTime = new Cesium.JulianDate.fromDate(new Date());  
            property.addSample(startTime,new Cesium.Cartesian3(200.0, 200.0, 200.0))
            const stopTime = Cesium.JulianDate.addSeconds(startTime,60, new Cesium.JulianDate());
            property.addSample(stopTime,new Cesium.Cartesian3(400.0, 400.0, 600.0)); 
            pick.id.box.dimensions = property
          }
      }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
    

3、TimeIntervalCollectionProperty

用于表示速度向量,通过指定速度和方向属性来定义一个移动的图形元素。

window.viewer.entities.add({
            id: "tk",
            position : Cesium.Cartesian3.fromDegrees(104.1, 30.6, 200),
            box : { 
              dimensions : new Cesium.Cartesian3(200.0, 200.0, 200.0),
              material : Cesium.Color.fromRandom({alpha : 1.0})
            }, 
        });
    const trackedEntity = window.viewer.entities.getById("tk"); 
    const CollectionProperty = new Cesium.TimeIntervalCollectionProperty(); 
    const clock = window.viewer.cesiumWidget.clock;
    clock.currentTime = Cesium.JulianDate.fromDate(new Date()); 
    const startTime = new Cesium.JulianDate.fromDate(new Date());
    CollectionProperty.intervals.addInterval(
     new Cesium.TimeInterval({
          start: Cesium.JulianDate.addSeconds(startTime,1, new Cesium.JulianDate()),
          stop:  Cesium.JulianDate.addSeconds(startTime,10, new Cesium.JulianDate()), 
          data : new Cesium.Cartesian3(500.0, 500.0, 500.0),
      })
     )  
    trackedEntity._box._dimensions = CollectionProperty
    window.viewer.flyTo(trackedEntity)

4、CompositeProperty

CompositeProperty 是一种属性类型,用于组合多个属性,使其在某些方面行为类似于一个属性。

window.viewer.entities.add({
          id:"1",
          position : Cesium.Cartesian3.fromDegrees(104.1, 30.6, 200),
          box : { 
            dimensions : new Cesium.Cartesian3(200.0, 200.0, 200.0),
            material : Cesium.Color.fromRandom({alpha : 1.0})
          }
      })
      const property = new Cesium.SampledProperty(Cesium.Cartesian3);
      const startTime = new Cesium.JulianDate.fromDate(new Date());  
      property.addSample(startTime,new Cesium.Cartesian3(200.0, 200.0, 200.0))
      const stopTime = Cesium.JulianDate.addSeconds(startTime,60, new Cesium.JulianDate());
      property.addSample(stopTime,new Cesium.Cartesian3(400.0, 400.0, 600.0));
      var compositeProperty = new Cesium.CompositeProperty()
      compositeProperty.intervals.addInterval(
        new Cesium.TimeInterval({
          start: Cesium.JulianDate.addSeconds(startTime,1, new Cesium.JulianDate()),
          stop:  Cesium.JulianDate.addSeconds(startTime,10, new Cesium.JulianDate()), 
          data : property
        })
      ) 
      const trackedEntity = window.viewer.entities.getById("1");
      trackedEntity._box._dimensions = compositeProperty