tool.js 11.5 KB

export default {
  attributes: {
    drawPolt: class DrawPolt {
        constructor(arg) {
            this.viewer = arg.viewer;
            this.type = {};
            this._billboardArr = [];
            this._lineArr = [];
            this._gonArr = [];
            this.handler = null;
        }
        get billboardArr() {
            return this._billboardArr;
        }
        get polylineArr() {
            return this._lineArr;
        }
        get polygonArr() {
            return this._gonArr;
        }
        create(e) {
            this.type[e].startCreate();
            return this.type[e];
        }
        clearAll() {
            for (var i = 0; i < this._lineArr.length; i++) {
                var line = this._lineArr[i];
                line.destroy();
            }
            this._lineArr = [];
            for (var j = 0; j < this._gonArr.length; j++) {
                var gon = this._gonArr[j];
                gon.destroy();
            }
            this._gonArr = [];
            for (var k = 0; k < this._billboardArr.length; k++) {
                var billboard = this._billboardArr[k];
                billboard.destroy();
            }
            this._billboardArr = [];
        }
        clearOne() {
            if (!this.handler) {
                this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
            }
            var that = this;
            this.handler.setInputAction(function (evt) {
                var pick = that.viewer.scene.pick(evt.position);
                if (Cesium.defined(pick) && pick.id) {
                    that.viewer.entities.remove(pick.id);
                    that.handler.destroy();
                    that.handler = null;
                }
            }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
        }
    }, 
    polygon: class DrawPolygon {
        constructor(arg) {
            this.objId = Number((new Date()).getTime() + "" + Number(Math.random() * 1000).toFixed(0));
            this.viewer = arg.viewer;
            this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
            this._polygon = null;
            this._polyline = null;
            this._positions = [];
        }
        get polygon() {
            return this._polygon;
        }
        get positions() {
            return this._positions;
        }
        startCreate() {
            var $this = this;
            this.handler.setInputAction(function (evt) { //单机开始绘制
                var cartesian = $this.getCatesian3FromPX(evt.position);
                if ($this._positions.length == 0) {
                    $this._positions.push(cartesian.clone());
                }
                $this._positions.push(cartesian);
            }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
            this.handler.setInputAction(function (evt) { //移动时绘制面
                if ($this._positions.length < 1) return;
                var cartesian = $this.getCatesian3FromPX(evt.endPosition);
                if ($this._positions.length == 2) {
                    if (!Cesium.defined($this._polyline)) {
                        $this._polyline = $this.createPolyline();
                    }
                }
                if ($this._positions.length == 3) {
                    if ($this._polyline){
                        $this.viewer.entities.remove($this._polyline);
                        $this._polyline = null;
                    }
                    if (!Cesium.defined($this._polygon)) {
                        $this._polygon = $this.createPolygon();
                        $this._polygon.objId = $this.objId;
                    }
                }
                $this._positions.pop();
                $this._positions.push(cartesian);
            }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
            this.handler.setInputAction(function (evt) {
                if (!$this._polygon) return;
                var cartesian = $this.getCatesian3FromPX(evt.position);
                $this.handler.destroy();
                $this._positions.pop();
                $this._positions.push(cartesian);
            }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
        }
        createPolygon(obj) {
            var $this = this;
            return this.viewer.entities.add({
                polygon: {
                    hierarchy: new Cesium.CallbackProperty(function () {
                        return new Cesium.PolygonHierarchy($this._positions);
                    }, false),
                    clampToGround: true,
                    show: true,
                    fill: true,
                    material: Cesium.Color.RED,
                    width: 3,
                    outlineColor: Cesium.Color.BLACK,
                    outlineWidth: 1,
                    outline: false
                }
            });
        }
        createPolyline() {
            var $this = this;
            return this.viewer.entities.add({
                polyline: {
                    positions: new Cesium.CallbackProperty(function () {
                        return $this._positions
                    }, false),
                    clampToGround: true,
                    material: Cesium.Color.YELLOW,
                    width: 3
                }
            });
        }
        getCatesian3FromPX(px) {
            var cartesian;
            var ray = this.viewer.camera.getPickRay(px);
            if (!ray) return null;
            cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
            return cartesian;
        }
        destroy() {
            if (this.handler) {
                this.handler.destroy();
                this.handler = null;
            }
            if (this._polygon) {
                this.viewer.entities.remove(this._polygon);
                this._polygon = null;
            }
            if (this._polyline) {
                this.viewer.entities.remove(this._polyline);
                this._polyline = null;
            }
            this._positions = [];
        }
    },
    point: class DrawBillboard {
        constructor(arg) {
            this.objId = Number((new Date()).getTime() + "" + Number(Math.random() * 1000).toFixed(0));
            this.viewer = arg.viewer;
            this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
            this._position = null;
            this._billboard = null;
        }
    
        get billboard() {
            return this._billboard;
        }
        get position() {
            return this._position;
        }
        startCreate() {
            var $this = this;
            this.handler.setInputAction(function (evt) { //单机开始绘制
                var cartesian = $this.getCatesian3FromPX(evt.position);
                if (!cartesian) return;
                if(!Cesium.defined($this._billboard)){
                    $this._billboard = $this.createBillboard(cartesian);
                    $this.handler.destroy();
                }
            }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
        }
        createBillboard(cartesian) {
            var billboard = this.viewer.entities.add({
                position: cartesian,
                billboard: {
                    image: 'img/mark4.png',
                    scale: 1,
                    horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
                    verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
                    heightReference:Cesium.HeightReference.CLAMP_TO_GROUND,
                    disableDepthTestDistance:Number.MAX_VALUE
                }
            });
            billboard.objId = this.objId;
            return billboard;
        }
        destroy() {
            if (this.handler) {
                this.handler.destroy();
                this.handler = null;
            }
            if (this._billboard) {
                this.viewer.entities.remove(this._billboard);
                this._billboard = null;
            }
            this._position = null;
        }
        getCatesian3FromPX(px) {
            var cartesian;
            var ray = this.viewer.camera.getPickRay(px);
            if (!ray) return null;
            cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
            return cartesian;
        }
    },
    polyline: class DrawPolyline {
        constructor(arg) {
            //设置唯一id 备用
            this.objId = Number((new Date()).getTime() + "" + Number(Math.random() * 1000).toFixed(0));
            this.viewer = arg.viewer;
            //事件
            this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
            this._polyline = null;
            this._positions = [];
        }
        //获取线
        get line(){
            return this._polyline;
        }
        //获取线的坐标数组
        get positions(){
            return this._positions;
        }
        //开始创建
        startCreate() {
            var $this = this;
            this.handler.setInputAction(function (evt) { //单机开始绘制
                //屏幕坐标转地形上坐标
                var cartesian = $this.getCatesian3FromPX(evt.position);
                if ($this._positions.length == 0) {
                    $this._positions.push(cartesian.clone());
                }
                $this._positions.push(cartesian);
            }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
            this.handler.setInputAction(function (evt) { //移动时绘制线
                if ($this._positions.length < 1) return;
                var cartesian = $this.getCatesian3FromPX(evt.endPosition);
                if ($this._positions.length == 2) {
                    if (!Cesium.defined($this._polyline)) {
                        $this._polyline = $this.createPolyline();
                    }
                }
                if ($this._polyline) {
                    $this._positions.pop();
                    $this._positions.push(cartesian);
                }
            }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
            this.handler.setInputAction(function (evt) { //单机开始绘制
                if (!$this._polyline) return;
                var cartesian = $this.getCatesian3FromPX(evt.position);
                $this.handler.destroy();
                $this._positions.pop();
                $this._positions.push(cartesian);
            }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
        }
        createPolyline(obj) {
            if (!obj) obj = {};
            var $this = this;
            var polyline = this.viewer.entities.add({
                polyline: {
                    //使用cesium的peoperty
                    positions: new Cesium.CallbackProperty(function () {
                        return $this._positions
                    }, false),
                    show: true,
                    material: Cesium.Color.YELLOW,
                    width: 3,
                    clampToGround:true
                }
            });
            polyline.objId = this.objId;
            return polyline;
        }
        destroy() {
            this.linePointArr = [];
            if (this.handler) {
                this.handler.destroy();
                this.handler = null;
            }
            if (this._polyline) {
                this.viewer.entities.remove(this._polyline);
                this._polyline = null;
            }
            this._positions = [];
        }
        getCatesian3FromPX(px) {
            var cartesian;
            var ray = this.viewer.camera.getPickRay(px);
            if (!ray) return null;
            cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
            return cartesian;
        }
    }
  }
}