Cesium:点击实体后在实体上方添加div,并随地球转动不断更新位置

需求:点击某实体后,添加div,并在实体上方位置显示。转动地球后,div位置不断更新。

运行效果

初始

在这里插入图片描述

点击圆点实体后

在这里插入图片描述

转动地球

在这里插入图片描述

代码

<!DOCTYPE html>
<html lang="ch">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="Cesium-1.66/Build/Cesium/Widgets/widgets.css">
    <style>
        #map3d {
            height: 400px;
            width: 600px;
            margin: 0 auto;
            position: relative;
        }

        .info {
            height: 50px;
            width: 50px;
            background-color: yellow;
            position: absolute;
            z-index: 2;
            left: 0;
            top: 0;
        }
    </style>
</head>
<body>
<div id="map3d">
    <div id="info" class="info">自行设置样式</div>
</div>
</body>
<script src="Cesium-1.66/Build/Cesium/Cesium.js"></script>
<script src="jQuery.js"></script>
<script>
    viewer = new Cesium.Viewer('map3d', {
        selectionIndicator: false,
        animation: false,
        baseLayerPicker: false,
        timeline: false,
        sceneModePicker: true,
        navigationHelpButton: false,
        useDefaultRenderLoop: true,
        showRenderLoopErrors: true,
        fullscreenButton: false,
        infoBox: false,
        imageryProvider: new Cesium.UrlTemplateImageryProvider({
            url: "http://mt1.google.cn/vt/lyrs=s&hl=zh-CN&x={x}&y={y}&z={z}&s=Gali"
        })
    });
    // 分辨率调整函数
    let adjustmentPixel = function () {
        // 判断是否支持图像渲染像素化处理
        var supportsImageRenderingPixelated = viewer.cesiumWidget._supportsImageRenderingPixelated;
        if (supportsImageRenderingPixelated) {
            // 直接拿到设备的像素比例因子 - 如我设置的1.25
            var vtxf_dpr = window.devicePixelRatio;
            // 这个while我们在后面会做一个说明,但不是解决问题的说明
            while (vtxf_dpr >= 2.0) {
                vtxf_dpr /= 2.0;
            }
            // 设置渲染分辨率的比例因子
            viewer.resolutionScale = vtxf_dpr;
        }
    };
    adjustmentPixel();
    viewer.scene.postProcessStages.fxaa.enabled = false;
    //viewer.scene.globe.depthTestAgainstTerrain = true;
    viewer.scene.fxaa = false;
    viewer._cesiumWidget._creditContainer.style.display = "none";
    viewer.camera.setView({
        destination: Cesium.Cartesian3.fromDegrees(116.46, 39.92, 10000000.0),
    }); // 设置初始位置
    let handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);
    viewer.entities.add(new Cesium.Entity({
        id: `点`,
        name: '点',
        show: true,
        position: Cesium.Cartesian3.fromDegrees(115.253333, 39.26111),
        point: new Cesium.PointGraphics({
            show: true,
            pixelSize: 5,
            heightReference: Cesium.HeightReference.NONE,
            color: new Cesium.Color(255, 255, 0, 1),
            outlineColor: new Cesium.Color(0, 0, 0, 0),
            outlineWidth: 0,
            scaleByDistance: new Cesium.NearFarScalar(0, 1, 5e10, 1),
            translucencyByDistance: new Cesium.NearFarScalar(0, 1, 5e10, 1),
            distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 4.8e10),
        })
    }));
    handler.setInputAction(function (event) {
        let $info = $('#info');
        let pick = viewer.scene.pick(event.position);
        let c = new Cesium.Cartesian2(event.position.x, event.position.y);

        function update(c) {
            let x = c.x - ($info.width()) / 2;
            let y = c.y - ($info.height()) - 5;
            $info.css('transform', 'translate3d(' + x + 'px, ' + y + 'px, 0)');
        }

        viewer.scene.postRender.addEventListener(function () {
            let changedC = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, pick.primitive._actualPosition);
            if (c && changedC && c.x && changedC.x && c.y && changedC.y) {
                if ((c.x !== changedC.x) || (c.y !== changedC.y)) {
                    update(changedC);
                    c = changedC;
                }
            }
        });
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
</script>
</html>
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

KaiSarH

如果觉得文章不错,可以支持下~

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

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

打赏作者

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

抵扣说明:

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

余额充值