点击查看:最新Cesium可视化系统实战视频课程

202502061627351e00fa7bbcde08aa6db3022003f713b0363引言

Cesium 是一个强大的 3D 地球可视化库,广泛应用于地理信息系统(GIS)、地理数据可视化、虚拟现实等领域。在 Cesium 中,Label 是一个非常重要的功能,用于在场景中显示文本信息。本文将详细介绍如何在 Cesium 中使用 Label 标签,并讲解如何通过代码实现标签的动画效果。

Cesium 中的 Label 标签

Label 是 Cesium 中一种用于显示文本的实体(entity)类型。Label 标签可以绑定在某个特定的地理位置(如经纬度坐标)上,在场景中呈现文本内容。每个 Label 都有一些属性,例如文字内容、字体、颜色、轮廓等,可以自由定制。

创建 Label 标签

在你的 Cesium 项目中,创建一个 Label 标签是非常简单的。我们可以通过以下代码来创建一个标签,并设置它的显示位置和样式:

let fontLabel = viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(114.07, 22.54, 100),  // 标签的位置
  label: {
    text: "广州",  // 标签的文字内容
    font: "40px sans-serif",  // 标签的字体大小
    fillColor: Cesium.Color.RED,  // 标签的填充颜色
    outlineColor: Cesium.Color.BLACK,  // 轮廓颜色
    outlineWidth: 2,  // 轮廓宽度
    style: Cesium.LabelStyle.FILL_AND_OUTLINE,  // 标签样式,填充加轮廓
  }
});

代码解析

  1. position: 标签的地理位置,通过 Cesium.Cartesian3.fromDegrees 方法传入经纬度(经度 114.07, 纬度 22.54)和高度(100 米)。这表示标签将出现在广州市的某个位置。
  2. label: 设置标签的样式。包含以下属性:
    • text: 标签的文本内容,这里是 "广州"
    • font: 设置字体和大小,这里使用了 40px 的无衬线字体。
    • fillColor: 标签的填充颜色,这里设置为红色 (Cesium.Color.RED)。
    • outlineColor: 标签的轮廓颜色,这里设置为黑色。
    • outlineWidth: 轮廓的宽度,设置为 2 像素。
    • style: 标签的样式,使用填充和轮廓。

动画效果:字体大小的动态变化

在这段代码中,我们不仅创建了标签,还实现了标签字体大小的动画效果。具体实现是通过 viewer.scene.preUpdate.addEventListener 监听每一帧的更新事件,在每一帧中动态调整字体的大小,从而实现字体大小的放大缩小效果。

动画代码

let fontDelta = 1;
let fontSize = 20;

viewer.scene.preUpdate.addEventListener(() => {
  // 让字体放大缩小
  fontSize = fontSize + fontDelta;

  // 当字体超过50px或小于15px时,改变动画的方向
  if (fontSize >= 50 || fontSize <= 15) {
    fontDelta = -fontDelta;  // 改变字体增大或缩小的方向
  }

  // 更新字体大小
  fontLabel.label.font = fontSize + "px sans-serif";
});

动画原理

  • fontDelta:控制字体大小增大或缩小的速度。如果 fontDelta 为正,字体会增大;如果为负,字体会缩小。
  • fontSize:存储当前字体的大小,初始值为 20px。
  • preUpdate.addEventListener:在每一帧渲染之前触发的回调函数。通过这个事件,我们可以在每一帧中对标签的样式进行动态调整。
  • fontSize = fontSize + fontDelta:根据 fontDelta 的值调整字体大小。
  • if (fontSize >= 50 || fontSize <= 15):当字体大小达到 50px 或 15px 时,改变动画方向,让字体从增大转为缩小,或从缩小转为增大。
  • fontLabel.label.font = fontSize + "px sans-serif";:根据更新后的 fontSize 动态设置标签的字体大小。

进一步优化与扩展

1. 标签的动态移动

我们可以通过修改标签的位置来实现标签的移动效果。例如,在每一帧中改变标签的坐标,从而使标签沿着特定轨迹运动。

let positionDelta = new Cesium.Cartesian3(0.01, 0, 0);  // 每帧移动的增量
viewer.scene.preUpdate.addEventListener(() => {
  fontLabel.position = Cesium.Cartesian3.add(fontLabel.position, positionDelta, new Cesium.Cartesian3());
});

2. 添加更多标签和动画

我们可以创建多个标签并为它们设置不同的动画效果。例如,让不同的标签进行不同的放大缩小动画,或者让标签的颜色、字体、位置等变化。

let label2 = viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(114.10, 22.56, 100),
  label: {
    text: "深圳",
    font: "30px sans-serif",
    fillColor: Cesium.Color.GREEN,
    outlineColor: Cesium.Color.BLACK,
    outlineWidth: 2,
    style: Cesium.LabelStyle.FILL_AND_OUTLINE,
  }
});

// 对不同的标签应用不同的动画逻辑

3. 性能优化

在处理大量标签时,可以通过以下几种方法优化性能:

  • 使用 billboard(图像)代替 label,减少文本渲染的开销。
  • 为标签设置合适的绘制层次,避免不必要的计算。

总结

在 Cesium 中,Label 标签提供了丰富的文本展示能力,可以将文字精确地显示在地图的地理位置上,并且可以通过自定义样式和动画来增强其视觉效果。在本文中,我们通过一个简单的示例展示了如何创建标签以及如何利用每帧更新事件实现字体大小的动画变化。Cesium 的动画功能强大,我们可以通过修改 Label 的属性,实现更多动态效果,如移动、变色等,来增强用户体验。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注