Cesium 为什么label的eyeOffset设置的距离会有偏差 相比于圆?

总共四个entity,有一辆车三个圆且都在一个位置。在三个圆的右侧边缘显示一个label,我用的eyeOffset来偏移label的位置到右侧边缘(因为position在圆心),往右偏移会有明显的误差,往上偏移就没多少误差。
往右偏移:
12f6b5e07c218f455cf3332c53ad591.jpg
往上偏移:
3520dad610e73b4d484c0a92adae914.jpg
一辆车:

const position = Cesium.Cartesian3.fromDegrees(123, 23, 0)
const color = Cesium.Color.fromCssColorString('#fff')
entities.add({
    position,
    billboard: { image: icon, scale: 0.2, color }
})

三个圈附带label

for (let i = 1; i <= 3; i++) {
    entities.add({
        position,
        ellipse: {
            fill: false,
            outline: true,
            outlineColor: new Ceisum.Color(1, 1, 1, 0.5),
            semiMinorAxis: 100000 * i, // 半径
            semiMajorAxis: 100000 * i, // 半径
            height: 0
        },
        label: {
            test: 100 * i + 'km',
            font: '14px sans-serif',
            fillColor: new Cesium.Color(1, 1, 1, 0.5),
            eyeOffset: new Cesium.Cartesian3(100000 * i, 0, 0) // eyeOffset相对圆心偏移
        }
    })
}
阅读 1.3k
2 个回答
function computeLabelPosition(center, radius, bearing) {
    // 用Cesium的Spherical几何计算
    let spherical = new Cesium.Spherical(bearing, 0, radius);
    let offsetPosition = new Cesium.Cartesian3();
    Cesium.Cartesian3.add(center, Cesium.Cartesian3.fromSpherical(spherical), offsetPosition);
    return offsetPosition;
}

// 用该方法为每个标签计算位置
for (let i = 1; i <= 3; i++) {
    let labelPosition = computeLabelPosition(position, 100000 * i, Cesium.Math.toRadians(90)); // 90度表示右侧
    entities.add({
        position: labelPosition,
        // ... 其他属性
    });
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏