Cesium实现Entity的拖拽功能


 我的一篇博客Cesium动态绘制实体(点、标注、面、线、圆、矩形)中绘制的Entity绘制完成后会有要拖拽的需求,本文根据我对位置的理解写了一版动态拖拽的方法

 主要思路要点

     1、动态修改Entity的属性值,可以使用 new Cesium.CallbackProperty 方法,这样修改的好处是修改的时候不会出现闪的情况

····2、在Entity的外部属性中确实是有position属性的,但是在面对polygon、polyline、rectangle这些类型的Entity时,他构造的时候本身就不是用Entity的外部position构造的,它构造完全依赖于各自类型里面自己的属性,例如polygon的hierarchy、polyline的positions

此时就得进去识别改属性

 

 this.dragEntity = function(_view,_moveEndCallBack) {
        var MoveEntity = (function () {
            var leftDownFlag = false;
            var pointDraged = null;
            var viewer;
            var handler,cartesian;
            var startPoint;
            var polylinePreviousCoordinates;
            var polygonPreviousCoordinates;
            var rectanglePreviousCoordinates={};
            function ConstructMoveEntity(options,_moveEndCallBack) {
                viewer = options.viewer;
                handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
                Init();
            }

            function Init() {
                // Select plane when mouse down
                handler.setInputAction(function (movement) {
                    pointDraged = viewer.scene.pick(movement.position);//选取当前的entity
                    leftDownFlag = true;
                    if (pointDraged) {
                        //记录按下去的坐标
                        startPoint = viewer.scene.pickPosition(movement.position);
                        viewer.scene.screenSpaceCameraController.enableRotate = false;//锁定相机
                        //当前实体Entity的polyline坐标属性信息暂存
                        if(pointDraged.id.polyline){
                            polylinePreviousCoordinates=pointDraged.id.polyline.positions.getValue();
                        }
                        if(pointDraged.id.polygon){
                            polygonPreviousCoordinates = pointDraged.id.polygon.hierarchy.getValue();
                        }
                        if(pointDraged.id.rectangle){
                            rectanglePreviousCoordinates=pointDraged.id.rectangle.coordinates.getValue();
                        }
                    }
                }, Cesium.ScreenSpaceEventType.LEFT_DOWN);

                // Release plane on mouse up
                handler.setInputAction(function () {
                    leftDownFlag = false;
                    pointDraged = null;
                    viewer.scene.screenSpaceCameraController.enableInputs = true;
                    viewer.scene.screenSpaceCameraController.enableRotate = true;//锁定相机
                    if(_moveEndCallBack){
                        _moveEndCallBack(cartesian)
                    }
                    handler.destroy();
                }, Cesium.ScreenSpaceEventType.LEFT_UP);
                // Update plane on mouse move
                handler.setInputAction(function (movement) {
                    if (leftDownFlag === true && pointDraged != null) {
                        //记录尾随的坐标
                        let startPosition = viewer.scene.pickPosition(movement.startPosition);
                        let endPosition = viewer.scene.pickPosition(movement.endPosition);
                        pointDraged.id.position = new Cesium.CallbackProperty(function () {
                            return endPosition;
                        }, false);//防止闪烁,在移动的过程console.log(pointDraged.id);
                        //计算每次的偏差
                        let changed_x = endPosition.x-startPosition.x;
                        let changed_y = endPosition.y-startPosition.y;
                        let changed_z = endPosition.z-startPosition.z;

                        if(pointDraged.id.polyline){
                            let currentsPoint=[];
                            for(let i=0;i<polylinePreviousCoordinates.length;i++){
                                //与之前的算差 替换掉
                                polylinePreviousCoordinates[i].x=polylinePreviousCoordinates[i].x+changed_x;
                                polylinePreviousCoordinates[i].y=polylinePreviousCoordinates[i].y+changed_y;
                                polylinePreviousCoordinates[i].z=polylinePreviousCoordinates[i].z+changed_z;
                                currentsPoint.push(polylinePreviousCoordinates[i])
                            }
                            pointDraged.id.polyline.positions=new Cesium.CallbackProperty(function () {
                                return currentsPoint;
                            }, false);
                        }

                        if(pointDraged.id.polygon){
                            let currentsPoint=[];
                            for(let i=0;i<polygonPreviousCoordinates.length;i++){
                                polygonPreviousCoordinates[i].x=polygonPreviousCoordinates[i].x+changed_x;
                                polygonPreviousCoordinates[i].y=polygonPreviousCoordinates[i].y+changed_y;
                                polygonPreviousCoordinates[i].z=polygonPreviousCoordinates[i].z+changed_z;
                                currentsPoint.push(polygonPreviousCoordinates[i])
                            }
                            pointDraged.id.polygon.hierarchy=new Cesium.CallbackProperty(function () {
                                return currentsPoint;
                            }, false);
                        }

                        if(pointDraged.id.rectangle){
                            let storePoint={};

                            let position_start = startPosition;
                            let cartographic_start = Cesium.Cartographic.fromCartesian(position_start);
                            let longitude_start = Cesium.Math.toDegrees(cartographic_start.longitude);
                            let latitude_start = Cesium.Math.toDegrees(cartographic_start.latitude);
                            let height_start = cartographic_start.height;

                            let position_end = endPosition;
                            let cartographic_end = Cesium.Cartographic.fromCartesian(position_end);
                            let longitude_end = Cesium.Math.toDegrees(cartographic_end.longitude);
                            let latitude_end = Cesium.Math.toDegrees(cartographic_end.latitude);
                            let height_end = cartographic_end.height;

                            let changer_lng = longitude_end-longitude_start;
                            let changer_lat = latitude_end-latitude_start;


                            rectanglePreviousCoordinates.west = Cesium.Math.toRadians(Cesium.Math.toDegrees(rectanglePreviousCoordinates.west)+changer_lng);

                            rectanglePreviousCoordinates.east = Cesium.Math.toRadians(Cesium.Math.toDegrees(rectanglePreviousCoordinates.east)+changer_lng);

                            rectanglePreviousCoordinates.south = Cesium.Math.toRadians(Cesium.Math.toDegrees(rectanglePreviousCoordinates.south)+changer_lat);
                            rectanglePreviousCoordinates.north = Cesium.Math.toRadians(Cesium.Math.toDegrees(rectanglePreviousCoordinates.north)+changer_lat);
                            storePoint =  rectanglePreviousCoordinates;

                            pointDraged.id.rectangle.coordinates=new Cesium.CallbackProperty(function () {
                                // storePoint=new Cesium.Rectangle.fromDegrees(storePoint.west,storePoint.south,storePoint.east,storePoint.north);
                                // console.log(storePoint);
                                // console.log(rectanglePreviousCoordinates);
                                // console.log(Cesium.Rectangle.fromDegrees(rectanglePreviousCoordinates.west, rectanglePreviousCoordinates.south, rectanglePreviousCoordinates.east, rectanglePreviousCoordinates.north));
                                // console.log('-----------------');

                               return storePoint;
                                // return Cesium.Rectangle.fromDegrees(rectanglePreviousCoordinates.west, rectanglePreviousCoordinates.south, rectanglePreviousCoordinates.east, rectanglePreviousCoordinates.north);
                            }, false);
                            pointDraged.id.rectangle.height = new Cesium.CallbackProperty(function () {
                               return height_end;
                            }, false);


                        }

                        if(pointDraged.id.ellipse){
                            let position_end = endPosition;
                            let cartographic_end = Cesium.Cartographic.fromCartesian(position_end);
                            let height_end = cartographic_end.height;
                            pointDraged.id.ellipse.height = new Cesium.CallbackProperty(function () {
                                return height_end;
                            }, false);
                        }

                    }
                }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
            }
            return ConstructMoveEntity;
        })();
        MoveEntity({'viewer': _view},_moveEndCallBack)
    };


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM