前言

前面讲了cesium的API学习大概思路,对一些api不是很了解的可以基于那个框架去延伸。这路在看下cesium中对实体动态修改提供的内置对象 property

原理篇

博客园 :https://www.cnblogs.com/yanan-boke/p/7447997.html

vxtf简书 :https://www.jianshu.com/p/f0b47997224c

随笔

借图

cesium中每一个entity属性都是一个property实例,实例提供了基本的属性方法getValue,setValue以及equals。基于property基类提供positionProperty,materialProperty等拓展类,实现了更多效果和衍生。

Entity封装属性示例 :

Cesium中提供了defineProperties方法,继承Object.defineProperties新版cesium改成使用Object。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function Entity(options) {
var id = options.id;
if (!defined(id)) {
id = createGuid();
}
this._id = id;
this._name = options.name;
this._description = undefined;
this._position = undefined;
this._rectangle = undefined;
}

// Key 1:defineProperties
defineProperties(Entity.prototype, {
id : {
get : function() {
return this._id;
}
},
// Key 2:createRawPropertyDescriptor
name : createRawPropertyDescriptor('name'),
// Key 3:createPropertyDescriptor
description : createPropertyDescriptor('description'),
// Key 4:createPositionPropertyDescriptor
position : createPositionPropertyDescriptor('position'),
// Key 5:createPropertyTypeDescriptor
rectangle : createPropertyTypeDescriptor('rectangle', RectangleGraphics)
});

Cesium中的成员变量和属性方法之间就是一个下划线_,比如成员变量为_id,对应的属性方法为id,这是Cesium中的一个规范。

Property

Property基本类型:

区分:Property都是可以赋值给Entity的任意属性实例。

SampleProperty :用来通过给定多个不同时间点的Sample,然后在每两个时间点之间进行线性插值的一种Property

TimeIntervalCollectionProperty :该Property用来指定各个具体的时间段的属性值,每个时间段内的属性值是恒定的,并不会发生变化,除非已经进入到下一个时间段

ConstantProperty:最常用的property,cesium在给实体赋值自动将数值转换成property实例:enity.box.dimensions = new ConstantProperty(new Cesium.Cartesian3(400000.0, 300000.0, 200000.0));

CompositeProperty : 可以把多种不同类型的ConstantProperty、SampleProperty、TimeIntervalCollectionProperty等Property组合在一起来操作。比如前一个时间段需要线性运动,后一段时间再跳跃式运动

PositionProperty类型 :

内置的接口和property的基本接口作用一样,作用于position的

区分:不可实例化,只能用来表示position,拓展property接口

SampledPositionProperty:同SampleProperty作用一样,多了一个位置插值setInterpolationOptions用来表示不同差值的类型:线性插值,Lagrange插值,Hermite插值

MaterialProperty类型:

作用于Material外观材质的,基本材质的property接口。

区分:只能用来表示Material,拓展property接口

ColorMaterialProperty 示例:

1
2
3
4
5
6
7
8
9
var colorProperty = new Cesium.SampledProperty(Cesium.Color);

colorProperty.addSample(Cesium.JulianDate.fromIso8601('2019-01-01T00:00:00.00Z'),
new Cesium.Color(0, 1, 0));

colorProperty.addSample(Cesium.JulianDate.fromIso8601('2019-01-03T00:00:00.00Z'),
new Cesium.Color(0, 0, 1));

blueBox.box.material = new Cesium.ColorMaterialProperty(colorProperty);

其他类型的Property:

CallbackProperty :是自由度最高的一种Property,让用户通过自定义,回调函数,来返回需要的值。回调函数中,用户可以使用time来给定value,也可以以自己的方式给给定。

ReferenceProperty : 该Property可以直接链接到别的对象的Property上,相当于引用,省得自己构建了。比如这里我创建了一个红色的盒子redBox,希望它和之前的蓝色盒子一起变大

PropertyBag :可以包装一个对象(JS中的对象概念),该对象的每一个属性(JS中的属性概念),都可以作为一个动态的Property。

PropertyArray : 包装一个对象,内部封装了一个数组。

VelocityOrientationProperty :该Property用来Entity的position的位置变化,来计算出移动的方向,最后把速度方向输出成Orientation。这里可以实现动态路径绑定跟踪扫描物体。

VelocityVectorProperty :和VelocityOrientationProperty一样,不过是速度方向输出成一个预设的Vector