cesium动态绘制多边形(polygon)

该文章展示了如何在Cesium1.95版本中通过三个坐标点动态调整多边形覆盖范围。首先,利用Cesium.CallbackProperty函数创建并实时更新多边形的位置;然后,通过定时器改变坐标点的经纬度来模拟位置变化,从而达到动态效果。示例代码中详细说明了实现步骤和关键函数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中需要通过三个坐标点位动态调整覆盖范围,于是使用cesium实体对象中的多边形来实现(polygon),实现效果如下

第一步,先创建多边形,使用Cesium.CallbackProperty函数来实时更新位置

let positions = [
            110.0,
            30.0,
            120.0,
            30.0,
            115.0,
            40.0,
        ]

let polygon_height = viewer.entities.add({
            name: "polygon_height",
            polygon: {
                show: true,
                hierarchy:new Cesium.CallbackProperty(function () {
                    let arrPoint = new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArray(positions));
                    return arrPoint;
                }, false),
                height: 2,
                material: Cesium.Color.CYAN.withAlpha(0.5),
                outline: false,
                // outlineColor: Cesium.Color.BLACK,
            }
        })

 第二步,使用定时器定时调用模拟位置变化

setInterval(()=>{
            positions[0] = 110 + Math.random()*20;
            positions[1] = 33 + Math.random()*10;

            positions[2] = 110 + Math.random()*20;
            positions[3] = 33 + Math.random()*10;

            positions[4] = 110 + Math.random()*20;
            positions[5] = 33 + Math.random()*10;
        },2000)

这样就完成了动态的多边形绘制了,完整代码如下

<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>动态绘制三角面</title>
    <link rel="stylesheet" href="Build/Cesium195/Widgets/widgets.css">
    <style>
        *{
            padding: 0;
            margin: 0;
            list-style: none;
        }
    </style>
    <script src="Build/Cesium195/Cesium.js"></script>
</head>
<body >
	<div id="cesiumContainer" class="fullSize"></div>
   
    <script type="module">


        Cesium.Ion.defaultAccessToken='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIyMGFhNTBjMi1kNGM4LTRjYWQtYWZhMC05ZTJhY2U2Y2U0ODkiLCJpZCI6MzE2MzYsImlhdCI6MTY2MDcxODA4NX0.jljbTXZPBaeSdsU7vuWg8V01oV1-fEA_qUa_08wXvq0';
		
        const viewer = new Cesium.Viewer("cesiumContainer", {
            animation : true,//是否显示动画控件,左下角仪表
            fullscreenButton : false,//是否显示全屏按钮
            geocoder : false,//是否显示geocoder小器件,右上角查询按钮
            homeButton : false,//是否显示Home按钮
            infoBox : false,//是否显示信息框
            sceneModePicker : false,//是否显示3D/2D选择器
            scene3DOnly : true,//如果设置为true,则所有几何图形以3D模式绘制以节约GPU资源
            selectionIndicator : false,//是否显示选取指示器组件
            timeline : true,//是否显示时间轴
            navigationHelpButton : false,//是否显示右上角的帮助按钮
            baselLayerPicker:false,// 将图层选择的控件关掉,才能添加其他影像数据
            shadows: true,//是否显示背影
            shouldAnimate: true
        });


        //取消左键双击事件
        viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK); 

        //去除版权信息
        viewer._cesiumWidget._creditContainer.style.display = "none";

        //是否开启抗锯齿
        viewer.scene.fxaa = true;
        viewer.scene.postProcessStages.fxaa.enabled = true;

 
        var longitude = 110.0;
        var latitude = 30.0;

        viewer.camera.flyTo({
            destination: Cesium.Cartesian3.fromDegrees(
                longitude,
                latitude,
                10000000.0
            ),
        });

        let positions = [
            110.0,
            30.0,
            120.0,
            30.0,
            115.0,
            40.0,
        ]

        let polygon_height = viewer.entities.add({
            name: "polygon_height",
            polygon: {
                show: true,
                hierarchy:new Cesium.CallbackProperty(function () {
                    let arrPoint = new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArray(positions));
                    return arrPoint;
                }, false),
                height: 2,
                material: Cesium.Color.CYAN.withAlpha(0.5),
                outline: false,
                // outlineColor: Cesium.Color.BLACK,
            }
        })


        setInterval(()=>{
            positions[0] = 110 + Math.random()*20;
            positions[1] = 33 + Math.random()*10;

            positions[2] = 110 + Math.random()*20;
            positions[3] = 33 + Math.random()*10;

            positions[4] = 110 + Math.random()*20;
            positions[5] = 33 + Math.random()*10;
        },2000)


    </script>
</body>
</html>

注意:此案例是在cesium1.95版本上开发的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值