Canvas 文字点
Canvas Text Billboards

你将学到什么
- 用 Canvas 2D 动态生成文字纹理
- devicePixelRatio × dpr 高清屏清晰文字
- 纹理作为 Billboard.image 批量贴到城市坐标
效果说明
加载 city.json,每个城市名渲染成彩色 canvas,再以 billboard 形式钉在对应经纬度。
核心概念
createCanvasText 工厂
js
function createCanvasText(params) {
const { dpr, fontSize, maxWidth } = { dpr: 1, maxWidth: 100, fontSize: 20, ...params };
const ratio = window.devicePixelRatio * dpr;
canvas.width = maxWidth * ratio;
canvas.height = fontSize * ratio;
ctx.scale(ratio, ratio);
// 返回 (opts) => canvas.toDataURL() 或 canvas 本身
}每次调用 updateCanvasText({ text: key, color }) 重绘并返回 image 源。
为何不用 Label?
| Label | Canvas Billboard |
|---|---|
| 字体样式有限 | 任意 CSS 字体、描边、背景 |
| 每 Entity 开销 | Collection 合批 |
| 适合少量 | 适合上百城市名 |
实现步骤
- fetch city.json →
{ 城市名: [lon, lat] } createCanvasText({ dpr: 1.4 })得 update 函数BillboardCollection循环 add,image: updateCanvasText({ text, color })flyTo中国上空总览
代码要点
js
const updateCanvasText = createCanvasText({ dpr: 1.4 });
const billboards = new Cesium.BillboardCollection();
viewer.scene.primitives.add(billboards);
for (const key in citys) {
const [longitude, latitude] = citys[key];
billboards.add({
position: Cesium.Cartesian3.fromDegrees(longitude, latitude),
image: updateCanvasText({ text: key, color: getColor() }),
scale: 0.5,
});
}源码
完整源码见 GitHub。
小结
基础功能 · Cesium.js · 13/19
