vue+cesium地球上绘制点、线,动态改变点的高度

  1. 鼠标点击绘制点、线

   //点击模式开启/关闭
    modeOpenOrClose = () => {
        let that = this;
        if (that.spotMode) {
            that.handler.setInputAction(function (event) {
                //返回地球表面上的点坐标
                let earthPosition = viewer.camera.pickEllipsoid(event.position, viewer.scene.globe.ellipsoid);
                if (Cesium.defined(earthPosition)) {
                    let ellipsoid = viewer.scene.globe.ellipsoid;
                    let cartographic = ellipsoid.cartesianToCartographic(earthPosition);
                    let lon = Cesium.Math.toDegrees(cartographic.longitude);
                    let lat = Cesium.Math.toDegrees(cartographic.latitude);
                    let alt = cartographic.height + ''
                    //高度太高 无法获取数据高度为0
                    if (alt.indexOf('e') != -1) alt = 0
                    let entity = that.AddPoint({
                        lon,
                        lat,
                        alt,
                        color: Cesium.Color.YELLOW
                    });

                    let entityPiontData = {
                        pointId: entity._id,
                        longitude: lon,
                        latitude: lat,
                        height: alt
                    }
                    store.commit('SAVE_CARTOGRAPHIC', entityPiontData) //储存到vuex
                    if (that.lastPoint === undefined) {
                        that.lastPoint = new Cesium.Cartesian3.fromDegrees(lon, lat, alt);
                        that.lastPoint.pointId = entity._id;
                    } else {
                        that.nextPoint = new Cesium.Cartesian3.fromDegrees(lon, lat, alt);
                        that.nextPoint.pointId = entity._id
                        that.AddPolyline({
                            positions: [that.lastPoint, that.nextPoint]
                        });
                        that.lastPoint = that.nextPoint;
                    }
                }
            }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
        } else {
            that.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK) //移除事件
            that.lastPoint = undefined;
        }
    }
    // 添加点
    AddPoint = (params) => {
        let entity = new Cesium.Entity({
            id:`${params.lon}点`,
            name: '点',
            show: true,
            position: Cesium.Cartesian3.fromDegrees(params.lon, params.lat, params.alt),
            point: new Cesium.PointGraphics({
                show: true, //是否展示
                pixelSize: 10, //点大小            
                color: params.color       
            })
        });
        //收集Id
        this.pointIdList.push(entity._id);
        viewer.entities.add(entity);
        return entity;
    }
     // 添加线
     AddPolyline = (params) => {
        let entity = new Cesium.Entity({
            id:`${new Date().getTime()}线`,
            name: '线',
            adjoinPointId: params.positions[0].pointId + '@' + params.positions[1].pointId,  //相邻点id
            polyline: new Cesium.PolylineGraphics({
                show: true,
                clampToGround: false,
                positions: params.positions,
                width: 10,
                material: new Cesium.PolylineGlowMaterialProperty({
                    glowPower: 0.2,
                    color: Cesium.Color.BLUE
                })
            })
        });
        viewer.entities.add(entity);
        return entity;
    }

2.改变点的高度,并重新绘制线

    // 修改点的高度
    editPointHeight = (data) => {
        let axis = Cesium.Cartesian3.fromDegrees(data.longitude, data.latitude, data.height);
        axis.pointId = data.pointId;
        let adjoinPointIdlist = [];//相邻点id的集合
        let pointList = []//相邻点坐标的集合
        let entitiesArray = viewer.entities._entities._array

        for (var i = 0; i < entitiesArray.length; i++) {
            if (entitiesArray[i]._id == data.pointId) {
                entitiesArray[i]._position._value.x = axis.x
                entitiesArray[i]._position._value.y = axis.y
                entitiesArray[i]._position._value.z = axis.z
            }
            //通过遍历获取adjoinPointId包含点id  获取两个点的坐标   
            if (entitiesArray[i].adjoinPointId && entitiesArray[i].adjoinPointId.indexOf(data.pointId) >= 0) {
                let arr = entitiesArray[i].adjoinPointId.split('@')
                if (arr[0] !== data.pointId) adjoinPointIdlist.push(arr[0])
                else adjoinPointIdlist.push(arr[1])
                viewer.entities.remove(viewer.entities.getById(entitiesArray[i]._id)); //删除线段
                i--
            }
        }
        //如果是修改的最后一个点  同时也修改lastPoint的位置
        if (entitiesArray[entitiesArray.length - 1]._id == data.pointId) {
            this.lastPoint = axis //记录点的位置
        }
        // console.log(adjoinPointIdlist,'adjoinPointIdlist')
        //获取相邻点的位置
        adjoinPointIdlist.forEach(v => {
            entitiesArray.forEach(k => {
                if (v == k._id) {
                    let obj = {
                        pointId: k._id,
                        ...k._position._value
                    }
                    pointList.push(obj)
                }
            })
        })
        // console.log(pointList, 'pointList')

        pointList.forEach((item, index) => {
            if (index == 0) {
                this.AddPolyline({
                    positions: [item, axis]
                });
            } else {
                setTimeout(() => {
                    this.AddPolyline({
                        positions: [item, axis]
                    });
                }, 10)
            }
        })
    }

示例图

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值