Skip to content

实体 ​

Entity 类是 Cesium 为开发者提供的一个高级的绘图接口,Cesium 开发者可以通过 Entity 类在 Cesium 程序中快速绘制各种空间数据,比如广告牌、文本信息、平面图形、几何体、还有能够表达复杂信息的模型(Model)等等。

Entity 类提供了统一的 API 来实现各种空间数据的可视化,使得我们只需关注数据的呈现,而不用关心底层实现机制(比如既可以用 Entity 类来绘制广告牌,也可以用来加载模型)。Entity 还可以和时间关联,实现各种动态的可视化效果。

TIP

Cesium 有两套绘图接口,一个是 Entity,一个是 Primitive, Entity 的内部是基于 Primitive 实现的,Primitive 相对来说更底层,主要面向图形开发人员,普通开发者使用 Entity 就可以,不需要关心底层实现逻辑,如果哪天 Entity 不能满足您的绘图需求了,那么就可以开始研究使用 Primitive 绘图接口。

图形 ​

使用 Entity 类来绘制各种空间数据是通过它所关联的图形属性来实现的, 如下图所示共有 17 种(红色框内)

graph

创建 ​

创建实体对象有以下两种方式

ts
// 实例化Entity类
// 便于后续通过变量引用并管理实体
const point = new Cesium.Entity({
  position: Cesium.Cartesian3.fromDegrees(104.0, 30.0),
  label: { text: "示例标签" },
});
viewer.entities.add(point);

// 通过对象声明
// 适用于一次性创建
viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(103.0, 25.0),
  point: { color: Cesium.Color.RED, pixelSize: 10 },
});

管理 ​

viewer 对象的 entities 属性类型为 EntityCollection,是一个实体的集合,用于管理实体对象,比如新增、删除实体。大多数情况下,我们管理实体对象只需要通过该属性就能完成,但是当我们想要分类管理场景中的实体对象时,如果仅通过该属性很难达到要求。如果您有 GIS 桌面软件使用经验,可能您会想到图层的概念,但是 Entity 主要用来表达三维空间数据,所以图层的概念在这里并不适用,在 Cesium 中使用数据源( DataSource )的概念进行取代,也就是说我们可以通过数据源来分类管理场景中的实体对象,比如我们将表示河流的实体存在一个数据源,将表示道路的实体存在另一个数据源。

Cesium 支持往场景中添加多个数据源,而一个 DataSource 对象其实在内部关联了一个 EntityCollection 对象,所以多个 DataSource 就是多个 EntityCollection 对象,这就比较容易理解数据源的工作原理了。

DataSource 类是一个接口定义,不能直接使用,我们需要使用具体的实现类,比如 CustomDataSource 、GeoJsonDataSource 等。

以 CustomDataSource 为例,实例化数据源对象后通过 viewer.dataSources.add() 将数据源添加到场景中。

ts
//管理河流相关的实体
let dataSource_river = new Cesium.CustomDataSource();
viewer.dataSources.add(dataSource_river);
dataSource_river.entities.add(
  new Entity({
    label: {
      text: "黄河",
    },
  })
);
//管理道路相关的实体
let dataSource_road = new Cesium.CustomDataSource();
viewer.dataSources.add(dataSource_river);
dataSource_road.entities.add(
  new Entity({
    label: {
      text: "成华大道",
    },
  })
);

这样对于数据源对象的控制,就是对数据源中实体集合的批量控制,也就是上面说的分类管理,比如统一控制显隐。

MGis 地理三维库