Skip to content

Cesium 实体详解

实体核心概念

实体(Entity)是 Cesium 中用于表示动态时空对象的核心概念,是构建复杂三维场景的基础。通过实体系统,开发者可以轻松创建和管理点、线、面、模型等可视化元素,并支持时间动态属性、数据绑定和空间分析等高级功能。

实体系统的主要优势:

  • 声明式 API:简化复杂三维对象的创建过程
  • 时空动态性:支持随时间变化的属性动画
  • 层次化管理:通过父子关系构建复杂对象结构
  • 数据驱动:与数据源(DataSource)无缝集成
  • 自动优化:内置渲染优化和内存管理

实体类型

实体类型描述
点(Point)要与此实体关联的点
线(Polyline)要与此实体关联的多段线
多边形(Polygon)要与此实体关联的多边形
广告牌(Billboard)要与此实体关联的公告板
箱(Box)要与此实体关联的框
矩形(Rectangle)要与此实体关联的矩形
椭圆(Ellipse)要与此实体关联的椭圆
椭圆体(Ellipsoid)要与此实体关联的椭球体
圆柱体(Cylinder)要与此实体关联的圆柱体
标签(Label)与此实体关联的标签
路径(Path)要与此实体关联的路径
平面(Plane)要与此实体关联的平面
墙(Wall)要与此实体关联的墙
走廊(Corridor)要与此实体关联的走廊
模型(Model)要与此实体关联的模型

实体公共属性

所有实体类型共享以下公共属性:

属性名类型描述
idString实体的唯一标识符(自动生成或手动指定)
nameString实体的名称(用于图例和信息框)
showBoolean实体的可见性(默认为 true)
descriptionString实体的描述信息(支持 HTML 格式)
positionCartesian3实体的位置坐标(局部参考系)
orientationQuaternion实体的朝向(旋转角度)
propertiesObject自定义属性集合(键值对形式)
parentEntity父实体(用于构建层级关系)
viewFromCartesian3查看此实体的推荐相机位置
availabilityTimeIntervalCollection实体的可用时间区间

实体类型详解

点(Point)

点实体用于在三维空间中标记特定位置,始终以像素大小渲染,不受相机距离影响(除非设置了缩放属性)。

属性类型默认值描述
colorColorColor.WHITE点的填充颜色(支持 RGBA 透明度)
pixelSizeNumber1点的像素大小(屏幕空间固定尺寸)
outlineColorColorColor.BLACK点轮廓的颜色
outlineWidthNumber0点轮廓的宽度(像素)
heightReferenceHeightReferenceNONE高度参考模式:
• NONE - 绝对高度
• CLAMP_TO_GROUND - 贴地
• RELATIVE_TO_GROUND - 相对地面
scaleByDistanceNearFarScalarnull根据相机距离缩放点大小
translucencyByDistanceNearFarScalarnull根据相机距离调整透明度
distanceDisplayConditionDistanceDisplayConditionnull基于距离的显隐控制

基础实例

展开代码
vue
<template>
  <div ref="cesiumContainer" class="container"></div>
</template>

<script setup>
import { ref, onMounted } from "vue";
import * as Cesium from "cesium";
const cesiumContainer = ref(null);
let viewer = null;

// 天地图TOKEN
const token = "05be06461004055923091de7f3e51aa6";

onMounted(() => {
  // 初始化Viewer
  viewer = new Cesium.Viewer(cesiumContainer.value, {
    geocoder: false, // 关闭地理编码搜索
    homeButton: false, // 关闭主页按钮
    sceneModePicker: false, // 关闭场景模式选择器
    baseLayerPicker: false, // 关闭底图选择器
    navigationHelpButton: false, // 关闭导航帮助
    animation: false, // 关闭动画控件
    timeline: false, // 关闭时间轴
    fullscreenButton: false, // 关闭全屏按钮
    baseLayer: false, // 关闭默认地图
  });
  // 清空logo
  viewer.cesiumWidget.creditContainer.style.display = "none";

  // 添加实体
  const pointEntity = viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(116.3975, 39.9075, 50),
    point: {
      color: Cesium.Color.RED.withAlpha(0.8), // 80%不透明的红色
      pixelSize: 20, // 直径20像素
      outlineColor: Cesium.Color.WHITE, // 白色轮廓
      outlineWidth: 3, // 轮廓宽度3像素
      heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, // 贴地显示
    },
  });
  viewer.zoomTo(pointEntity); // 缩放到实体位置

  initMap();
});

// 加载天地图
const initMap = () => {
  // 以下为天地图及天地图标注加载
  const tiandituProvider = new Cesium.WebMapTileServiceImageryProvider({
    url:
      "http://{s}.tianditu.gov.cn/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=" +
      token,
    layer: "img",
    style: "default",
    format: "tiles",
    tileMatrixSetID: "w", // 天地图使用 Web 墨卡托投影(EPSG:3857),需确保 tileMatrixSetID: "w"
    subdomains: ["t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"], // 子域名
    maximumLevel: 18,
    credit: new Cesium.Credit("天地图影像"),
  });

  // 添加地理标注
  const labelProvider = new Cesium.WebMapTileServiceImageryProvider({
    url:
      "http://{s}.tianditu.gov.cn/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cia&tileMatrixSet=w&tileMatrix={TileMatrix}&tileRow={TileRow}&tileCol={TileCol}&style=default&format=tiles&tk=" +
      token,
    layer: "img",
    style: "default",
    format: "tiles",
    tileMatrixSetID: "w",
    subdomains: ["t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"], // 子域名轮询
    maximumLevel: 18,
    credit: new Cesium.Credit("天地图影像"),
  });
  // 天地图影像添加到viewer实例的影像图层集合中
  viewer.imageryLayers.addImageryProvider(tiandituProvider);
  // 天地图地理标注(后添加的会覆盖前面的)
  viewer.imageryLayers.addImageryProvider(labelProvider);
};
</script>
<style scoped>
.container {
  width: 100vw;
  height: 100vh;
}
</style>

点

动态属性应用

实现点的距离相关缩放和透明度变化:

js
// 距离越近越大,越远越小
pointEntity.point.scaleByDistance = new Cesium.NearFarScalar(
  1000, // 相机距离1000米时
  2.0, // 缩放至2倍大小
  5000, // 相机距离5000米时
  0.5 // 缩放至0.5倍大小
);

// 距离越近越不透明,越远越透明
pointEntity.point.translucencyByDistance = new Cesium.NearFarScalar(
  500,
  1.0, // 500米时完全不透明
  2000,
  0.2 // 2000米时20%透明度
);

// 相机距离 100-5000 米之间显示点
pointEntity.point.distanceDisplayCondition =
  new Cesium.DistanceDisplayCondition(
    100, // 最小可见距离(米)
    5000 // 最大可见距离(米)
  );

高级技巧

聚合大量点(Cluster)

展开代码
vue
<template>
  <div ref="cesiumContainer" class="container"></div>
</template>

<script setup>
import { ref, onMounted } from "vue";
import * as Cesium from "cesium";
const cesiumContainer = ref(null);
let viewer = null;

// 天地图TOKEN
const token = "05be06461004055923091de7f3e51aa6";

onMounted(() => {
  // 初始化Viewer
  viewer = new Cesium.Viewer(cesiumContainer.value, {
    geocoder: false, // 关闭地理编码搜索
    homeButton: false, // 关闭主页按钮
    sceneModePicker: false, // 关闭场景模式选择器
    baseLayerPicker: false, // 关闭底图选择器
    navigationHelpButton: false, // 关闭导航帮助
    animation: false, // 关闭动画控件
    timeline: false, // 关闭时间轴
    fullscreenButton: false, // 关闭全屏按钮
    baseLayer: false, // 关闭默认地图
  });
  // 清空logo
  viewer.cesiumWidget.creditContainer.style.display = "none";

  // 创建支持聚合的数据源
  const clusteredDataSource = new Cesium.CustomDataSource("clusteredData");

  // 添加到 Viewer
  viewer.dataSources.add(clusteredDataSource);

  // 启用聚合
  clusteredDataSource.clustering.enabled = true;

  // 配置聚合参数
  clusteredDataSource.clustering.pixelRange = 48; // 聚合像素范围
  clusteredDataSource.clustering.minimumClusterSize = 3; // 最小聚合点数

  // 添加点实体
  for (let i = 0; i < 1000; i++) {
    clusteredDataSource.entities.add({
      position: Cesium.Cartesian3.fromDegrees(
        116.3975 + Math.random() * 0.01, // 随机偏移
        39.9075 + Math.random() * 0.01, // 随机偏移
        50
      ),
      point: {
        pixelSize: 15,
        color: Cesium.Color.fromRandom(),
      },
      id: `point-${i}`,
    });
  }
  // 缩放到所有点
  viewer.zoomTo(clusteredDataSource);

  initMap();
});

// 加载天地图
const initMap = () => {
  // 以下为天地图及天地图标注加载
  const tiandituProvider = new Cesium.WebMapTileServiceImageryProvider({
    url:
      "http://{s}.tianditu.gov.cn/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=" +
      token,
    layer: "img",
    style: "default",
    format: "tiles",
    tileMatrixSetID: "w", // 天地图使用 Web 墨卡托投影(EPSG:3857),需确保 tileMatrixSetID: "w"
    subdomains: ["t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"], // 子域名
    maximumLevel: 18,
    credit: new Cesium.Credit("天地图影像"),
  });

  // 添加地理标注
  const labelProvider = new Cesium.WebMapTileServiceImageryProvider({
    url:
      "http://{s}.tianditu.gov.cn/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cia&tileMatrixSet=w&tileMatrix={TileMatrix}&tileRow={TileRow}&tileCol={TileCol}&style=default&format=tiles&tk=" +
      token,
    layer: "img",
    style: "default",
    format: "tiles",
    tileMatrixSetID: "w",
    subdomains: ["t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"], // 子域名轮询
    maximumLevel: 18,
    credit: new Cesium.Credit("天地图影像"),
  });
  // 天地图影像添加到viewer实例的影像图层集合中
  viewer.imageryLayers.addImageryProvider(tiandituProvider);
  // 天地图地理标注(后添加的会覆盖前面的)
  viewer.imageryLayers.addImageryProvider(labelProvider);
};
</script>
<style scoped>
.container {
  width: 100vw;
  height: 100vh;
}
</style>

聚合

线(Polyline)

线实体用于连接多个点形成连续线段,支持测地线(沿地球表面)、恒向线和直线三种模式。

属性类型默认值描述
positionsPositionProperty[]定义折线的顶点位置(Cartesian3 数组)
widthNumber1.0折线宽度(像素)
granularityNumberCesium.Math.RADIANS_PER_DEGREE折线的粒度(用于简化折线)
materialMaterialPropertyColor.WHITE折线的材质(颜色、纹理、特效等)
depthFailMaterialMaterialPropertynull用于指定当多段线位于 terrain 下方时用于绘制多段线的材质
arcTypeArcTypeArcType.GEODESIC线段类型:
• GEODESIC - 测地线(沿地球表面)
• RHUMB - 恒向线
• NONE - 直线
clampToGroundBooleanfalse是否贴地显示(需要地形数据)
shadowsShadowModeShadowMode.DISABLED指定多段线是投射还是接收来自光源的阴影
distanceDisplayConditionDistanceDisplayConditionnull基于距离的显隐控制
classificationTypeClassificationTypeClassificationType.BOTH指定折线应如何分类地形或 3D Tiles
zIndexNumber0控制折线的绘制顺序

基础实例:测地线

js
const positions = Cesium.Cartesian3.fromDegreesArray([
  116.3975,
  39.9075, // 北京
  121.4737,
  31.2304, // 上海
  114.1694,
  30.5812, // 武汉
]);

const polyline = viewer.entities.add({
  polyline: {
    positions: positions,
    width: 8,
    material: Cesium.Color.BLUE,
    arcType: Cesium.ArcType.GEODESIC, // 沿地球表面绘制
    clampToGround: true, // 贴地显示
  },
});

线

高级材质:虚线

js
// 虚线样式
polyline.polyline.material = new Cesium.PolylineDashMaterialProperty({
  color: Cesium.Color.GREEN,
  dashLength: 20,
  dashPattern: 0x9999, // 自定义虚线模式
});

多边形(Polygon)

多边形实体用于创建封闭的二维区域,支持孔洞、拉伸高度和纹理映射等高级特性。

属性类型默认值描述
hierarchyPolygonHierarchynull定义多边形的顶点位置(Cartesian3 数组)
materialMaterialPropertyColor.WHITE多边形的材质(颜色、纹理、特效等)
outlineBooleanfalse是否显示多边形轮廓
outlineColorColorColor.BLACK多边形轮廓的颜色
outlineWidthNumber1.0多边形轮廓的宽度(像素)
heightNumber0多边形的高度(相对于地形)
extrudedHeightNumber0.0多边形的拉伸高度(相对于地形)
perPositionHeightBooleanfalse是否为每个顶点指定高度
granularityNumberCesium.Math.RADIANS_PER_DEGREE多边形的粒度(用于简化多边形)
stRotationNumber0.0纹理旋转角度(弧度)
closeTopBooleantrue是否闭合顶部
closeBottomBooleantrue是否闭合底部
fillBooleantrue是否填充多边形
arcTypeArcTypeArcType.GEODESIC多边形类型:
• GEODESIC - 测地线(沿地球表面)
• RHUMB - 恒向面
• NONE - 平面
shadowsShadowModeShadowMode.DISABLED指定多边形是投射还是接收来自光源的阴影
distanceDisplayConditionDistanceDisplayConditionnull基于距离的显隐控制
classificationTypeClassificationTypeClassificationType.BOTH指定多边形应如何分类地形或 3D Tiles
zIndexNumber0控制多边形的绘制顺序

基础实例

js
const positions = Cesium.Cartesian3.fromDegreesArray([
  116.397,
  39.907, // 第一个点
  116.407,
  39.907, // 第二个点
  116.407,
  39.917, // 第三个点
  116.397,
  39.917, // 第四个点
]);

const polygon = viewer.entities.add({
  polygon: {
    hierarchy: positions,
    material: Cesium.Color.RED.withAlpha(0.5), // 半透明红色
    outline: true,
    outlineWidth: 20,
    outlineColor: Cesium.Color.WHITE,
  },
});

多边形

带孔洞多边形实例

hierarchy 属性为 PolygonHierarchy 类型,该类型可以接受一个 Cartesian3 数组,也可以接受一个 PolygonHierarchy 数组,用于定义多边形的顶点位置和孔的位置。

js
// 外部轮廓
const outerPositions = Cesium.Cartesian3.fromDegreesArray([
  116.39, 39.9, 116.41, 39.9, 116.41, 39.92, 116.39, 39.92,
]);

// 内部孔洞
const innerPositions = Cesium.Cartesian3.fromDegreesArray([
  116.397, 39.907, 116.403, 39.907, 116.403, 39.913, 116.397, 39.913,
]);

const polygon = viewer.entities.add({
  polygon: {
    hierarchy: new Cesium.PolygonHierarchy(outerPositions, [
      new Cesium.PolygonHierarchy(innerPositions),
    ]),
    material: Cesium.Color.RED.withAlpha(0.5),
    outline: true,
    outlineColor: Cesium.Color.WHITE,
    outlineWidth: 2,
    height: 100, // 从100米高度开始
    extrudedHeight: 300, // 拉伸至300米高度
  },
});

带孔多边形

模型(Model)

模型实体用于加载和显示 3D 模型,支持 glTF/glb 格式,是实现复杂三维场景的关键技术。

注意:路径就是uri,不是url

属性类型默认值描述
uriStringnull模型文件的 URL
enableVerticalExaggerationBooleantrue是否启用垂直夸大
minimumPixelSizeNumber128模型的最小像素大小(用于避免模型在屏幕上过于小)
maximumScaleNumberNumber.POSITIVE_INFINITY模型的最大缩放比例
incrementallyLoadTexturesBooleantrue是否增量加载纹理
scaleNumber1.0模型的缩放比例
runAnimationsBooleantrue是否运行模型的动画
clampAnimationsBooleantrue是否限制动画时间
animationAnimationnull模型的动画
shadowsShadowModeShadowMode.DISABLED指定模型是投射还是接收来自光源的阴影
heightReferenceHeightReferenceNONE高度参考模式:
• NONE - 绝对高度
• CLAMP_TO_GROUND - 贴地
• RELATIVE_TO_GROUND - 相对地面
silhouetteColorColorColor.RED模型轮廓的颜色
silhouetteSizeNumber0.0模型轮廓的大小(像素)
colorColorColor.WHITE模型的颜色
colorBlendModeColorBlendModeColorBlendMode.HIGHLIGHT颜色混合模式:
• HIGHLIGHT - 高亮
• REPLACE - 替换
• MIX - 混合
colorBlendAmountNumber0.0颜色混合的强度
imageBasedLightingFactorCartesian2new Cartesian2(1.0, 1.0)基于图像的光照因子
environmentMapOptionsEnvironmentMapOptionsnull环境贴图选项
lightColorColorColor.WHITE光照颜色
distanceDisplayConditionDistanceDisplayConditionnull基于距离的显隐控制
nodeTransformationsNodeTransformationsnull节点变换
articulationsArticulationsnull模型的关节(关节动画)
clippingPlanesClippingPlaneCollectionnull裁剪平面集合
customShaderCustomShadernull自定义着色器

基础实例

注意点: 无法使用import引入glb数据

  1. 可以将模型放在 public 目录下,建一个 models 文件,使用/models/Cesium_Air.glb
  2. 自定义模型路径,使用new URL("./models/Cesium_Air.glb", import.meta.url).href引入路径
  3. 以下模型是我从 cesium 官网中下载的,放在了该开源项目上,路径/src/Aassets/Basics/models
js
const modelEntity = viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(116.397, 39.907, 100),
  model: {
    // uri: '/models/Cesium_Air.glb', // 模型在public目录下
    uri: new URL("./models/Cesium_Air.glb", import.meta.url).href,
    scale: 10.0,
    minimumPixelSize: 128, // 最小像素尺寸
    maximumScale: 20000, // 最大缩放比例
  },
});

模型

动态位置

js
// 动态位置
let t = 0.000001;
modelEntity.position = new Cesium.CallbackProperty(() => {
  t += 0.000001;
  return Cesium.Cartesian3.fromDegrees(116.397 + t, 39.907, 100);
}, false);

// 相机跟随实体
viewer.trackedEntity = modelEntity;

模型裁剪与剖面分析

js
// 创建裁剪平面(垂直于X轴)
const clippingPlane = new Cesium.ClippingPlane(
  new Cesium.Cartesian3(1, 0, 0), // 法线方向
  0 // 距离原点的距离
);

modelEntity.model.clippingPlanes = new Cesium.ClippingPlaneCollection({
  planes: [clippingPlane],
  edgeWidth: 1.0, // 裁剪边缘宽度
  edgeColor: Cesium.Color.RED, // 裁剪边缘颜色
});

模型裁剪

广告牌(Billboard)

广告牌实体用于在 3D 场景中显示 2D 图像,始终面向相机,适合标记位置或显示图标。

属性类型默认值描述
imageStringnull广告牌的图像 URL
scaleNumber1.0广告牌的缩放比例
colorColorColor.WHITE广告牌的颜色
widthNumber0.0广告牌的宽度(像素)
heightNumber0.0广告牌的高度(像素)
verticalOriginVerticalOriginCENTER广告牌的垂直对齐方式:
• CENTER - 居中对齐
• BOTTOM - 底部对齐
• TOP - 顶部对齐
horizontalOriginHorizontalOriginCENTER广告牌的水平对齐方式:
• CENTER - 居中对齐
• LEFT - 左对齐
• RIGHT - 右对齐
pixelOffsetCartesian2new Cartesian2(0, 0)广告牌相对于其位置的像素偏移量
eyeOffsetCartesian3new Cartesian3(0, 0, 0)广告牌相对于相机的偏移量
rotationNumber0.0绕 alignedAxis 的旋转
alignedAxisCartesian3new Cartesian3(0, 0, 1)指定旋转的单位向量轴
sizeInMetersBooleanfalse是否以米为单位指定广告牌的大小
heightReferenceHeightReferenceNONE广告牌的高度参考模式:
• NONE - 绝对高度
• CLAMP_TO_GROUND - 贴地
• RELATIVE_TO_GROUND - 相对地面
scaleByDistanceNearFarScalarnull根据相机距离缩放广告牌大小
translucencyByDistanceNearFarScalarnull根据相机距离调整透明度
distanceDisplayConditionDistanceDisplayConditionnull基于距离的显隐控制
disableDepthTestDistanceNumbernull用于指定要禁用深度测试的相机的距离

基础实例

js
const billboard = viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(116.3975, 39.9075),
  billboard: {
    image: "/images/marker.png", // 图标路径
    scale: 0.5,
    color: Cesium.Color.WHITE,
    horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
    verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
    // pixelOffset: new Cesium.Cartesian2(0, -20), // 向上偏移20像素
  },
});
billboard.billboard.pixelOffset = new Cesium.Cartesian2(0, -50); // 向下偏移 50 像素

广告牌

箱(Box)

箱(Box)是 Cesium 中用于表示三维矩形的核心元素。它可以用于创建 3D 模型、表示物体的边界框、可视化数据等。

属性类型默认值描述
dimensionsCartesian3new Cartesian3(1.0, 1.0, 1.0)箱的尺寸(x, y, z)
heightReferenceHeightReferenceNONE高度参考模式:
• NONE - 绝对高度
• CLAMP_TO_GROUND - 贴地
• RELATIVE_TO_GROUND - 相对地面
materialMaterialPropertyColor.WHITE箱的材质(颜色、纹理、特效等)
outlineBooleanfalse是否显示轮廓
outlineColorColorColor.BLACK轮廓的颜色
outlineWidthNumber1.0轮廓的宽度(像素)
fillBooleantrue是否填充箱
shadowsShadowModeShadowMode.DISABLED指定箱是投射还是接收来自光源的阴影
distanceDisplayConditionDistanceDisplayConditionnull基于距离的显隐控制

基础实例

js
const box = viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(116.3975, 39.9075, 50),
  box: {
    dimensions: new Cesium.Cartesian3(1000, 1000, 500), // 长、宽、高
    material: Cesium.Color.RED.withAlpha(0.5), // 半透明红色
    outline: true,
    outlineColor: Cesium.Color.WHITE,
    outlineWidth: 2,
    heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, // 贴地显示
  },
});

箱

矩形(Rectangle)

属性类型默认值描述
coordinatesRectanglenew Rectangle(0, 0, 1, 1)矩形的坐标(west, south, east, north)
heightNumber0.0矩形的高度(相对于地形)
heightReferenceHeightReferenceNONE高度参考模式:
• NONE - 绝对高度
• CLAMP_TO_GROUND - 贴地
• RELATIVE_TO_GROUND - 相对地面
materialMaterialPropertyColor.WHITE矩形的材质(颜色、纹理、特效等)
outlineBooleanfalse是否显示轮廓
outlineColorColorColor.BLACK轮廓的颜色
outlineWidthNumber1.0轮廓的宽度(像素)
fillBooleantrue是否填充矩形
rotationNumber0.0矩形的旋转角度(弧度)
stRotationNumber0.0纹理旋转角度(弧度)
extrudedHeightNumber0.0矩形的拉伸高度(相对于地形)
shadowsShadowModeShadowMode.DISABLED指定矩形是投射还是接收来自光源的阴影
distanceDisplayConditionDistanceDisplayConditionnull基于距离的显隐控制

基础实例

js
const rectangle = viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(116.3975, 39.9075, 50),
  rectangle: {
    coordinates: Cesium.Rectangle.fromDegrees(
      116.3975,
      39.9075,
      116.4075,
      39.9175
    ), // 矩形的坐标
    material: Cesium.Color.GREEN.withAlpha(0.5), // 半透明绿色
    outline: true,
    outlineColor: Cesium.Color.WHITE,
    outlineWidth: 2,
    height: 100, // 矩形的高度
    extrudedHeight: 200, // 矩形的拉伸高度
    heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, // 贴地显示
  },
});

矩形

椭圆(Ellipse)

属性类型默认值描述
semiMajorAxisNumber1.0椭圆的长半轴长度
semiMinorAxisNumber1.0椭圆的短半轴长度
heightNumber0.0椭圆的高度(相对于地形)
heightReferenceHeightReferenceNONE高度参考模式:
• NONE - 绝对高度
• CLAMP_TO_GROUND - 贴地
• RELATIVE_TO_GROUND - 相对地面
materialMaterialPropertyColor.WHITE椭圆的材质(颜色、纹理、特效等)
granularityNumberCesium.Math.RADIANS_PER_DEGREE椭圆的粒度(用于简化椭圆)
outlineBooleanfalse是否显示轮廓
outlineColorColorColor.BLACK轮廓的颜色
outlineWidthNumber1.0轮廓的宽度(像素)
fillBooleantrue是否填充椭圆
rotationNumber0.0椭圆的旋转角度(弧度)
stRotationNumber0.0纹理旋转角度(弧度)
extrudedHeightNumber0.0椭圆的拉伸高度(相对于地形)
shadowsShadowModeShadowMode.DISABLED指定椭圆是投射还是接收来自光源的阴影
distanceDisplayConditionDistanceDisplayConditionnull基于距离的显隐控制

基础实例

js
const ellipse = viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(116.3975, 39.9075, 50),
  ellipse: {
    semiMajorAxis: 1000, // 长半轴
    semiMinorAxis: 500, // 短半轴
    material: Cesium.Color.BLUE.withAlpha(0.5), // 半透明蓝色
    outline: true,
    outlineColor: Cesium.Color.WHITE,
    outlineWidth: 2,
    height: 100, // 椭圆的高度
    extrudedHeight: 200, // 椭圆的拉伸高度
    heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, // 贴地显示
  },
});

椭圆

椭圆体(Ellipsoid)

属性类型默认值描述
radiiCartesian3null椭圆体的半径(x, y, z)
innerRadiiCartesian3null椭圆体的内半径(x, y, z)
minimumClockNumber0.0椭圆体的最小时钟角度(弧度)
maximumClockNumber2.0 * Math.PI椭圆体的最大时钟角度(弧度)
minimumConeNumber0.0椭圆体的最小圆锥角度(弧度)
maximumConeNumberMath.PI椭圆体的最大圆锥角度(弧度)
heightReferenceHeightReferenceNONE高度参考模式:
• NONE - 绝对高度
• CLAMP_TO_GROUND - 贴地
• RELATIVE_TO_GROUND - 相对地面
materialMaterialPropertyColor.WHITE椭圆体的材质(颜色、纹理、特效等)
outlineBooleanfalse是否显示轮廓
outlineColorColorColor.BLACK轮廓的颜色
outlineWidthNumber1.0轮廓的宽度(像素)
fillBooleantrue是否填充椭圆体
shadowsShadowModeShadowMode.DISABLED指定椭圆体是投射还是接收来自光源的阴影
distanceDisplayConditionDistanceDisplayConditionnull基于距离的显隐控制
stackPartitionsNumber64堆叠分区数
slicePartitionsNumber64切片分区数
subdivisionsNumber128细分次数

基础实例

js
const ellipsoid = viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(116.3975, 39.9075, 50),
  ellipsoid: {
    radii: new Cesium.Cartesian3(1000, 500, 250), // 长半轴、短半轴、高半轴
    material: Cesium.Color.YELLOW.withAlpha(0.5), // 半透明黄色
    outline: true,
    outlineColor: Cesium.Color.WHITE,
    outlineWidth: 2,
    extrudedHeight: 200, // 椭圆体的拉伸高度
    heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, // 贴地显示
  },
});

椭圆体

圆柱体(Cylinder)

属性类型默认值描述
lengthNumber圆柱体的长度
topRadiusNumber圆柱体顶部的半径
bottomRadiusNumber圆柱体底部的半径
heightReferenceHeightReferenceNONE高度参考模式:
• NONE - 绝对高度
• CLAMP_TO_GROUND - 贴地
• RELATIVE_TO_GROUND - 相对地面
materialMaterialPropertyColor.WHITE圆柱体的材质(颜色、纹理、特效等)
outlineBooleanfalse是否显示轮廓
outlineColorColorColor.BLACK轮廓的颜色
outlineWidthNumber1.0轮廓的宽度(像素)
fillBooleantrue是否填充圆柱体
shadowsShadowModeShadowMode.DISABLED指定圆柱体是投射还是接收来自光源的阴影
distanceDisplayConditionDistanceDisplayConditionnull基于距离的显隐控制
numberOfVerticalLinesNumber16垂直线条数
slicesNumber128切片数

基础实例

js
const cylinder = viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(116.3975, 39.9075, 50),
  cylinder: {
    length: 1000, // 圆柱体的长度
    topRadius: 500, // 顶部半径
    bottomRadius: 500, // 底部半径
    material: Cesium.Color.PURPLE.withAlpha(0.5), // 半透明紫色
    extrudedHeight: 200, // 圆柱体的拉伸高度
  },
});

圆柱体

标签(Label)

属性类型默认值描述
textString标签的文本内容
fontString'30px sans-serif'标签的字体
styleTextStyleLabelStyle.FILL标签的样式
fillColorColorColor.WHITE标签的填充颜色
outlineColorColorColor.BLACK标签的轮廓颜色
outlineWidthNumber1.0标签的轮廓宽度
scaleNumber1.0标签的缩放比例
showBackgroundBooleanfalse是否显示背景
backgroundColorColorColor.TRANSPARENT背景颜色
backgroundPaddingCartesian2new Cartesian2(7, 5)背景填充
heightReferenceHeightReferenceNONE高度参考模式:
• NONE - 绝对高度
• CLAMP_TO_GROUND - 贴地
• RELATIVE_TO_GROUND - 相对地面
horizontalOriginHorizontalOriginCENTER标签的水平对齐方式:
• CENTER - 居中对齐
• LEFT - 左对齐
• RIGHT - 右对齐
verticalOriginVerticalOriginCENTER标签的垂直对齐方式:
• CENTER - 居中对齐
• BOTTOM - 底部对齐
• TOP - 顶部对齐
pixelOffsetCartesian2new Cartesian2(0, 0)标签相对于其位置的像素偏移量
eyeOffsetCartesian3new Cartesian3(0, 0, 0)标签相对于相机的偏移量
pixelOffsetScaleByDistanceNearFarScalar根据相机距离缩放像素偏移量
scaleByDistanceNearFarScalar根据相机距离缩放标签大小
translucencyByDistanceNearFarScalar根据相机距离调整透明度
distanceDisplayConditionDistanceDisplayCondition基于距离的显隐控制
disableDepthTestDistanceNumber用于指定要禁用深度测试的相机的距离

基础实例

js
const label = viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(116.3975, 39.9075, 50),
  label: {
    text: "Hello World", // 标签文本
    font: "30px sans-serif", // 字体
    style: Cesium.LabelStyle.FILL, // 样式
    fillColor: Cesium.Color.WHITE, // 填充颜色
    outlineColor: Cesium.Color.BLACK, // 轮廓颜色
    outlineWidth: 2, // 轮廓宽度
    scale: 1.0, // 缩放比例
    showBackground: true, // 显示背景
    backgroundColor: Cesium.Color.TRANSPARENT, // 背景颜色
    backgroundPadding: new Cesium.Cartesian2(7, 5), // 背景填充
    heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, // 贴地显示
    horizontalOrigin: Cesium.HorizontalOrigin.CENTER, // 水平对齐方式
    verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 垂直对齐方式
    pixelOffset: new Cesium.Cartesian2(0, -50), // 向下偏移 50 像素
    eyeOffset: new Cesium.Cartesian3(0, 0, 0), // 相对于相机的偏移量
  },
});

标签

墙(Wall)

属性类型默认值描述
positionsCartesian3[]墙的顶点位置数组
maximumHeightsNumber[]墙的最大高度数组
minimumHeightsNumber[]墙的最小高度数组
materialMaterialPropertyColor.WHITE墙的材质(颜色、纹理、特效等)
outlineBooleanfalse是否显示轮廓
outlineColorColorColor.BLACK轮廓的颜色
outlineWidthNumber1.0轮廓的宽度(像素)
fillBooleantrue是否填充墙
shadowsShadowModeShadowMode.DISABLED指定墙是投射还是接收来自光源的阴影
distanceDisplayConditionDistanceDisplayCondition基于距离的显隐控制
granularityNumberCesium.Math.RADIANS_PER_DEGREE墙的粒度(用于简化墙)

基础实例

js
const wall = viewer.entities.add({
  wall: {
    positions: Cesium.Cartesian3.fromDegreesArrayHeights([
      116.3975, 39.9075, 100, 116.4075, 39.9075, 100, 116.4075, 39.9175, 100,
      116.3975, 39.9175, 100, 116.3975, 39.9075, 100,
    ]),
    material: Cesium.Color.GREEN.withAlpha(0.5), // 半透明绿色
    outline: true,
    outlineColor: Cesium.Color.WHITE,
    outlineWidth: 2,
    maximumHeights: [100, 100, 200, 100, 100], // 每个顶点的最大高度
    minimumHeights: [0, 0, 0, 0, 0], // 每个顶点的最小高度
  },
});

墙

走廊(Corridor)

属性类型默认值描述
positionsCartesian3[]走廊的顶点位置数组
widthNumber走廊的宽度
heightNumber走廊的高度(相对于地形)
heightReferenceHeightReferenceNONE高度参考模式:
• NONE - 绝对高度
• CLAMP_TO_GROUND - 贴地
• RELATIVE_TO_GROUND - 相对地面
extrudedHeightNumber走廊的拉伸高度(相对于地形)
extrudedHeightReferenceHeightReferenceNONE拉伸高度参考模式:
• NONE - 绝对高度
• CLAMP_TO_GROUND - 贴地
• RELATIVE_TO_GROUND - 相对地面
cornerTypeCornerTypeROUNDED走廊的拐角类型:
• ROUNDED - 圆角
• MITERED - 尖角
granularityNumberCesium.Math.RADIANS_PER_DEGREE走廊的粒度(用于简化走廊)
materialMaterialPropertyColor.WHITE走廊的材质(颜色、纹理、特效等)
fillBooleantrue是否填充走廊
outlineBooleanfalse是否显示轮廓
outlineColorColorColor.BLACK轮廓的颜色
outlineWidthNumber1.0轮廓的宽度(像素)
shadowsShadowModeShadowMode.DISABLED指定走廊是投射还是接收来自光源的阴影
distanceDisplayConditionDistanceDisplayCondition基于距离的显隐控制

基础实例

js
const corridor = viewer.entities.add({
  corridor: {
    positions: Cesium.Cartesian3.fromDegreesArrayHeights([
      116.3975, 39.9075, 100, 116.4075, 39.9075, 100, 116.4075, 39.9175, 100,
    ]),
    width: 100, // 走廊宽度
    height: 50, // 走廊高度
    material: Cesium.Color.ORANGE.withAlpha(0.5), // 半透明橙色
    extrudedHeight: 20, // 走廊拉伸高度
    outline: true,
    outlineColor: Cesium.Color.WHITE,
    outlineWidth: 2,
  },
});

走廊

路径(Path)

属性类型默认值描述
widthNumber1.0路径的宽度
resolutionNumber60路径的分辨率
materialMaterialPropertyColor.WHITE路径的材质(颜色、纹理、特效等)
leadTimeNumber路径的前导时间
trailTimeNumber路径的后拖时间
distanceDisplayConditionDistanceDisplayCondition基于距离的显隐控制

性能优化建议

1. 实体数量控制

  • 当实体数量超过 1000 时,考虑使用BillboardCollectionPrimitive等底层 API
  • 利用DataSourceclustering功能聚合大量实体:
js
dataSource.clustering.enabled = true;
dataSource.clustering.pixelRange = 40; // 聚合像素范围
dataSource.clustering.minimumClusterSize = 5; // 最小聚合数量

2. 属性优化

  • 避免使用CallbackProperty(尤其是高频更新的),优先使用SampledProperty

  • 对于静态属性,直接赋值而非使用属性对象:

    js
    // 推荐
    entity.point.pixelSize = 10;
    
    // 不推荐(除非需要动态变化)
    entity.point.pixelSize = new Cesium.ConstantProperty(10);

3. 内存管理

  • 及时移除不再需要的实体:

    js
    // 移除单个实体
    viewer.entities.remove(entity);
    
    // 移除所有实体
    viewer.entities.removeAll();
    
    // 移除数据源中的实体
    dataSource.entities.removeAll();
  • 对于临时效果(如粒子系统),设置lifetime自动销毁

4. 渲染优化

  • 合理设置distanceDisplayCondition控制远距离实体的显示:

    js
    entity.distanceDisplayCondition = new Cesium.DistanceDisplayCondition(
      100, // 最小可见距离(米)
      5000 // 最大可见距离(米)
    );
  • 使用disableDepthTestDistance解决标签遮挡问题:

    js
    entity.label.disableDepthTestDistance = Number.POSITIVE_INFINITY;

常见问题解答

Q1: 实体位置和模型位置有什么区别?

A1: 实体的position属性定义了实体的局部坐标系原点,而模型的modelMatrix定义了模型相对于实体原点的变换。对于简单使用,直接设置position即可;当需要复杂变换时,可以通过modelMatrix实现模型的平移、旋转和缩放。

Q2: 如何实现实体的点击事件?

A2: 使用ScreenSpaceEventHandler监听鼠标点击,并通过scene.pick方法检测实体:

js
const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (click) {
  const pickedObject = viewer.scene.pick(click.position);
  if (
    Cesium.defined(pickedObject) &&
    pickedObject.id instanceof Cesium.Entity
  ) {
    const entity = pickedObject.id;
    console.log("点击了实体:", entity.name);
    // 显示实体信息面板等操作
  }
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

Q3: 实体属性的优先级是怎样的?

A3: Cesium 实体系统的属性优先级从高到低为:

  1. 实体的具体属性(如pointpolyline等)
  2. 实体的公共属性(如positionorientation等)
  3. 父实体的继承属性
  4. 数据源的默认样式