Skip to content

图元

实体 (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关键字和对象字面量两种方式创建

ts
//new 关键字创建对象
let entity=new Cesium.Entity({
   id:"001",
   name:"实体名称",
   label:{}
});
//对象字面量创建对象
let entity={
   id:"001",
   name:"实体名称",
   label:{}
}

但是Primitive只能通过new关键字创建,比如创建一个Entity对象

ts
let primitive=new Cesium.Primitive({
   ...
});

渲染

在场景中一个Entity对象要想被渲染出来,需要通过viewer.entities.add()方法将其添加到场景实体集合中,而一个Primitive对象要想被渲染出来,则需要通过viewer.scene.primitives.add()方法将其添加到场景图元集合中。

ts
//创建一个圆形的几何图形
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,也是一个集合类型,提供了添加、删除图元的相关方法。

ts
//添加图元
viewer.scene.primitives.add(primitive);
// 获取图元集合中图元
viewer.scene.primitives.get(0);
//删除图元
viewer.scene.primitives.remove(primitive);
//删除所有图元
viewer.scene.primitives.removeAll();

MGis 地理三维库