cesium中label样式修改为圆角

 label自带的样式如下,无法对边框进行圆滑处理,但是使用canvas元素进行绘制缺轻而易举

修改之后效果如下所示:

viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(x, y, z), // 航点位置
  billboard: {
    image: customLabel('自定义label'),
    pixelOffset: new Cesium.Cartesian2(0, -20) // 文字偏移量
  }
});
function customLabel(text) {
  // 创建一个canvas元素,用于绘制圆形背景和文字
  let canvas = document.createElement('canvas');
  // 使用 measureText 获取文本宽度
  let ctx = canvas.getContext('2d');
  let textWidth = ctx.measureText(text).width;
  // 根据文本宽度调整画布大小
  canvas.width = textWidth + 10; // 在文本长度之外加上一些额外的空间
  canvas.height = 30; // 设置一个合适的高度

  // 开始绘制圆形背景
  ctx.beginPath();
  ctx.roundRect(0, 0, canvas.width, canvas.height, 10); // 圆角半径为10像素
  ctx.fillStyle = '#268bd2'; // 设置填充颜色为半透明的蓝色
  ctx.fill(); // 使用fill方法填充圆形

  // 开始绘制文字
  ctx.font = '22px sans-serif';
  ctx.fillStyle = 'black'; // 设置文字颜色为黑色
  ctx.textAlign = 'center';
  ctx.textBaseline = 'middle';
  ctx.fillText(text, canvas.width / 2, canvas.height / 2 + 2); // 在中间位置绘制文字

  // 将绘制好的canvas内容转换为dataURL格式的图片
  return canvas.toDataURL();
}

代码解析

创建 Canvas 元素

我们首先创建了一个 Canvas 元素,并获取了其绘图上下文(context)。Canvas 是 HTML5 提供的一个绘图元素,允许我们在网页上绘制图形、图像和文字等内容。

let canvas = document.createElement('canvas');
let ctx = canvas.getContext('2d');

获取文本宽度

为了确保画布的大小能够适应文本内容,我们使用了 measureText 方法来获取文本的宽度。这一步非常关键,因为它决定了画布的宽度是否足够容纳文字,并且能够根据文字长度动态调整画布大小,从而实现灵活的标签布局。

let textWidth = ctx.measureText(text).width;

调整画布大小

根据获取到的文本宽度,我们设置了画布的宽度和高度。宽度在文本宽度的基础上增加了 20 像素(左右各 10 像素),以确保文字周围有足够的空间。高度设置为 30 像素,可以根据实际需求进行调整。

canvas.width = textWidth + 20;
canvas.height = 30;

绘制圆形背景

使用 roundRect 方法绘制了一个圆角矩形作为背景。roundRect 方法的参数分别是左上角坐标(0, 0)、宽度(canvas.width)、高度(canvas.height)和圆角半径(15 像素)。通过设置 fillStyle 属性,我们可以指定背景的颜色和透明度。在这里,我们选择了一个半透明的蓝色背景,以便与地图元素更好地融合。

ctx.beginPath();
ctx.roundRect(0, 0, canvas.width, canvas.height, 15);
ctx.fillStyle = 'rgba(38, 139, 210, 0.8)';
ctx.fill();

绘制文字

接下来,我们设置了文字的字体、颜色、对齐方式等样式,并使用 fillText 方法在画布中间位置绘制文字。通过设置 textAligntextBaseline 属性,我们确保了文字在画布中水平和垂直居中显示。

ctx.font = 'bold 16px sans-serif';
ctx.fillStyle = 'white';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText(text, canvas.width / 2, canvas.height / 2);

转换为 DataURL

最后,我们将绘制好的 Canvas 内容转换为 DataURL 格式。DataURL 是一种将图片编码为 Base64 字符串的格式,可以直接在网页中作为图片源使用。在 Cesium 中,我们可以将 DataURL 设置为实体的 billboard.image 属性,从而实现自定义标签的显示。

return canvas.toDataURL();
Cesium 中,`Label` 本身并不直接支持设置圆角背景样式。要实现标签的圆角样式效果,通常需要通过结合 `Canvas` 或 `billboard` 自定义绘制带有圆角背景的标签。 以下是一个使用 `Canvas` 绘制带有圆角背景并将其作为 `billboard` 图像添加到标签中的示例方法: ```javascript // 创建一个带圆角背景的 canvas 元素 function createRoundedLabelCanvas(text, bgColor) { const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); // 设置画布大小 canvas.width = 160; canvas.height = 40; // 绘制圆角矩形背景 const radius = 10; // 圆角半径 ctx.beginPath(); ctx.moveTo(radius, 0); ctx.lineTo(canvas.width - radius, 0); ctx.quadraticCurveTo(canvas.width, 0, canvas.width, radius); ctx.lineTo(canvas.width, canvas.height - radius); ctx.quadraticCurveTo(canvas.width, canvas.height, canvas.width - radius, canvas.height); ctx.lineTo(radius, canvas.height); ctx.quadraticCurveTo(0, canvas.height, 0, canvas.height - radius); ctx.lineTo(0, radius); ctx.quadraticCurveTo(0, 0, radius, 0); ctx.closePath(); ctx.fillStyle = bgColor; ctx.fill(); // 绘制文本 ctx.fillStyle = '#ffffff'; ctx.font = '16px sans-serif'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; ctx.fillText(text, canvas.width / 2, canvas.height / 2); return canvas; } // 将 canvas 转换为 base64 数据 URL function canvasToDataUrl(canvas) { return canvas.toDataURL(); } // 添加实体并设置带有圆角背景的标签 const viewer = new Cesium.Viewer('cesiumContainer'); const labelCanvas = createRoundedLabelCanvas('区域A', 'rgba(38, 139, 210, 0.8)'); const labelImageUrl = canvasToDataUrl(labelCanvas); viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), billboard: { image: labelImageUrl, width: 160, height: 40, pixelOffset: new Cesium.Cartesian2(0, -30) } }); ``` ### 实现说明: 1. **创建 Canvas**:首先创建一个 `canvas` 元素,并在其上绘制一个具有圆角的矩形作为背景。 2. **绘制文本**:在圆角矩形中心绘制文本内容。 3. **转换为图像**:将 `canvas` 转换为数据 URL 格式,以便用作 `billboard.image` 属性值。 4. **添加 Entity**:通过 `Entity` 的 `billboard` 属性将自定义的圆角背景图像显示在地图上 [^4]。 此方法利用了 HTML5 Canvas API 来实现复杂的图形绘制,并借助 Cesium 提供的 `billboard` 支持来展示定制化的标签样式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不要随地大便

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值