cesium 實時網格動態生成 與 3D點雲坐標框架生成


var PointCloud2Grid=(function () {

    /**
     * 根據已有點雲創建網格陣列
     * @param airdatas 大氣監測數據點的集合
     */
    function createAirGrids(airdatas,gridwidth) {
        if (!airdatas || !airdatas.length || airdatas.length < 1) {
            return;
        }
        var preGrids=[];
        var preGrid=point2GridWGS84(null,airdatas[0].lon,airdatas[0].lat,gridwidth,gridwidth);
        preGrids.push(preGrid);
        for (let i = 1; i < airdatas.length; i++) {
            let airdata=airdatas[i];
            preGrid=point2GridWGS84(preGrid,airdata.lon,airdata.lat,gridwidth,gridwidth);
            if (preGrid) {
                var intersectgrid=getInertsectGridWGS84(preGrids,preGrid,gridwidth,gridwidth);//重疊的網格
                if (intersectgrid) {
                    preGrid=intersectgrid;
                    if (preGrids.length === 1) {//第一個創建的網格單元與自己重疊
                       let entity = PointCloud2Grid.createairGridEntity(preGrid,airdata,airEntityNameCommon.airGridEntityNames.airgrid);
                        setgridLabel(entity,airdata,UiParaManager.getCurParaName());
                    }
                } else {
                    preGrids.push(preGrid);
                    let entity =createairGridEntity(preGrid,airdata,airEntityNameCommon.airGridEntityNames.airgrid);
                    setgridLabel(entity,airdata,UiParaManager.getCurParaName());
                }
            }
        }
    }

    /**
     * 批量修改網格的標簽
     * @param curAirParaName 當前大氣指標(溫度,so2等)
     */
    function setGridsLabels(curAirParaName) {
        for (var i=0;i<window.viewer.entities.values.length;i++)
        {
            var entity=window.viewer.entities.values[i];
            if (entity.name===airEntityNameCommon.airGridEntityNames.airgrid){
                setgridLabel(entity,entity.airdatainfo,curAirParaName);
            }
        }
    }

    /**
     * 設置網格單元的標簽
     * @param grid
     * @param airdata
     * @param curAirParaName
     */
    function setgridLabel(entity,airdata,curAirParaName) {
        entity.label={
            /*text : parseFloat(airdata[curAirParaName]).toFixed(2),
            font:'32px',
            fillColor:Cesium.Color.BLACK,
            verticalOrigin:Cesium.VerticalOrigin.TOP,
            scale:0.5*/

            /*showBackground:false,
            backgroundColor:Cesium.Color.fromCssColorString('#000'),
            scale:0.4, 
            font:'normal 32px MicroSoft YaHei',
            fillColor:Cesium.Color.BLACK,
            text:parseFloat(airdata[curAirParaName]).toFixed(2).toString()*/

            text : parseFloat(airdata[curAirParaName]).toFixed(2),
            color : Cesium.Color.fromCssColorString('#fff'),
            font:'normal 32px MicroSoft YaHei',
            showBackground : true,
            scale : 0.4,
            /*horizontalOrigin : Cesium.HorizontalOrigin.LEFT_CLICK,*/
            /*verticalOrigin : Cesium.VerticalOrigin.BOTTOM,*/
            distanceDisplayCondition : new Cesium.DistanceDisplayCondition(0, 500),
            /*disableDepthTestDistance : 1000*/

            /*Represents a scalar value's lower and upper bound at a near distance and far distance in eye space.
            Name	Type	Default	Description
            near	Number	0.0	optional The lower bound of the camera range.
                nearValue	Number	0.0	optional The value at the lower bound of the camera range.
            far	Number	1.0	optional The upper bound of the camera range.
                farValue	Number	0.0	optional The value at the upper bound of the camera range.*/
            scaleByDistance : new Cesium.NearFarScalar(100, 2, 500, 0.0),
        }
    }

    /**
     * 在三維上創建網格
     * @param grid 網格邊界
     * @param airdata 大氣監測數據點
     * @param entityName 實體名稱
     * @returns {*}
     */
    function createairGridEntity(grid,airdata,entityName) {
        var entity = viewer.entities.add({
            name:entityName,
            position : window.Cesium.Cartesian3.fromDegrees((grid.minX+grid.maxX)/2,(grid.minY+grid.maxY)/2,0.5),
            rectangle : {
                coordinates : Cesium.Rectangle.fromDegrees(grid.minX, grid.minY, grid.maxX, grid.maxY),
                extrudedHeight : 0,
                outline : true,
                outlineColor : Cesium.Color.BLUE,
                outlineWidth : 10,
                material : window.Cesium.Color.fromRandom({alpha : 0.5})
            },
            coord:{
                minX:grid.minX,
                minY:grid.minY,
                maxX:grid.maxX,
                maxY:grid.maxY,

                minXplane:grid.maxXutm,
                minYplane:grid.minYutm,
                maxXplane:grid.maxXutm,
                maxYplane:grid.maxYutm
            },
            airdatainfo:airdata
        });
        return entity;
    }

    /**
     * 由前一個網格和當前點以及網格大小 生成一個新的網格
     * @param preGrid 前一個網格
     * @param curPoint 當前點
     * @param gridWidth 網格寬(米)
     * @param gridHeigth 網格高(米)
     * @returns {*|{minXutm, minY, minX, maxY, maxX, maxXutm, minYutm, maxYutm}}
     */
    function point2Grid(preGrid, curPointX,curPointY, gridWidth, gridHeigth) {
        if (!gridWidth||!gridHeigth) {
            return null;
        }
        var pointX=parseFloat(curPointX);
        var pointY=parseFloat(curPointY);        
        if (isNaN(pointX) || isNaN(pointY) || !curPointX || !curPointY) {
            return null;
        }
        var pointUtm=cesiumCoordUtil.wgs84toUtm(pointX,pointY);
        var pointXutm=pointUtm.x;
        var pointYutm=pointUtm.y;
        var centLon=cesiumCoordUtil.getCentral_MeridianFromDaihaoGauss6(cesiumCoordUtil.getUtmDaihao(curPointX));
        if (!preGrid) {
            var grid=cesiumCoordUtil.createSquare2(pointX,pointY,null,gridWidth,gridHeigth);
            return grid;
        }
        if (pointXutm >= preGrid.minXutm && pointXutm <= preGrid.maxXutm && pointYutm >= preGrid.minYutm && pointYutm <= preGrid.maxYutm) {
            return preGrid;
        }
        else if (pointXutm > preGrid.maxXutm && pointYutm > preGrid.maxYutm) {//第一象限內,東北角
            if (pointXutm < (preGrid.maxXutm + gridWidth) && pointYutm < (preGrid.maxYutm + gridHeigth)) {
                let grid=cesiumCoordUtil.createSquare2With2Points(preGrid.maxXutm,preGrid.maxYutm,preGrid.maxXutm+gridWidth,preGrid.maxYutm+gridHeigth,gridWidth,gridHeigth,centLon);
                return grid;
            }else{
                let xGrids=Math.ceil((pointXutm-preGrid.maxXutm)/gridWidth);
                let yGrids=Math.ceil((pointYutm-preGrid.maxYutm)/gridHeigth);
                let minx=preGrid.maxXutm+gridWidth*(xGrids-1);
                let miny=preGrid.maxYutm+gridHeigth*(yGrids-1);
                let maxx=minx+gridWidth;
                let maxy=miny+gridHeigth;
                var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
                return grid;
            }
        }else if (pointXutm > preGrid.minXutm && pointXutm < preGrid.maxXutm && pointYutm > preGrid.maxYutm) {//第二象限內,正北
            let yGrids=Math.ceil((pointYutm-preGrid.maxYutm)/gridHeigth);
            let minx=preGrid.minXutm;
            let miny=preGrid.maxYutm+(yGrids-1)*gridHeigth;
            let maxx=preGrid.maxXutm;
            let maxy=miny+gridHeigth;
            var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
            return grid;
        }else if (pointXutm < preGrid.minXutm && pointYutm > preGrid.maxYutm) {//第三象限內,西北角
            let xGrids=Math.ceil((preGrid.minXutm-pointXutm)/gridWidth);
            let yGrids=Math.ceil((pointYutm-preGrid.maxYutm)/gridHeigth);
            let minx=preGrid.minXutm-gridWidth*xGrids;
            let miny=preGrid.maxYutm+gridHeigth*(yGrids-1);
            let maxx=minx+gridWidth;
            let maxy=miny+gridHeigth;
            var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
            return grid;
        }else if (pointXutm < preGrid.minXutm && pointYutm > preGrid.minYutm && pointYutm < preGrid.maxYutm) {//第四象限內,正西
            let xGrids=Math.ceil((preGrid.minXutm-pointXutm)/gridWidth);
            let minx=preGrid.minXutm-gridWidth*xGrids;
            let miny=preGrid.minYutm;
            let maxx=minx+gridWidth;
            let maxy=miny+gridHeigth;
            var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
            return grid;
        }else if (pointXutm < preGrid.minXutm && pointYutm < preGrid.minYutm) {//第五象限內,西南角
            let xGrids=Math.ceil((preGrid.minXutm-pointXutm)/gridWidth);
            let yGrids=Math.ceil((preGrid.minYutm-pointYutm)/gridHeigth);
            let minx=preGrid.minXutm-gridWidth*xGrids;
            let miny=preGrid.minYutm-gridHeigth*yGrids;
            let maxx=minx+gridWidth;
            let maxy=miny+gridHeigth;
            var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
            return grid;
        }else if (pointXutm>preGrid.minXutm&&pointXutm<preGrid.maxXutm&&pointYutm<=preGrid.minYutm){//第六象限內,正南
            let yGrids=Math.ceil((preGrid.minYutm-pointYutm)/gridHeigth);
            let minx=preGrid.minXutm;
            let miny=preGrid.minYutm-gridHeigth*yGrids;
            let maxx=minx+gridWidth;
            let maxy=miny+gridHeigth;
            let grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
            return grid;
        } else if (pointXutm > preGrid.maxXutm && pointYutm < preGrid.minYutm) {//第七象限內,東南角
            let xGrids=Math.ceil((pointXutm-preGrid.maxXutm)/gridWidth);
            let yGrids=Math.ceil((preGrid.minYutm-pointYutm)/gridHeigth);
            let minx=preGrid.maxXutm+gridWidth*(xGrids-1);
            let miny=preGrid.minYutm-gridHeigth*yGrids;
            let maxx=minx+gridWidth;
            let maxy=miny+gridHeigth;
            var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
            return grid;
        }else if (pointXutm > preGrid.maxXutm && pointYutm > preGrid.minYutm && pointYutm < preGrid.maxYutm) {//第八象限內,正東
            let xGrids=Math.ceil((pointXutm-preGrid.maxXutm)/gridWidth);
            let minx=preGrid.maxXutm+gridWidth*(xGrids-1);
            let miny=preGrid.minYutm
            let maxx=minx+gridWidth;
            let maxy=miny+gridHeigth;
            var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
            return grid;
        }
        
    }


    /**
     * 由前一個網格和當前點以及網格大小 生成一個新的網格
     * @param preGrid 前一個網格
     * @param curPoint 當前點
     * @param gridWidth 網格寬(米)
     * @param gridHeigth 網格高(米)
     * @returns {*|{minX, minY, minX, maxY, maxX, maxX, minY, maxY}}
     */
    function point2GridWGS84(preGrid, curPointX,curPointY, gridWidth, gridHeigth) {
        if (!gridWidth||!gridHeigth) {
            return null;
        }
        var pointX=parseFloat(curPointX);
        var pointY=parseFloat(curPointY);
        if (isNaN(pointX) || isNaN(pointY) || !curPointX || !curPointY) {
            return null;
        }
        var centLon=cesiumCoordUtil.getCentral_MeridianFromDaihaoGauss6(cesiumCoordUtil.getUtmDaihao(curPointX));
        if (!preGrid) {
            var grid=cesiumCoordUtil.createSquare2(pointX,pointY,null,gridWidth,gridHeigth);
            return grid;
        }
        if (curPointX >= preGrid.minX && curPointX <= preGrid.maxX && curPointY >= preGrid.minY && curPointY <= preGrid.maxY) {
            return preGrid;
        }
        else if (curPointX > preGrid.maxX && curPointY > preGrid.maxY) {//第一象限內,東北角
            if (curPointX < (preGrid.maxX + gridWidth) && curPointY < (preGrid.maxY + gridHeigth)) {
                let grid=cesiumCoordUtil.createSquare2With2Points(preGrid.maxX,preGrid.maxY,preGrid.maxX+gridWidth,preGrid.maxY+gridHeigth,gridWidth,gridHeigth,centLon);
                return grid;
            }else{
                let xGrids=Math.ceil((curPointX-preGrid.maxX)/gridWidth);
                let yGrids=Math.ceil((curPointY-preGrid.maxY)/gridHeigth);
                let minx=preGrid.maxX+gridWidth*(xGrids-1);
                let miny=preGrid.maxY+gridHeigth*(yGrids-1);
                let maxx=minx+gridWidth;
                let maxy=miny+gridHeigth;
                var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
                return grid;
            }
        }else if (curPointX > preGrid.minX && curPointX < preGrid.maxX && curPointY > preGrid.maxY) {//第二象限內,正北
            let yGrids=Math.ceil((curPointY-preGrid.maxY)/gridHeigth);
            let minx=preGrid.minX;
            let miny=preGrid.maxY+(yGrids-1)*gridHeigth;
            let maxx=preGrid.maxX;
            let maxy=miny+gridHeigth;
            var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
            return grid;
        }else if (curPointX < preGrid.minX && curPointY > preGrid.maxY) {//第三象限內,西北角
            let xGrids=Math.ceil((preGrid.minX-curPointX)/gridWidth);
            let yGrids=Math.ceil((curPointY-preGrid.maxY)/gridHeigth);
            let minx=preGrid.minX-gridWidth*xGrids;
            let miny=preGrid.maxY+gridHeigth*(yGrids-1);
            let maxx=minx+gridWidth;
            let maxy=miny+gridHeigth;
            var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
            return grid;
        }else if (curPointX < preGrid.minX && curPointY > preGrid.minY && curPointY < preGrid.maxY) {//第四象限內,正西
            let xGrids=Math.ceil((preGrid.minX-curPointX)/gridWidth);
            let minx=preGrid.minX-gridWidth*xGrids;
            let miny=preGrid.minY;
            let maxx=minx+gridWidth;
            let maxy=miny+gridHeigth;
            var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
            return grid;
        }else if (curPointX < preGrid.minX && curPointY < preGrid.minY) {//第五象限內,西南角
            let xGrids=Math.ceil((preGrid.minX-curPointX)/gridWidth);
            let yGrids=Math.ceil((preGrid.minY-curPointY)/gridHeigth);
            let minx=preGrid.minX-gridWidth*xGrids;
            let miny=preGrid.minY-gridHeigth*yGrids;
            let maxx=minx+gridWidth;
            let maxy=miny+gridHeigth;
            var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
            return grid;
        }else if (curPointX>preGrid.minX&&curPointX<preGrid.maxX&&curPointY<=preGrid.minY){//第六象限內,正南
            let yGrids=Math.ceil((preGrid.minY-curPointY)/gridHeigth);
            let minx=preGrid.minX;
            let miny=preGrid.minY-gridHeigth*yGrids;
            let maxx=minx+gridWidth;
            let maxy=miny+gridHeigth;
            let grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
            return grid;
        } else if (curPointX > preGrid.maxX && curPointY < preGrid.minY) {//第七象限內,東南角
            let xGrids=Math.ceil((curPointX-preGrid.maxX)/gridWidth);
            let yGrids=Math.ceil((preGrid.minY-curPointY)/gridHeigth);
            let minx=preGrid.maxX+gridWidth*(xGrids-1);
            let miny=preGrid.minY-gridHeigth*yGrids;
            let maxx=minx+gridWidth;
            let maxy=miny+gridHeigth;
            var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
            return grid;
        }else if (curPointX > preGrid.maxX && curPointY > preGrid.minY && curPointY < preGrid.maxY) {//第八象限內,正東
            let xGrids=Math.ceil((curPointX-preGrid.maxX)/gridWidth);
            let minx=preGrid.maxX+gridWidth*(xGrids-1);
            let miny=preGrid.minY
            let maxx=minx+gridWidth;
            let maxy=miny+gridHeigth;
            var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
            return grid;
        }

    }

    /**
     * 由前一個網格和當前點以及網格大小 生成一個新的網格 無數據區域插值生成網格
     * @param preGrid 前一個網格
     * @param curPoint 當前點
     * @param gridWidth 網格寬(米)
     * @param gridHeigth 網格高(米)
     * @returns {*|{minXutm, minY, minX, maxY, maxX, maxXutm, minYutm, maxYutm}}
     */
    function point2GridWithInterpolation(preGrid, curPointX,curPointY, gridWidth, gridHeigth) {
            if (!gridWidth||!gridHeigth) {
                return null;
            }
            var pointX=parseFloat(curPointX);
            var pointY=parseFloat(curPointY);
            if (isNaN(pointX) || isNaN(pointY) || !curPointX || !curPointY) {
                return null;
            }
            var pointUtm=cesiumCoordUtil.wgs84toUtm(pointX,pointY);
            var pointXutm=pointUtm.x;
            var pointYutm=pointUtm.y;
            var centLon=cesiumCoordUtil.getCentral_MeridianFromDaihaoGauss6(cesiumCoordUtil.getUtmDaihao(curPointX));
            if (!preGrid) {
                var grid=cesiumCoordUtil.createSquare2(pointX,pointY,null,gridWidth,gridHeigth);
                return grid;
            }
            if (pointXutm >= preGrid.minXutm && pointXutm <= preGrid.maxXutm && pointYutm >= preGrid.minYutm && pointYutm <= preGrid.maxYutm) {
                return preGrid;
            }
            else if (pointXutm >= preGrid.maxXutm && pointYutm >= preGrid.maxYutm) {//第一象限內,東北角
                if (pointXutm < (preGrid.maxXutm + gridWidth) && pointYutm < (preGrid.maxYutm + gridHeigth)) {
                    let grid=cesiumCoordUtil.createSquare2With2Points(preGrid.maxXutm,preGrid.maxYutm,preGrid.maxXutm+gridWidth,preGrid.maxYutm+gridHeigth,gridWidth,gridHeigth,centLon);
                    return grid;
                }else{
                    let xGrids=Math.ceil((pointXutm-preGrid.maxXutm)/gridWidth);
                    let yGrids=Math.ceil((pointYutm-preGrid.maxYutm)/gridHeigth);
                    if (xGrids > 1) {
                        let minx=preGrid.maxXutm+gridWidth*xGrids;
                        let miny=preGrid.maxYutm+gridHeigth*yGrids;
                        let maxx=minx+gridWidth;
                        let maxy=miny+gridHeigth;
                        var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
                        return grid;
                    }
                }
            }else if (pointXutm >= preGrid.minXutm && pointXutm <= preGrid.maxXutm && pointYutm >= preGrid.maxYutm) {//第二象限內,正北
                let yGrids=Math.ceil((pointYutm-preGrid.maxYutm)/gridHeigth);
                let minx=preGrid.minXutm;
                let miny=preGrid.maxYutm;
                let maxx=preGrid.maxXutm;
                let maxy=miny+yGrids*gridHeigth;
                var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
                return grid;
            }else if (pointXutm <= preGrid.minXutm && pointYutm >= preGrid.maxYutm) {//第三象限內,西北角
                let xGrids=Math.ceil((preGrid.minXutm-pointXutm)/gridWidth);
                let yGrids=Math.ceil((pointYutm-preGrid.maxYutm)/gridHeigth);
                let minx=preGrid.minXutm-gridWidth*xGrids;
                let miny=preGrid.maxYutm+gridHeigth*yGrids;
                let maxx=minx+gridWidth;
                let maxy=miny+gridHeigth;
                var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
                return grid;
            }else if (pointXutm <= preGrid.minXutm && pointYutm >= preGrid.minYutm && pointYutm <= preGrid.maxYutm) {//第四象限內,正西
                let xGrids=Math.ceil((preGrid.minXutm-pointXutm)/gridWidth);
                let minx=preGrid.minXutm-gridWidth*xGrids;
                let miny=preGrid.minYutm;
                let maxx=minx+gridWidth;
                let maxy=miny+gridHeigth;
                var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
                return grid;
            }else if (pointXutm <= preGrid.minXutm && pointYutm <= preGrid.minYutm) {//第五象限內,西南角
                let xGrids=Math.ceil((preGrid.minXutm-pointXutm)/gridWidth);
                let yGrids=Math.ceil((preGrid.minYutm-pointYutm)/gridHeigth);
                let minx=preGrid.minXutm-gridWidth*xGrids;
                let miny=preGrid.minYutm-gridHeigth*yGrids;
                let maxx=minx+gridWidth;
                let maxy=miny+gridHeigth;
                var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
                return grid;
            }else if (pointXutm>=preGrid.minXutm&&pointXutm<=preGrid.maxXutm&&pointYutm<=preGrid.minYutm){//第六象限內,正南
                let yGrids=Math.ceil((preGrid.minYutm-pointYutm)/gridHeigth);
                let minx=preGrid.minXutm;
                let miny=preGrid.minYutm-gridHeigth*yGrids;
                let maxx=minx+gridWidth;
                let maxy=miny+gridHeigth;
                let grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
                return grid;
            } else if (pointXutm >= preGrid.maxXutm && pointYutm <= preGrid.minYutm) {//第七象限內,東南角
                let xGrids=Math.ceil((pointXutm-preGrid.maxXutm)/gridWidth);
                let yGrids=Math.ceil((preGrid.minYutm-pointYutm)/gridHeigth);
                let minx=preGrid.maxXutm+gridWidth*xGrids;
                let miny=preGrid.minYutm-gridHeigth*yGrids;
                let maxx=minx+gridWidth;
                let maxy=miny+gridHeigth;
                var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
                return grid;
            }else if (pointXutm >= preGrid.maxXutm && pointYutm >= preGrid.minYutm && pointYutm <= preGrid.maxYutm) {//第八象限內,正東
                let xGrids=Math.ceil((pointXutm-preGrid.maxXutm)/gridWidth);
                let minx=preGrid.maxXutm+gridWidth*xGrids;
                let miny=preGrid.minYutm
                let maxx=minx+gridWidth;
                let maxy=miny+gridHeigth;
                var grid= cesiumCoordUtil.createSquare2With2Points(minx,miny,maxx,maxy,gridWidth,gridHeigth,centLon);
                return grid;
            }

        }

    /**
     * 判斷當前生成的網格單元是否與已有的網格單元重疊
     * @param grids 已有的網格單元集合
     * @param curgrid 剛創建的網格單元
     */
    function getInertsectGrid(grids, curgrid,gridWidth,gridHeight) {
        var toleranceX=0;
        var toleranceY=0;
        for (let i = 0; i < grids.length; i++) {
            let pregrid=grids[i];
            if (curgrid.minXutm>(pregrid.minXutm+toleranceX)&&curgrid.minXutm<(pregrid.maxXutm-toleranceX)&&curgrid.minYutm>(pregrid.minYutm+toleranceY)&&curgrid.minYutm<(pregrid.maxYutm-toleranceY)){
                return pregrid;
            }
            if (curgrid.maxXutm>(pregrid.minXutm+toleranceX)&&curgrid.maxXutm<(pregrid.maxXutm-toleranceX)&&curgrid.maxYutm>(pregrid.minYutm+toleranceY)&&curgrid.maxYutm<(pregrid.maxYutm-toleranceY)){
                return pregrid;
            }
            if (curgrid.minXutm>(pregrid.minXutm+toleranceX)&&curgrid.minXutm<(pregrid.maxXutm-toleranceX)&&curgrid.maxYutm>(pregrid.minYutm+toleranceY)&&curgrid.maxYutm<(pregrid.maxYutm-toleranceY)){
                return pregrid;
            }
            if (curgrid.maxXutm>(pregrid.minXutm+toleranceX)&&curgrid.maxXutm<(pregrid.maxXutm-toleranceX)&&curgrid.minYutm>(pregrid.minYutm+toleranceY)&&curgrid.minYutm<(pregrid.maxYutm-toleranceY)){
                return pregrid;
            }
            if(curgrid.minXutm==pregrid.minXutm&&curgrid.minYutm==pregrid.minYutm&&curgrid.maxXutm==pregrid.maxXutm&&curgrid.maxYutm==pregrid.maxYutm){
                return pregrid;
            }
        }
        return null;
    }

    /**
     * 判斷當前生成的網格單元是否與已有的網格單元重疊
     * @param grids 已有的網格單元集合
     * @param curgrid 剛創建的網格單元
     */
    function getInertsectGridWGS84(grids, curgrid,gridWidth,gridHeight) {
        var toleranceX=0;
        var toleranceY=0;
        for (let i = 0; i < grids.length; i++) {
            let pregrid=grids[i];
            if (curgrid.minX>(pregrid.minX+toleranceX)&&curgrid.minX<(pregrid.maxX-toleranceX)&&curgrid.minY>(pregrid.minY+toleranceY)&&curgrid.minY<(pregrid.maxY-toleranceY)){
                return pregrid;
            }
            if (curgrid.maxX>(pregrid.minX+toleranceX)&&curgrid.maxX<(pregrid.maxX-toleranceX)&&curgrid.maxY>(pregrid.minY+toleranceY)&&curgrid.maxY<(pregrid.maxY-toleranceY)){
                return pregrid;
            }
            if (curgrid.minX>(pregrid.minX+toleranceX)&&curgrid.minX<(pregrid.maxX-toleranceX)&&curgrid.maxY>(pregrid.minY+toleranceY)&&curgrid.maxY<(pregrid.maxY-toleranceY)){
                return pregrid;
            }
            if (curgrid.maxX>(pregrid.minX+toleranceX)&&curgrid.maxX<(pregrid.maxX-toleranceX)&&curgrid.minY>(pregrid.minY+toleranceY)&&curgrid.minY<(pregrid.maxY-toleranceY)){
                return pregrid;
            }
            if(curgrid.minX==pregrid.minX&&curgrid.minY==pregrid.minY&&curgrid.maxX==pregrid.maxX&&curgrid.maxY==pregrid.maxY){
                return pregrid;
            }
        }
        return null;
    }


    return {
        //point2Grid:point2Grid,
        createAirGrids:createAirGrids,
        //point2GridWithInterpolation:point2GridWithInterpolation,
        createairGridEntity:createairGridEntity,
        //getInertsectGrid:getInertsectGrid,
        setgridLabel:setgridLabel,
        setGridsLabels:setGridsLabels,
        point2GridWGS84:point2GridWGS84,
        getInertsectGridWGS84:getInertsectGridWGS84
    }
})()

  

var livedata=(function () {

    var interval=null;
    var interval3Dcloud=null;

    /**
     * 網格模擬 實時數據模擬
     */
    function addairlivedata() {
        clearinterval()
        var preGrids=[];
        var curEntity;
        var preGrid;
        var preairdatas=cesiumdrawutil.getairdatas();
        var intervalairdatagrid = setInterval(function () {
            airdata.getAirdataLatestOne(function (airdataLatestone) {
                var airValue = parseFloat(airdataLatestone[UiParaManager.getCurParaName()]);//大氣監測數據指標值
                var lon=airdataLatestone[airdata.AirData.CONST_AIRPARA_NAME_LABEL_MAPPING.lon.name];//實時數據經度
                if (preGrids.length === 0) {//第一條加載的數據
                    preGrid=PointCloud2Grid.point2GridWGS84(null,airdataLatestone.lon,airdataLatestone.lat,airdata.gridWidthjiaodu,airdata.gridWidthjiaodu);
                    if (preGrid) {
                        preGrids.push(preGrid);//添加第一條數據
                    }
                }else {//第二條數據及之后的數據
                    if (preGrid) {
                        preGrid=PointCloud2Grid.point2GridWGS84(preGrid,airdataLatestone.lon,airdataLatestone.lat,airdata.gridWidthjiaodu,airdata.gridWidthjiaodu);
                    }
                }
                if (preGrid) {//新建網格
                    var intersectgrid=PointCloud2Grid.getInertsectGridWGS84(preGrids,preGrid,airdata.gridWidthjiaodu,airdata.gridWidthjiaodu);//重疊的網格
                    if (intersectgrid) {//新建的網格與之前創建並加載的網格重疊
                        preGrid=intersectgrid;
                        if (preGrids.length === 1) {//第一個創建的網格單元與自己重疊,則創建第一個網格並加載到球上
                            curEntity = PointCloud2Grid.createairGridEntity(preGrid,airdataLatestone,airEntityNameCommon.airGridEntityNames.airgrid);
                        }
                    } else {//新建的網格與之前創建並加載的網格不重疊,則創建新的網格並加載到球上
                        preGrids.push(preGrid);
                        curEntity = PointCloud2Grid.createairGridEntity(preGrid,airdataLatestone,airEntityNameCommon.airGridEntityNames.airgrid);
                    }
                    if (curEntity) {
                        PointCloud2Grid.setgridLabel(curEntity,curEntity.airdatainfo,UiParaManager.getCurParaName());
                    }
                }
                if (curEntity) {
                    preairdatas.push(curEntity.airdatainfo);
                }
                var entity = viewer.entities.removeById('airlivebill01');
                if (preGrids.length === 1) {//加載第一個網格后在球上定位
                    if (curEntity) {
                        cesiumLocateUtil.dingweiByPoint(airdataLatestone.lon,airdataLatestone.lat,100);
                    }
                }
                addBillBordAirLive(airdataLatestone.lon,airdataLatestone.lat,airdataLatestone.alt+0.2);//移動模型
                airColorBar.resetperdatacolor(curEntity,UiParaManager.getCurParaName());//設置網格顏色

            })

        }, 1000);
        interval=intervalairdatagrid;
        return intervalairdatagrid;
    }


    /**
     * 3D點雲模擬 實時數據模擬
     */
    function addairlivedata3Dcloud() {
        clearinterval();
        var curEntity;
        var preairdatas=cesiumdrawutil.getairdatas();//獲取已經加載的大氣監測數據
        var intervalairdata3Dcloud = setInterval(function () {
            airdata.getAirdataLatestOne(function (airdataLatestone) {
                if (!airdata.alt || isNaN(airdata.alt) || airdata.alt < 1) {
                    airdata.alt=Math.random()*20;
                }
                //加載數據
                curEntity = cesiumdrawutil.createair3dcloudpoint(airdataLatestone.lon, airdataLatestone.lat,airdataLatestone.alt,10,airdataLatestone,airEntityNameCommon.air3dEntityNames.aircloud_point);
                if (curEntity != null) {
                    preairdatas.push(airdataLatestone);
                    addBillBordAirLive(airdataLatestone.lon,airdataLatestone.lat,airdataLatestone.alt+0.2);//移動模型
                    airColorBar.resetperdatacolor(curEntity,UiParaManager.getCurParaName());//設置網格顏色
                    cesiumdrawutil.draw3Dfream(preairdatas);//繪制坐標系
                }
                var entity = viewer.entities.removeById('airlivebill01');
                if (preairdatas.length === 1) {//加載第一個網格后在球上定位
                    if (curEntity) {
                        cesiumLocateUtil.dingweiByPoint(airdataLatestone.lon,airdataLatestone.lat,100);
                    }
                }

            })

        }, 1000);
        interval3Dcloud=intervalairdata3Dcloud;
        return intervalairdata3Dcloud;
    }


    /**
     * 動態添加網格,模擬無人機飛行
     * @param lon
     * @param lat
     * @param alt
     */
    function addBillBordAirLive(lon,lat,alt) {
        var entity = viewer.entities.add({
            name:'airlivebill',
            id:'airlivebill01',
            position : Cesium.Cartesian3.fromDegrees(lon,lat,alt),
            billboard :{
                image : './images/user.png',
                sizeInMeters : true,
                color : Cesium.Color.YELLOW
            }
        });
        var billboard = entity.billboard;
        billboard.scale =0.02;
    }

    /**
     * 停止定時器
     */
    function clearinterval() {
         if (interval != null) {
             clearInterval(interval);
             interval=null;
             clearModel();
         }
         if (interval3Dcloud != null) {
             clearInterval(interval3Dcloud);
             interval3Dcloud=null;
         }
     }

    /**
     * 清除模型
     */
    function clearModel() {
         viewer.entities.removeById('airlivebill01');
     }
    
    return {
        addairlivedata:addairlivedata,
        clearinterval:clearinterval,
        addairlivedata3Dcloud:addairlivedata3Dcloud
    }
})()

  

var cesiumdrawutil=(function () {

    //////////////////////////////////////////////////////大氣監測數據3D點雲顯示  開始/////////////////////////////////
    function createair3dcloud(taskid) {
        airdata.getairdatas(taskid,function (airdatas) {
            air3dcloud(airdatas);
            //airColorBar.resetairdataColor(UiParaManager.getCurParaName());
            dingweibyairdatas(airdatas);
            /*var minmaxCurAirDatas=airColorBar.getairdataparaminmax(UiParaManager.getCurParaName());
            airColorBar.resetparaBar(minmaxCurAirDatas.min,minmaxCurAirDatas.max);
            $("#inputairparamin").val(minmaxCurAirDatas.min);
            $("#inputairparamax").val(minmaxCurAirDatas.max);
            airColorBar.resetairdataColor(UiParaManager.getCurParaName());//重新設置數據渲染顏色
            PointCloud2Grid.setGridsLabels(UiParaManager.getCurParaName());//重新設置網格標簽*/
        })

    }


    function air3dcloud(airdatas) {
        if (!airdatas || !airdatas.length || airdatas.length < 1) {
            return;
        }
        for (let i = 0; i < airdatas.length; i++) {
            let airdata=airdatas[i];
            if (!airdata.alt || isNaN(airdata.alt) || airdata.alt < 1) {
                airdata.alt=Math.random()*20;
            }
            createair3dcloudpoint(airdata.lon, airdata.lat,airdata.alt,10,airdata,airEntityNameCommon.air3dEntityNames.aircloud_point);
        }
        var minmaxCurAirDatas=airColorBar.getairdataparaminmax(UiParaManager.getCurParaName());
        airColorBar.resetparaBar(minmaxCurAirDatas.min,minmaxCurAirDatas.max);
        $("#inputairparamin").val(minmaxCurAirDatas.min);
        $("#inputairparamax").val(minmaxCurAirDatas.max);
        airColorBar.resetairdataColor(UiParaManager.getCurParaName());//重新設置數據渲染顏色
        PointCloud2Grid.setGridsLabels(UiParaManager.getCurParaName());//重新設置網格標簽
        draw3Dfream(airdatas);
    }

    //獲取最小經緯度高程,最大經緯度高程
    function getminXminYminHmaxXmaxYmaxH(airdatas) {
        var minlon=parseFloat(airdatas[0].lon);
        var minlat=parseFloat(airdatas[0].lat);
        var maxlon=parseFloat(airdatas[0].lon);
        var maxlat=parseFloat(airdatas[0].lat);
        var minheight=parseFloat(airdatas[0].alt);
        var maxheight=parseFloat(airdatas[0].alt);
        for (let i = 0; i < airdatas.length; i++) {

            let airdata=airdatas[i];
            let airlon,
                airlat,
                airalt;
            if (airdata.lon) {
                airlon=parseFloat(airdata.lon);
                if (!minlon||airlon<minlon){
                    minlon=airlon;
                }
                if (!maxlon || airlon > maxlon) {
                    maxlon=airlon;
                }
            }
            if (airdata.lat) {
                airlat=parseFloat(airdata.lat);
                if (!minlat || airlat < minlat) {
                    minlat=airlat;
                }
                if (!maxlat || airlat > maxlat) {
                    maxlat=airlat;
                }
            }
            if (airdata.alt) {
                airalt=parseFloat(airdata.alt);
                if (!minheight || airalt < minheight) {
                    minheight=airalt;
                }
                if (!maxheight || airalt > maxheight) {
                    maxheight=airalt;
                }
            }
        }
        return {
            minX:minlon,
            minY:minlat,
            minH:minheight,
            maxX:maxlon,
            maxY:maxlat,
            maxH:maxheight
        }
    }


    /**
     * 創建3D點雲的單個點
     * @param lon
     * @param lat
     * @param alt
     * @param pointSize
     * @param airdatainfo
     * @param entityName
     */
    function createair3dcloudpoint(lon,lat,alt,pointSize,airdatainfo,entityName) {
        if (!pointSize) {
            pointSize=20;
        }
        var entity = viewer.entities.add({
            name:entityName,
            position : Cesium.Cartesian3.fromDegrees(lon, lat, alt),
            point : {
                pixelSize : pointSize
            },
            airdatainfo:airdatainfo
        });
        return entity;
    }


    function addWall(x1, y1, z1, x2, y2, z2,maxheight1,maxheight2,entityName) {
        viewer.entities.add({
            name : entityName,
            wall : {
                positions : Cesium.Cartesian3.fromDegreesArrayHeights([x1, y1, z1, x2, y2, z2]),
                minimumHeights : [maxheight1, maxheight2],
                material :Cesium.Color.DIMGREY.withAlpha(0.8)
            }
        });
    }

    function addwalllabel(lon,lat,alt,text,entityName) {
        var entity = viewer.entities.add({
            name:entityName,
            position : Cesium.Cartesian3.fromDegrees(lon, lat,alt),
            label : {
                text : text,
                //pixelOffset : new Cesium.Cartesian2(0.0, -image.height),
                pixelOffset : new window.Cesium.Cartesian2(0, -3),
                font : '11px italic arial'
            }
        });
        entity.label.scale = 1.0;
        entity.label.showBackground = true;
    }

    function addrectangle(minX,minY,maxX,maxY,name) {
        var entity = viewer.entities.add({
            name:name,
            rectangle : {
                //coordinates : Cesium.Rectangle.fromDegrees(116.4762700, 39.9942863, 116.4764700, 39.9944863),
                coordinates : Cesium.Rectangle.fromDegrees(minX, minY, maxX, maxY),
                extrudedHeight : 0,
                outline : true,
                outlineColor : Cesium.Color.WHITE,
                outlineWidth : 4,material:window.Cesium.Color.ALICEBLUE.withAlpha(0.5)
            }
        });
    }

    
    function addsimpleline0(DegresArry,width,color,name,id){
        cesiumUtil.removeEntitesById(id);
        var Line = viewer.entities.add({
            name : name,
            id : id,
            polyline : {
                positions : Cesium.Cartesian3.fromDegreesArrayHeights(DegresArry),
                width : width,
                material : color
            }
        });
        return Line;
    }

    
    function addGlowingLine(DegresArry,width,color,name,glowPower,id){
        cesiumUtil.removeEntitesById(id);
        var glowingLine = viewer.entities.add({
            name : name,
            id: id,
            polyline : {
                positions :Cesium.Cartesian3.fromDegreesArrayHeights(DegresArry),
                width : width,
                show: true,
                material : new Cesium.PolylineGlowMaterialProperty({
                    glowPower : glowPower,
                    color : color
                })
            }
        });
        return glowingLine;
    }
    //////////////////////////////////////////////////////大氣監測數據3D點雲顯示  結束/////////////////////////////////

    //////////////////////////////////////////////////////大氣監測數據網格顯示  開始/////////////////////////////////
    function createairGrid(taskid,gridwidth) {
        airdata.getairdatas(taskid,function (airdatas) {
            /*airGrid(airdatas);*/
            PointCloud2Grid.createAirGrids(airdatas,gridwidth);
            airColorBar.resetairdataColor(UiParaManager.getCurParaName());
            dingweibyairdatas(airdatas);
        })
    }

    /**
     * 同時加載多個任務數據
     * @param taskids
     * @param gridwidth
     * @param callback
     */
    function createairGridMultiTasks(taskids, gridwidth) {
        if (!taskids || !taskids.length || taskids < 1) {
            return null;
        }
        for (let i = 0; i < taskids.length;i++){
            let airtaskid=taskids[i];
            airdata.getairdatas(airtaskid,function (airdatas) {
                PointCloud2Grid.createAirGrids(airdatas,gridwidth);
                if (i==taskids.length-1){
                    //airColorBar.resetairdataColor(UiParaManager.getCurParaName());
                    dingweibyairdatas(airdatas);
                    var minmaxCurAirDatas=airColorBar.getairdataparaminmax(UiParaManager.getCurParaName());
                    airColorBar.resetparaBar(minmaxCurAirDatas.min,minmaxCurAirDatas.max);
                    $("#inputairparamin").val(minmaxCurAirDatas.min);
                    $("#inputairparamax").val(minmaxCurAirDatas.max);
                    airColorBar.resetairdataColor(UiParaManager.getCurParaName());//重新設置數據渲染顏色
                    PointCloud2Grid.setGridsLabels(UiParaManager.getCurParaName());//重新設置網格標簽
                }
            })
        }
    }
    //////////////////////////////////////////////////////大氣監測數據網格顯示  結束/////////////////////////////////

    /**
     * 根據airdatas定位,每個taskid對應的數據
     */
    function dingweibyairdatas(airdatas) {
        var minXminYminHmaxXmaxYmaxH=getminXminYminHmaxXmaxYmaxH(airdatas);
        var minlon=minXminYminHmaxXmaxYmaxH.minX;
        var minlat=minXminYminHmaxXmaxYmaxH.minY;
        var maxlon=minXminYminHmaxXmaxYmaxH.maxX;
        var maxlat=minXminYminHmaxXmaxYmaxH.maxY;
        var minheight=minXminYminHmaxXmaxYmaxH.minH;
        var maxheight=minXminYminHmaxXmaxYmaxH.maxH;
        cesiumLocateUtil.dingwei(minlon,minlat,maxlon,maxlat,-90);
    }

    /**
     * 根據taskid定位
     */
    function dingweibyairtaskid(airtaskid) {
        var airdatas=getairdatasbytaskid(airtaskid);
        var minXminYminHmaxXmaxYmaxH=getminXminYminHmaxXmaxYmaxH(airdatas);
        var minlon=minXminYminHmaxXmaxYmaxH.minX;
        var minlat=minXminYminHmaxXmaxYmaxH.minY;
        var maxlon=minXminYminHmaxXmaxYmaxH.maxX;
        var maxlat=minXminYminHmaxXmaxYmaxH.maxY;
        var minheight=minXminYminHmaxXmaxYmaxH.minH;
        var maxheight=minXminYminHmaxXmaxYmaxH.maxH;
        cesiumLocateUtil.dingwei(minlon,minlat,maxlon,maxlat,-90);
    }

    /**
     * 根據taskid獲取當前加載的大氣監測數據
     * @param taskid
     */
    function getairdatasbytaskid(taskid) {
        var airdatas=[];
        for (var i=0;i<window.viewer.entities.values.length;i++)
        {
            var entity=window.viewer.entities.values[i];
            if (entity.name===airEntityNameCommon.airGridEntityNames.airgrid||entity.name==airEntityNameCommon.air3dEntityNames.aircloud_point){
                let airinfo=entity.airdatainfo;
                if (airinfo&&airinfo.taskid==taskid) {
                    airdatas.push(airinfo);
                }
            }
        }
        return airdatas;
    }


    /**
     * 獲取當前加載的大氣監測數據
     */
    function getairdatas() {
        var airdatas=[];
        for (var i=0;i<window.viewer.entities.values.length;i++)
        {
            var entity=window.viewer.entities.values[i];
            if (entity.name===airEntityNameCommon.airGridEntityNames.airgrid||entity.name==airEntityNameCommon.air3dEntityNames.aircloud_point){
                let airinfo=entity.airdatainfo;
                if (airinfo) {
                    airdatas.push(airinfo);
                }
            }
        }
        return airdatas;
    }

    /**
     * 根據taskid清除大氣監測數據
     * @param taskid
     */
    function removedatabytaskid(taskid) {
        for (var i=0;i<window.viewer.entities.values.length;i++)
        {
            var entity=window.viewer.entities.values[i];
            if (entity.name===airEntityNameCommon.airGridEntityNames.airgrid||entity.name==airEntityNameCommon.air3dEntityNames.aircloud_point){
                let airinfo=entity.airdatainfo;
                if (airinfo&&airinfo.taskid==taskid) {
                    window.viewer.entities.removeById(entity.id);
                    i--;
                }
            }
        }
    }

    /**
     * 根據airtaskid設置數據顯示和不顯示
     * @param airtaskid
     */
    function showhideairdatabytaskid(airtaskid,visible) {
        for (var i=0;i<window.viewer.entities.values.length;i++)
        {
            var entity=window.viewer.entities.values[i];
            if (entity.name===airEntityNameCommon.airGridEntityNames.airgrid||entity.name==airEntityNameCommon.air3dEntityNames.aircloud_point){
                let airinfo=entity.airdatainfo;
                if (airinfo&&airinfo.taskid==airtaskid) {
                    entity.show=visible;
                }
            }
        }
    }

    /**
     * 清除所有
     */
    function clearAll() {
        for (var i=0;i<window.viewer.entities.values.length;i++)
        {
            var entity=window.viewer.entities.values[i];
            if (entity.name===airEntityNameCommon.airGridEntityNames.airgrid
                ||entity.name==airEntityNameCommon.air3dEntityNames.aircloud_point
                ||entity.name==airEntityNameCommon.air3dEntityNames.aircloud_label
                ||entity.name==airEntityNameCommon.air3dEntityNames.aircloud_wall
                ||entity.name==airEntityNameCommon.air3dEntityNames.aircloud_line){
                window.viewer.entities.removeById(entity.id);
                i--;
            }
        }
        livedata.clearinterval();
        if (window.frames["ifreamairlivedataline"]
            && window.frames["ifreamairlivedataline"].contentWindow
            && window.frames["ifreamairlivedataline"].contentWindow.chartutil
            &&window.frames["ifreamairlivedataline"].contentWindow.chartutil.clearinterval){
            window.frames["ifreamairlivedataline"].contentWindow.chartutil.clearinterval();
        }

    }

    /**
     * 清除所有網格
     */
    function clearAllGrid() {
        for (var i=0;i<window.viewer.entities.values.length;i++)
        {
            var entity=window.viewer.entities.values[i];
            if (entity.name===airEntityNameCommon.airGridEntityNames.airgrid){
                window.viewer.entities.removeById(entity.id);
                i--;
            }
        }
    }

    /**
     * 清除所有3D點雲
     */
    function clearAll3Dpoints() {
        for (var i=0;i<window.viewer.entities.values.length;i++)
        {
            var entity=window.viewer.entities.values[i];
            if (entity.name==airEntityNameCommon.air3dEntityNames.aircloud_point
                ||entity.name==airEntityNameCommon.air3dEntityNames.aircloud_label
                ||entity.name==airEntityNameCommon.air3dEntityNames.aircloud_wall
                ||entity.name==airEntityNameCommon.air3dEntityNames.aircloud_line){
                window.viewer.entities.removeById(entity.id);
                i--;
            }
        }
    }

    /**
     * 清除3D點雲的坐標系和標注等
     */
    function clear3Dfream() {
        for (var i=0;i<window.viewer.entities.values.length;i++)
        {
            var entity=window.viewer.entities.values[i];
            if (entity.name==airEntityNameCommon.air3dEntityNames.aircloud_label
                ||entity.name==airEntityNameCommon.air3dEntityNames.aircloud_wall
                ||entity.name==airEntityNameCommon.air3dEntityNames.aircloud_line){
                window.viewer.entities.removeById(entity.id);
                i--;
            }
        }
    }

    /**
     * 重新繪制3D點雲坐標系,不渲染數據
     */
    function draw3Dfream(airdatas) {
        clear3Dfream();
        if (!airdatas || !airdatas.length || airdatas.length < 1) {
            return;
        }
        var minXminYminHmaxXmaxYmaxH=getminXminYminHmaxXmaxYmaxH(airdatas);
        var minlon=minXminYminHmaxXmaxYmaxH.minX;
        var minlat=minXminYminHmaxXmaxYmaxH.minY;
        var maxlon=minXminYminHmaxXmaxYmaxH.maxX;
        var maxlat=minXminYminHmaxXmaxYmaxH.maxY;
        var minheight=minXminYminHmaxXmaxYmaxH.minH;
        var maxheight=minXminYminHmaxXmaxYmaxH.maxH;
        if (maxheight<1){
            maxheight=1;
        }
        maxheight=maxheight*1.5;
        //cesiumLocateUtil.setViewer(viewer);
        //cesiumLocateUtil.dingweiByPoint(minlon,minlat,maxheight,3);
        var cellLen=(maxlon-minlon)/5;
        var cellLat=(maxlat-minlat)/5;
        var cellheight=(maxheight-minheight)/5;
        var extraLen=cellLen/3;
        var extraLat=cellLat/3;

        minlon=minlon-cellLen;
        minlat=minlat-cellLat;
        maxlon=maxlon+cellLen;
        maxlat=maxlat+cellLat;
        minheight=minheight;
        maxheight=maxheight+cellheight;

        cellLen=(maxlon-minlon)/5;
        cellLat=(maxlat-minlat)/5;
        cellheight=(maxheight-minheight)/5;
        extraLen=cellLen/3;
        extraLat=cellLat/3;
        //添加坐標軸
        addsimpleline0([minlon,maxlat,minheight,minlon,minlat-extraLat,minheight],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c001');
        addsimpleline0([minlon,maxlat,minheight,maxlon,maxlat,minheight],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c002');
        addsimpleline0([minlon,maxlat,minheight,minlon,maxlat,maxheight],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c003');
        addsimpleline0([minlon,minlat,minheight,maxlon,minlat,minheight],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c004');
        addsimpleline0([maxlon,maxlat,minheight,maxlon,minlat,minheight],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c005');


        //添加網格線 西
        addsimpleline0([minlon,maxlat,minheight+cellheight,minlon,minlat-extraLat,minheight+cellheight],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c006');
        addsimpleline0([minlon,maxlat,minheight+cellheight*2,minlon,minlat-extraLat,minheight+cellheight*2],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c007');
        addsimpleline0([minlon,maxlat,minheight+cellheight*3,minlon,minlat-extraLat,minheight+cellheight*3],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c008');
        addsimpleline0([minlon,maxlat,minheight+cellheight*4,minlon,minlat-extraLat,minheight+cellheight*4],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c009');
        addsimpleline0([minlon,maxlat,minheight+cellheight*5,minlon,minlat-extraLat,minheight+cellheight*5],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c0010');
        //添加網格線 北
        addsimpleline0([minlon,maxlat,minheight+cellheight,maxlon+extraLen,maxlat,minheight+cellheight],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c0011');
        addsimpleline0([minlon,maxlat,minheight+cellheight*2,maxlon+extraLen,maxlat,minheight+cellheight*2],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c0012');
        addsimpleline0([minlon,maxlat,minheight+cellheight*3,maxlon+extraLen,maxlat,minheight+cellheight*3],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c0013');
        addsimpleline0([minlon,maxlat,minheight+cellheight*4,maxlon+extraLen,maxlat,minheight+cellheight*4],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c0014');
        addsimpleline0([minlon,maxlat,minheight+cellheight*5,maxlon+extraLen,maxlat,minheight+cellheight*5],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c0015');
        //添加網格線 南
        addsimpleline0([minlon+cellLen,minlat-extraLat,minheight,minlon+cellLen,minlat,minheight],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c0016');
        addsimpleline0([minlon+cellLen*2,minlat-extraLat,minheight,minlon+cellLen*2,minlat,minheight],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c0017');
        addsimpleline0([minlon+cellLen*3,minlat-extraLat,minheight,minlon+cellLen*3,minlat,minheight],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c0018');
        addsimpleline0([minlon+cellLen*4,minlat-extraLat,minheight,minlon+cellLen*4,minlat,minheight],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c0019');
        addsimpleline0([minlon+cellLen*5,minlat-extraLat,minheight,minlon+cellLen*5,minlat,minheight],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c0020');

        //添加網格線 東
        addsimpleline0([maxlon,minlat,minheight,maxlon+extraLen,minlat ,minheight],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c0021');
        addsimpleline0([maxlon,minlat+cellLat,minheight,maxlon+extraLen,minlat+cellLat ,minheight],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c0021');
        addsimpleline0([maxlon,minlat+cellLat*2,minheight,maxlon+extraLen,minlat+cellLat*2,minheight],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c0022');
        addsimpleline0([maxlon,minlat+cellLat*3,minheight,maxlon+extraLen,minlat+cellLat*3,minheight],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c0023');
        addsimpleline0([maxlon,minlat+cellLat*4,minheight,maxlon+extraLen,minlat+cellLat*4,minheight],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c0024');
        addsimpleline0([maxlon,minlat+cellLat*5,minheight,maxlon+extraLen,minlat+cellLat*5,minheight],2,Cesium.Color.RED,airEntityNameCommon.air3dEntityNames.aircloud_line,'c0025');

        //添加牆 西
        addWall(minlon,maxlat,minheight+0.001,
            minlon,minlat,minheight+0.001,maxheight,maxheight,airEntityNameCommon.air3dEntityNames.aircloud_wall);
        //添加牆 北
        addWall(minlon,maxlat,minheight+0.001,
            maxlon,maxlat,minheight+0.001,maxheight,maxheight,airEntityNameCommon.air3dEntityNames.aircloud_wall);
        //添加標簽 西
        addwalllabel(minlon,minlat-extraLat,minheight+cellheight,(minheight+cellheight).toFixed(2)+'m',airEntityNameCommon.air3dEntityNames.aircloud_label);
        addwalllabel(minlon,minlat-extraLat,minheight+cellheight*2,(minheight+cellheight*2).toFixed(2)+'m',airEntityNameCommon.air3dEntityNames.aircloud_label);
        addwalllabel(minlon,minlat-extraLat,minheight+cellheight*3,(minheight+cellheight*3).toFixed(2)+'m',airEntityNameCommon.air3dEntityNames.aircloud_label);
        addwalllabel(minlon,minlat-extraLat,minheight+cellheight*4,(minheight+cellheight*4).toFixed(2)+'m',airEntityNameCommon.air3dEntityNames.aircloud_label);
        addwalllabel(minlon,minlat-extraLat,minheight+cellheight*5,(minheight+cellheight*5).toFixed(2)+'m',airEntityNameCommon.air3dEntityNames.aircloud_label);
        //添加標簽 北
        addwalllabel(maxlon+extraLen,maxlat,minheight+cellheight,(minheight+cellheight).toFixed(2)+'m',airEntityNameCommon.air3dEntityNames.aircloud_label);
        addwalllabel(maxlon+extraLen,maxlat,minheight+cellheight*2,(minheight+cellheight*2).toFixed(2)+'m',airEntityNameCommon.air3dEntityNames.aircloud_label);
        addwalllabel(maxlon+extraLen,maxlat,minheight+cellheight*3,(minheight+cellheight*3).toFixed(2)+'m',airEntityNameCommon.air3dEntityNames.aircloud_label);
        addwalllabel(maxlon+extraLen,maxlat,minheight+cellheight*4,(minheight+cellheight*4).toFixed(2)+'m',airEntityNameCommon.air3dEntityNames.aircloud_label);
        addwalllabel(maxlon+extraLen,maxlat,minheight+cellheight*5,(minheight+cellheight*5).toFixed(2)+'m',airEntityNameCommon.air3dEntityNames.aircloud_label);
        //添加標簽 南
        addwalllabel(minlon+cellLen,minlat-extraLat,minheight,(minlon+cellLen).toFixed(4)+'',airEntityNameCommon.air3dEntityNames.aircloud_label);
        addwalllabel(minlon+cellLen*2,minlat-extraLat,minheight,(minlon+cellLen*2).toFixed(4)+'',airEntityNameCommon.air3dEntityNames.aircloud_label);
        addwalllabel(minlon+cellLen*3,minlat-extraLat,minheight,(minlon+cellLen*3).toFixed(4)+'',airEntityNameCommon.air3dEntityNames.aircloud_label);
        addwalllabel(minlon+cellLen*4,minlat-extraLat,minheight,(minlon+cellLen*4).toFixed(4)+'',airEntityNameCommon.air3dEntityNames.aircloud_label);
        addwalllabel(minlon+cellLen*5,minlat-extraLat,minheight,(minlon+cellLen*5).toFixed(4)+'',airEntityNameCommon.air3dEntityNames.aircloud_label);
        //添加標簽 東
        addwalllabel(maxlon+extraLen,minlat,minheight,(minlat).toFixed(4)+'',airEntityNameCommon.air3dEntityNames.aircloud_label);
        addwalllabel(maxlon+extraLen,minlat+cellLat,minheight,(minlat+cellLat).toFixed(4)+'',airEntityNameCommon.air3dEntityNames.aircloud_label);
        addwalllabel(maxlon+extraLen,minlat+cellLat*2,minheight,(minlat+cellLat*2).toFixed(4)+'',airEntityNameCommon.air3dEntityNames.aircloud_label);
        addwalllabel(maxlon+extraLen,minlat+cellLat*3,minheight,(minlat+cellLat*3).toFixed(4)+'',airEntityNameCommon.air3dEntityNames.aircloud_label);
        addwalllabel(maxlon+extraLen,minlat+cellLat*4,minheight,(minlat+cellLat*4).toFixed(4)+'',airEntityNameCommon.air3dEntityNames.aircloud_label);
        //addwalllabel(maxlon+extraLen,minlat+cellLat*5,minheight,(minlat+cellLat*5).toFixed(4)+'');
    }

    /**
     * 切換展示形式 表格 或者3D點雲
     * @param airType
     */
    function changeairtype(airType) {
        if (airType == 0) {
            let airmultitaskdatas=[];
            for (let i=0;i<window.viewer.entities.values.length;i++)
            {
                let entity=window.viewer.entities.values[i];
                if (entity.name==airEntityNameCommon.air3dEntityNames.aircloud_point){
                    let airinfo=entity.airdatainfo;
                    if (airinfo) {
                        airmultitaskdatas.push(airinfo);
                    }
                }
            }
            if (airmultitaskdatas.length < 1) {
                return;
            }
            PointCloud2Grid.createAirGrids(airmultitaskdatas,airdata.gridWidthjiaodu);
            airColorBar.resetairdataColor(UiParaManager.getCurParaName());
            clearAll3Dpoints();
        }else {
            let airmultitaskdatas=[];
            let airdatas=[];
            var firstdata = airColorBar.findFirstAirData();
            if (!firstdata) {
                return;
            }
            var curtaskid=firstdata.taskid;
            for (let i=0;i<window.viewer.entities.values.length;i++)
            {
                let entity=window.viewer.entities.values[i];
                if (entity.name==airEntityNameCommon.airGridEntityNames.airgrid){
                    let airinfo=entity.airdatainfo;
                    let taskid=airinfo.taskid;
                    if (airinfo) {
                        if (taskid !== curtaskid) {
                            airmultitaskdatas.push([].concat(JSON.parse(JSON.stringify(airdatas))));
                            airdatas=[];
                            airdatas.push(airinfo);
                        }
                        else{
                            airdatas.push(airinfo);
                        }
                        curtaskid=taskid;
                    }
                }
            }
            airmultitaskdatas.push([].concat(JSON.parse(JSON.stringify(airdatas))));
            if (airmultitaskdatas.length > 0) {
                for (let i = 0; i < airmultitaskdatas.length; i++) {
                    let airdatas=airmultitaskdatas[i];
                    air3dcloud(airdatas);
                }
            }
            clearAllGrid();
        }
    }

    return {
        createair3dcloud:createair3dcloud,
        createairGrid:createairGrid,
        dingweibyairtaskid:dingweibyairtaskid,
        createairGridMultiTasks:createairGridMultiTasks,
        removedatabytaskid:removedatabytaskid,
        clearAll:clearAll,
        changeairtype:changeairtype,
        draw3Dfream:draw3Dfream,
        createair3dcloudpoint:createair3dcloudpoint,
        getairdatas:getairdatas,
        clear3Dfream:clear3Dfream
    }
})()

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM