Skip to content

实体

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

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

TIP

Cesium 有两套绘图接口,一个是 Entity,一个是 PrimitiveEntity 的内部是基于 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 类是一个接口定义,不能直接使用,我们需要使用具体的实现类,比如 CustomDataSourceGeoJsonDataSource 等。

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 地理三维库