图元
实体 (Entity)为我们在Cesium中快速绘制各种图形提供了统一的入口,但是除了 实体以外, Cesium中还有一套比较重要的图形绘制接口 图元(Primitive)。相对于 实体来说,图元更接近渲染引擎底层,主要面向图形开发人员,意味着使用图元来绘制几何图形需要您具备一定的图形开发知识。
官方介绍
CesiumJS 提供了一个功能丰富的空间数据 API,可以分为两类:面向图形开发者的低层级 Primitive API,以及用于数据驱动可视化的高层级 Entity API。
低层级的 Primitive API 仅暴露完成任务所需的最小抽象,结构上更强调为图形开发者提供灵活的实现方式,而不是追求 API 的一致性。比如,加载模型的方式与创建广告牌完全不同,而这两者又与绘制多边形截然不同。每种可视化形式都是独立的功能模块,而且它们在性能表现和最佳实践上也各不相同。这种方式虽然强大而灵活,但对于大多数应用来说,更高层次的抽象会更加实用。
Entity API 则提供了一套设计统一的高层对象,它将相关的可视化和信息聚合为统一的数据结构,我们称之为“实体(Entity)”。使用 Entity API,我们可以专注于数据的展示,而不必担心底层的可视化机制。它还提供了便捷的构造方式,让我们可以轻松地构建复杂的、具有时间动态性的可视化,同时也适用于静态数据。虽然 Entity API 的内部其实是基于 Primitive API 实现的,但这是一个我们几乎不需要关心的实现细节。通过对传入数据应用各种启发式处理,Entity API 能够提供灵活、高性能的可视化体验,并且具有一致、易学、易用的接口。
创建
我们知道Entity可以通过new关键字和对象字面量两种方式创建
//new 关键字创建对象
let entity=new Cesium.Entity({
id:"001",
name:"实体名称",
label:{}
});
//对象字面量创建对象
let entity={
id:"001",
name:"实体名称",
label:{}
}但是Primitive只能通过new关键字创建,比如创建一个Entity对象
let primitive=new Cesium.Primitive({
...
});渲染
在场景中一个Entity对象要想被渲染出来,需要通过viewer.entities.add()方法将其添加到场景实体集合中,而一个Primitive对象要想被渲染出来,则需要通过viewer.scene.primitives.add()方法将其添加到场景图元集合中。
//创建一个圆形的几何图形
const circle = new Cesium.CircleGeometry({
center: Cesium.Cartesian3.fromDegrees(110.0, 30.0, 500),
radius: 200.0
});
//创建一个几何图形实例
const geometry = Cesium.CircleGeometry.createGeometry(circle);
//创建一个几何图形实例
const instance = new Cesium.GeometryInstance({
geometry: geometry,
});
//创建一个图元
const primitive=new Cesium.Primitive({
geometryInstances: instance,
appearance: new Cesium.MaterialAppearance({
material: new Cesium.Material({
fabric: {
type: "Color",
uniforms: {
color: Cesium.Color.BLUE
}
}
})
})
})
viewer.scene.primitives.add(primitive);管理
Primitive对象在场景中被添加后,可以通过viewer.scene.primitives.remove()方法将其从场景中移除,也可以通过viewer.scene.primitives.removeAll()方法将场景中的所有Primitive对象移除。
viewer.scene.primitives属性类型为 PrimitiveCollection,也是一个集合类型,提供了添加、删除图元的相关方法。
//添加图元
viewer.scene.primitives.add(primitive);
// 获取图元集合中图元
viewer.scene.primitives.get(0);
//删除图元
viewer.scene.primitives.remove(primitive);
//删除所有图元
viewer.scene.primitives.removeAll();