Cesium初探-实体

在 Cesium 中,"实体"(Entity)是一个核心概念,它代表了可以在场景中渲染的任何东西,从简单的点、线、多边形到复杂的模型和图像。实体可以用来表示地理空间数据,如地标、轨迹、卫星轨道等。

以下是一些关于 Cesium 实体的关键知识点:

  1. 定义:

    • 实体是 Cesium 中用于描述地理空间对象的数据结构。
    • 每个实体都有一组属性,这些属性定义了它的外观、位置和其他特性。
  2. 属性:

    • 实体可以拥有多种属性,包括但不限于:
      • name: 实体的名称。
      • position: 实体的位置,通常使用 Cartesian3 对象表示。
      • orientation: 实体的方向,可以使用 Quaternion 或 EulerAngles 表示。
      • ellipsoid: 如果实体是一个椭球体,则可以定义其大小和形状。
      • polygon: 定义一个多边形。
      • polyline: 定义一条或多条折线。
      • point: 定义一个点。
      • label: 可以添加文本标签。
      • model: 加载并显示 3D 模型。
      • availability: 定义实体何时可见。
      • availabilityClock: 定义可用性的时钟范围。
      • interval: 实体的有效时间间隔。
      • description: 提供有关实体的详细信息,通常显示为弹出框的内容。
      • properties: 用户自定义的属性集合。
  3. 时间动态性:

    • 实体可以随时间变化,例如,位置可以是时间的函数。
    • 这种时间变化可以通过 SampledPositionProperty 或 SampledProperty 类来实现。
  4. 层次结构:

    • 实体可以组织成树状结构,其中父实体可以包含子实体。
    • 这样的层次结构有助于管理复杂场景和实现继承行为。
  5. 事件监听器:

    • 可以为实体添加事件监听器来响应用户交互,例如点击或悬停。
  6. 样式和外观:

    • 实体的各种视觉属性(颜色、透明度等)可以被设置。
    • 样式也可以随时间变化。
  7. 与场景的交互:

    • 实体可以与场景中的其他元素进行交互,比如与其他实体之间的碰撞检测。
  8. 性能优化:

    • 大量实体可能会对性能造成影响,因此需要考虑使用批处理、LOD (Level of Detail) 等技术来提高效率。
  9. API 和文档:

    • Cesium 的官方文档提供了详细的 API 文档和教程,可以帮助开发者更好地理解和使用实体功能。

接下来看实例!

创建实体

点实体

javascript 复制代码
// 添加实体
  // 方法1
  const point1 = new Cesium.Entity({
    id: 'point1',
    position: new Cesium.Cartesian3.fromDegrees(117, 39),
    point: {
      color: Cesium.Color.RED,
      pixelSize: 20
    }
  })
  viewer.entities.add(point1)
  // 推荐写法
  const point2 = viewer.entities.add({
    id: 'point2',
    position: Cesium.Cartesian3.fromDegrees(117, 40, 50),
    point: {
      color: Cesium.Color.RED,
      pixelSize: 20
    }
  })
  // 选择合适视角聚焦实体
  viewer.zoomTo(point2)

线实体

javascript 复制代码
// 添加线段
  const line1 = viewer.entities.add({
    id: 'line1',
    polyline: {
      positions: Cesium.Cartesian3.fromDegreesArray([117,40,117,41]),
      width: 2,
      material: Cesium.Color.BEIGE
    }
  })

标签实体

javascript 复制代码
// 添加label
  const label1 = viewer.entities.add({
    id: 'label1',
    position: Cesium.Cartesian3.fromDegrees(117, 40),
    label: {
      text: '我的股票',
      fillColor: Cesium.Color.GOLD,
      showBackground: true,
      backgroundColor: new Cesium.Color([254, 25, 36]),
      scale: 1,
      // 相对于position的偏移:前者控制左右,正为右移;后者控制上下,正为下移
      pixelOffset: new Cesium.Cartesian2(0, -70)
    }
  })
  viewer.zoomTo(label1)

面实体(平面 or 有厚度滴)

javascript 复制代码
// 添加面(体)
  const ploygon1 = viewer.entities.add({
    id: 'polygon1',
    polygon: {
      hierarchy: {
        positions: Cesium.Cartesian3.fromDegreesArray([117,40,117,41,118,40.5])
      }, 
      material: Cesium.Color.BEIGE,
      height: 20,
      extrudedHeight: 10,
      outline: true,
      outlineColor: Cesium.Color.BLUE
    }
  })

立方体(以给定点为中心,设置长宽高)

javascript 复制代码
// 添加立方体,以点为中心,设置长宽高
  const box1 = viewer.entities.add({
    id: 'box1',
    position: Cesium.Cartesian3.fromDegrees(117, 40),
    box: {
      dimensions: new Cesium.Cartesian3(20,10,50),
      material: Cesium.Color.ALICEBLUE
    }
  })

椭球体(以给定点为球心,设置长短半轴及厚度)

javascript 复制代码
// 添加椭圆
  const ellipse1 = viewer.entities.add({
    id: 'ellipse1',
    position: Cesium.Cartesian3.fromDegrees(117, 40),
    ellipse: {
      semiMajorAxis: 50,
      semiMinorAxis: 30,
      material: Cesium.Color.BISQUE,
      extrudedHeight: 50,
      rotation: Math.PI / 2
    }
  })
  viewer.zoomTo(ellipse1)

删除实体

如果你想从场景中移除实体,可以使用 remove 方法,亦可以使用removeAll方法全部移除。

javascript 复制代码
// 删除实体
const del = ()=>{
  viewer.entities.remove(label1)
}
const delAll = ()=>{
  viewer.entities.removeAll()
}
相关推荐
hunter_0762 分钟前
从零读懂 SwiftUI 新拖放 API:用 Apple 的纸牌示例理解排序、多项拖拽与移动规则
前端
时间的情敌7 分钟前
Electron 设置-webkit-app-region: drag;实现拖拽后, 无法响应鼠标划过事件及点击事件的解决方式
前端·vue.js
程序猿阿森30 分钟前
深入解析 NLI:RAG 与大模型防幻觉的“最后一道防线”
前端·人工智能·算法
专业程序开发源1 小时前
springboot校企合作双选会一站式预约与面试系统16010-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·面试·php·课程设计
iCxhust2 小时前
模型:500kW飞轮 10kV输电线路 油田抽油机 同时考虑无功补偿 统计:全年节电量 结果56万度电
前端·css·css3·电力·飞轮
志尊宝2 小时前
AI原生前端开发(011):Chrome 148+内置Gemini Nano入门
前端·chrome·ai-native
Liu.7742 小时前
uniapp swiper 常见问题及修复
前端·uni-app
u0111026752 小时前
图片生成任务的日志记录与敏感信息取舍
前端·图像处理·算法·ai作画
Eastmount2 小时前
[论文阅读] (54)NDSS26 JSIMPLIFIER:动静态与LLM如何协同完成JavaScript解混淆?
javascript·论文阅读·恶意代码分析·智能体安全·ndss