经纬志
首页 / Cesium / API 文档

Billboard

先看结论

始终正对相机的图标,尺寸按屏幕像素计算。设备图标、车辆、POI 标记都用它, 比 label 更省性能,也比 point 更有表达力。

最后验证 2026-11-03 · CesiumJS 1.121 · 更新 2026-10-27 · 引用本文
entity.billboard = new Cesium.BillboardGraphics({ image, scale, ... })

实际写法通常是直接在 entities.add 的对象里写 billboard: {...}, Cesium 会自动转成 BillboardGraphics。

参数

参数默认说明
image—图片地址、canvas、data URI 均可,必须能跨域访问
scale1缩放倍数,与 width/height 互斥
width / height—直接指定像素尺寸,设置后 scale 失效
pixelOffset(0,0)屏幕像素偏移,用来和标签错开
horizontalOriginCENTER水平锚点:LEFT / CENTER / RIGHT
verticalOriginCENTER垂直锚点:TOP / CENTER / BOTTOM
colorWHITE与图片颜色相乘,白色表示不改色
rotation0旋转角,弧度,逆时针为正
alignedAxis—旋转轴,传速度向量可以让图标自动指向运动方向
heightReferenceNONECLAMP_TO_GROUND / RELATIVE_TO_GROUND
sizeInMetersfalsetrue 时图标随距离缩放,单位变成米
scaleByDistance—NearFarScalar,近大远小
translucencyByDistance—远处淡出,减少视觉噪声
distanceDisplayCondition—超出范围直接不画,省性能
disableDepthTestDistance0设为无穷大时永远不被遮挡

一个典型的设备图标

viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(116.391263, 39.907359, 3),
  billboard: {
    image: '/icons/sensor.png',
    scale: 0.6,
    verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
    heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
    scaleByDistance: new Cesium.NearFarScalar(500, 1.0, 8000, 0.4),
    translucencyByDistance: new Cesium.NearFarScalar(8000, 1.0, 20000, 0.2),
    distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 20000)
  }
});

verticalOrigin: BOTTOM 是插在地面上的图标(点状标记、杆状设备)的标准写法: 锚点放在图片底部,图标才不会被地面切成两半。

用 canvas 生成图标

image 不必是文件,程序生成的 canvas 同样可用。这样能按数据动态画图标, 不依赖任何图片资源:

function makeDot(color) {
  var c = document.createElement('canvas');
  c.width = c.height = 64;
  var ctx = c.getContext('2d');
  var g = ctx.createRadialGradient(32, 32, 2, 32, 32, 30);
  g.addColorStop(0, color);
  g.addColorStop(1, 'rgba(0,0,0,0)');
  ctx.fillStyle = g;
  ctx.beginPath();
  ctx.arc(32, 32, 30, 0, Math.PI * 2);
  ctx.fill();
  return c;
}

viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(116.39, 39.90),
  billboard: { image: makeDot('#4d9bff'), scale: 1.2 }
});

常见问题

图标不显示,控制台报跨域

Cesium 会把图片画进 WebGL 纹理,要求图片带 CORS 头。图床或第三方图标站通常不带, 需要自己代理或转成 base64 内联。

图标被地球挡住

disableDepthTestDistance 默认 0,图标在地球背面时会被裁掉,这是正常的。 要做「始终可见」的标注,把它设成 Number.POSITIVE_INFINITY。

scale 与 width/height 冲突

同时设了 width 和 scale 时以宽高为准,scale 被忽略。 想要按屏幕尺寸精确控制就用宽高,想要整体微调就用 scale。

大量图标卡顿

billboard 会自动合批,但每张不同图片都是一个独立纹理,切换纹理的开销很大。 上千个图标时,把图标合并成一张雪碧图,用 imageSubRegion 取子区域。

引用本文

经纬志(2026)。《Billboard》。https://www.jingweizhi.com/cesium/api/billboard.html(访问日期 2026-11-03)。