使用超图功能(三)

一.使用分析

                //缓冲区分析
                bufferAnalysis: {
                    //点
                    point: {
                        //点
                        pointHandler: null,
                        //点画半径展示的线
                        pointPolylineHandler: null,
                        //圆心
                        pointCircleCenter: null,
                        //半径
                        pointCircleRadius: null,
                        //点击数量
                        clickCount: 0,
                        //需要分析的实体
                        pointService: [],
                        //点加载的实体id
                        pointEntities: [],
                        //缓冲区实体集合
                        bufferEntityList: [],
                        /**
                         * 销毁点
                         */
                        destory: function () {
                            supperMap.bufferAnalysis.point.pointHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
                            supperMap.bufferAnalysis.point.pointPolylineHandler.deactivate();
                            supperMap.bufferAnalysis.point.pointCircleCenter = null;
                            supperMap.bufferAnalysis.point.pointCircleRadius = null;
                            supperMap.bufferAnalysis.point.clickCount = 0;
                            supperMap.bufferAnalysis.point.pointService.length = 0;
                            supperMap.bufferAnalysis.point.pointEntities.forEach(item => {
                                console.log(item)
                                supperMap.removeEntity(item);
                            });
                            supperMap.bufferAnalysis.point.bufferEntityList.forEach(item => {
                                console.log(item)
                                supperMap.removeEntity(item);
                            });


                        }
                    },

                    /**
                     * 点初始化
                     * @param PointList(点集合)
                     */
                    pointInit: function () {
                        this.point.pointHandler = new Cesium.ScreenSpaceEventHandler(supperMap.scene.canvas);
                        this.point.pointPolylineHandler = new Cesium.DrawHandler(supperMap.viewer, Cesium.DrawMode.Line);
                        this.point.pointHandler.setInputAction(function (evt) {
                            var position = supperMap.scene.pickPosition(evt.position);
                            supperMap.bufferAnalysis.point.clickCount++;
                            if (supperMap.bufferAnalysis.point.clickCount == 2) {
                                //半径
                                supperMap.bufferAnalysis.point.pointCircleRadius = supperMap.getDisTance({
                                    lon: supperMap.bufferAnalysis.point.pointCircleCenter[0],
                                    lat: supperMap.bufferAnalysis.point.pointCircleCenter[1],
                                    height: supperMap.bufferAnalysis.point.pointCircleCenter[2]
                                }, {
                                    lon: supperMap.cartesian2toDegrees(position)[0],
                                    lat: supperMap.cartesian2toDegrees(position)[1],
                                    height: supperMap.cartesian2toDegrees(position)[1]
                                }) / 1000
                                //缓冲区位置
                                let turfPositions = turf.point([supperMap.bufferAnalysis.point.pointCircleCenter[0], supperMap.bufferAnalysis.point.pointCircleCenter[1]])
                                //创建缓冲区
                                supperMap.bufferAnalysis.point.bufferEntityList.push(supperMap.bufferAnalysis.createGraphicsBuffer({
                                    viewer: supperMap.viewer,
                                    animation: false,
                                    turfPositions: turfPositions,
                                    radius: supperMap.bufferAnalysis.point.pointCircleRadius,
                                    height: supperMap.bufferAnalysis.point.pointCircleCenter[2],
                                    entityList: supperMap.bufferAnalysis.point.pointService
                                }))
                                //重置点击事件
                                supperMap.bufferAnalysis.point.clickCount = 0;
                                supperMap.bufferAnalysis.point.pointPolylineHandler.deactivate();
                                supperMap.bufferAnalysis.point.pointPolylineHandler.clear();
                            } else {
                                //设置圆心
                                supperMap.bufferAnalysis.point.pointCircleCenter = supperMap.cartesian2toDegrees(position);
                                //开启画线
                                supperMap.bufferAnalysis.point.pointPolylineHandler.activate();
                            }
                        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
                    },

                    //销毁
                    destory: function () {
                        //销毁点
                        supperMap.bufferAnalysis.point.destory();
                    },

                    /**
                     * 创建缓冲区
                     * @param params
                     * @returns {*}
                     */
                    createGraphicsBuffer: function (params = {}) {
                        let _turfPositions = params.turfPositions || [];
                        //材质
                        let _material = params.material || [];
                        //动画
                        let _animation = params.animation || false;
                        //缓冲区实体
                        let _bufferEntity = new Cesium.Entity();
                        //绘制的缓冲区多边形
                        let _hierarchy = new Cesium.PolygonHierarchy()
                        //半径
                        let _radius = params.radius || 0.1;
                        //半径
                        let radius = 0;
                        //高度
                        let height = params.height;
                        //被分析的集合
                        let entityList = params.entityList;
                        //缓冲区的id
                        let bufferId = generateUUID();

                        /**
                         * 转换函数
                         * @param arr
                         * @returns {Array}
                         */
                        const parse = (arr) => {
                            var buffered = [];
                            for (var i = 0; i < arr.length; i++) {
                                buffered = buffered.concat(arr[i]);
                            }
                            return buffered
                        }

                        //缓冲区id
                        _bufferEntity.id = bufferId;
                        _bufferEntity.animation = _animation;
                        _bufferEntity.polygon = {
                            material: Cesium.Color.SKYBLUE.withAlpha(0.5),
                            hierarchy: new Cesium.CallbackProperty(function (time, result) {
                                if (_bufferEntity.animation === undefined || _bufferEntity.animation) { // 动画
                                    if (radius <= _radius) {
                                        radius += 0.02
                                    } else {
                                        radius = 0.02
                                    }
                                } else {
                                    radius = _radius
                                }
                                let buffered = parse(
                                    turf.buffer(_turfPositions, radius, {units: 'kilometers'}).geometry
                                        .coordinates[0]
                                )
                                _hierarchy.positions = Cesium.Cartesian3.fromDegreesArray(buffered, Cesium.Ellipsoid.WGS84, result)
                                return _hierarchy;
                            }, false),
                        }

                        let buffer = {
                            id: bufferId,
                            animation: _animation,
                            polygon: {
                                height: height,
                                material: Cesium.Color.SKYBLUE.withAlpha(0.5),
                                hierarchy: new Cesium.CallbackProperty(function (time, result) {
                                    if (_bufferEntity.animation === undefined || _bufferEntity.animation) { // 动画
                                        if (radius <= _radius) {
                                            radius += 0.02
                                        } else {
                                            radius = 0.02
                                        }
                                    } else {
                                        radius = _radius
                                    }
                                    let buffered = parse(
                                        turf.buffer(_turfPositions, radius, {units: 'kilometers'}).geometry
                                            .coordinates[0]
                                    )
                                    _hierarchy.positions = Cesium.Cartesian3.fromDegreesArray(buffered, Cesium.Ellipsoid.WGS84, result)
                                    return _hierarchy;
                                }, false),
                            }
                        }
                        //添加缓冲区
                        supperMap.viewer.entities.add(buffer)


                        //创建分析面
                        var poly = turf.circle([supperMap.bufferAnalysis.point.pointCircleCenter[0], supperMap.bufferAnalysis.point.pointCircleCenter[1]], supperMap.bufferAnalysis.point.pointCircleRadius, {units: 'kilometers'});
                        //循环实体集合
                        entityList.forEach(item => {
                            let pointPosition = supperMap.cartesian2toDegrees(item);
                            let point = turf.point(pointPosition);
                            if (turf.booleanPointInPolygon(point, poly)) {
                                console.log(item)
                                let pointId = supperMap.createPoint(item, Cesium.Color.RED);
                                supperMap.bufferAnalysis.point.pointEntities.push(pointId);
                                // data.push(pointId);
                            }
                        });

                        return bufferId;
                    },
                    /**
                     * 读取geojson
                     */
                    getGEOJSONData: function (url) {
                        // Seed the random number generator for repeatable results.
                        supperMap.Cesium.Math.setRandomNumberSeed(0);
                        var promise = supperMap.Cesium.GeoJsonDataSource.load(
                            url
                        );
                        promise.then(function (dataSource) {
                            // supperMap.viewer.dataSources.add(dataSource);
                            dataSource.entities.values.forEach(function (item, index) {
                                //判断是点
                                if (item.billboard) {
                                    supperMap.bufferAnalysis.point.pointService.push(item.position._value);
                                }
                            });
                        }).otherwise(function (error) {
                            console.log(error)
                        });
                    }
                },

                //挖方分析
                excavationAnalysis:{
                    //默认空间模式
                    clampMode:0,
                    //挖方点击
                    handlerPolygon:null,
                    //工具条
                    tooltip:null,
                    //高度
                    dep:0,
                    //面点击事件
                    handlerArea:null,
                    //体积
                    volume:null,
                    //回调函数
                    callback:null,
                    clickCount:null,
                    positions:null,
                    //用户画的面
                    polyData: [],
                    //初始化任意绘制挖方
                    init:function(){
                        this.handlerPolygon=new Cesium.DrawHandler(supperMap.viewer, Cesium.DrawMode.Polygon, this.clampMode);
                        this.tooltip = createTooltip(document.body);
                        this.handlerPolygon.drawEvt.addEventListener(function (result) {
                            supperMap.excavationAnalysis.handlerPolygon.polygon.show = false;
                            supperMap.excavationAnalysis.handlerPolygon.deactivate();
                            supperMap.excavationAnalysis.tooltip.setVisible(false);

                            var array = [].concat(result.object.positions);
                            var positions = [];
                            var positionsii = [];
                            for (var i = 0, len = array.length; i < len; i++) {
                                var cartographic = Cesium.Cartographic.fromCartesian(array[i]);
                                var longitude = Cesium.Math.toDegrees(cartographic.longitude);
                                var latitude = Cesium.Math.toDegrees(cartographic.latitude);
                                if (positions.indexOf(longitude) == -1 && positions.indexOf(latitude) == -1) {
                                    positions.push(longitude);
                                    positions.push(latitude);
                                    positions.push(supperMap.excavationAnalysis.dep);
                                    positionsii.push({
                                        x: longitude,
                                        y: latitude
                                    });
                                }
                            }
                            //此处用的地形修改 而不是地形开挖
                            supperMap.viewer.scene.globe.removeAllModifyRegion();
                            supperMap.viewer.scene.globe.addModifyRegion({
                                name: 'ggg',
                                position: positions
                            });

                            var length = [];
                            length.push(positionsii.length);
                        });
                        this.handlerArea = new Cesium.MeasureHandler(supperMap.viewer, Cesium.MeasureMode.Area, 1);
                        this.handlerArea.measureEvt.addEventListener(function (result) {
                            var mj = Number(result.area);
                            var selOptV = $("#selOpt").val();
                            var positions = result.positions;
                            if (selOptV == 3 || selOptV == 4) {
                                mj = Number(supperMap.calcClampValue(positions));
                            } else if (selOptV == 5) {
                                mj = Number(supperMap.calcAreaWithoutHeight(positions));
                            }
                            var area = mj > 1000000 ? (mj / 1000000).toFixed(2)  : mj.toFixed(2);
                            supperMap.excavationAnalysis.volume=Math.abs(supperMap.excavationAnalysis.dep)*Number(area);
                            if(supperMap.excavationAnalysis.callback){
                                supperMap.excavationAnalysis.callback();
                            }
                            supperMap.excavationAnalysis.handlerArea.clear();
                        });
                        //选中
                        this.handlerArea && this.handlerArea.activate();
                    },

                    //初始化矩形绘制挖方
                    initRectangle:function(){
                        this.tooltip = createTooltip(document.body);
                        this.clickCount = 0;
                        this.positions = [];
                        this.screenSpaceEventHandler = new Cesium.ScreenSpaceEventHandler(supperMap.scene.canvas);
                        this.handlerPolygon = new Cesium.DrawHandler(supperMap.viewer, Cesium.DrawMode.Line);
                        this.handlerPolygon.activate();

                        this.screenSpaceEventHandler.setInputAction(function (evt) {
                            var position = supperMap.scene.pickPosition(evt.position);
                            supperMap.excavationAnalysis.positions.push(position);
                            supperMap.excavationAnalysis.clickCount++;
                            //判断点击了几下
                            if (supperMap.excavationAnalysis.clickCount === 2 && supperMap.excavationAnalysis.positions.length === 2) {
                                supperMap.excavationAnalysis.handlerPolygon.drawEvt.raiseEvent(supperMap.excavationAnalysis.positions);
                                supperMap.excavationAnalysis.polyData = [];
                            }
                        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

                        this.handlerPolygon.drawEvt.addEventListener(function (result) {
                            // // console.log(result);
                            supperMap.excavationAnalysis.handlerPolygon.deactivate();
                            supperMap.excavationAnalysis.handlerPolygon.polyline.show = false;


                            //标注点重构
                            let point1 = {x:result[0].x, y:result[0].y,z:result[1].z};
                            let point2 = {x:result[0].x, y:result[1].y,z:result[0].z};
                            let point3 = {x:result[1].x, y:result[1].y,z:result[0].z};
                            let point4 = {x:result[1].x, y:result[0].y,z:result[1].z};

                            var array = [];
                            array.push(point1, point2, point3, point4);
                            //矢量转为经纬度坐标
                            var dian1 = supperMap.cartesian2toDegrees(result[0]);
                            var dian2 = supperMap.cartesian2toDegrees(result[1]);
                            var weiduMi = Math.abs((dian1[1]-dian2[1])*1111000);    //纬度米
                            var jingduMi = Math.abs((dian1[0]-dian2[0])*91.00779212050698783);      //经度米
                            supperMap.excavationAnalysis.volume = Math.abs(weiduMi*jingduMi*supperMap.excavationAnalysis.dep);//体积
                            if(supperMap.excavationAnalysis.callback){
                                supperMap.excavationAnalysis.callback();
                            }
                            // let postiontList = [];
                            // var height = '';
                            // for (var i = 0; i < array.length; i++) {
                            //     // console.log(supperMap.cartesian2toDegrees(aaa)[0]);
                            //     postiontList.push(Number(supperMap.cartesian2toDegrees(array[i])[0]));
                            //     postiontList.push(Number(supperMap.cartesian2toDegrees(array[i])[1]));
                            //     height = 0;
                            // }
                            // window.supperMap.createPolygon(postiontList, height);

                            var positions = [];
                            var positionsii = [];
                            for (var i = 0, len = array.length; i < len; i++) {
                                var cartographic = Cesium.Cartographic.fromCartesian(array[i]);
                                var longitude = Cesium.Math.toDegrees(cartographic.longitude);
                                var latitude = Cesium.Math.toDegrees(cartographic.latitude);
                                if (positions.indexOf(longitude) == -1 && positions.indexOf(latitude) == -1) {
                                    positions.push(longitude);
                                    positions.push(latitude);
                                    positions.push(supperMap.excavationAnalysis.dep);
                                    positionsii.push({
                                        x: longitude,
                                        y: latitude
                                    });
                                }
                            }
                            //此处用的地形修改 而不是地形开挖
                            supperMap.viewer.scene.globe.removeAllModifyRegion();
                            supperMap.viewer.scene.globe.addModifyRegion({
                                name: 'ggg',
                                position: positions
                            });

                            var length = [];
                            length.push(positionsii.length);
                            supperMap.excavationAnalysis.clickCount = 0;
                            supperMap.excavationAnalysis.positions = [];
                            supperMap.excavationAnalysis.handlerPolygon.activate();

                        });

                    },
                    begin:function(){
                        this.handlerPolygon.activate();
                    },
                    destory:function(){
                        if(this.handlerArea){
                            this.handlerArea.clear();
                            this.handlerArea.deactivate();
                        }
                        supperMap.viewer.scene.globe.removeAllModifyRegion();
                        if(this.handlerPolygon){
                            this.handlerPolygon.clear();
                        }

                        if (supperMap.excavationAnalysis.handlerPolygon) {
                            supperMap.excavationAnalysis.handlerPolygon.polyline.show = true;
                            supperMap.excavationAnalysis.handlerPolygon.clear();
                        }
                        if (supperMap.excavationAnalysis.screenSpaceEventHandler) {
                            supperMap.excavationAnalysis.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
                            supperMap.excavationAnalysis.screenSpaceEventHandler = null;
                        }
                        supperMap.excavationAnalysis.polyData = [];
                        supperMap.excavationAnalysis.pts = null;
                        supperMap.removeCameraEventListener();
                    },
                },



                //挖方测量
                measure: {
                    type: '',
                    //初始化画高
                    handlerHeight: null,
                    //初始化画面
                    handlerArea: null,
                    //初始化测量距离
                    handlerDis: null,
                    // 空间模式
                    clampMode: 0,
                    /**
                     * 初始化高度测量
                     */
                    initHeight: function () {
                        //初始化画高
                        this.handlerHeight = new Cesium.MeasureHandler(supperMap.viewer, Cesium.MeasureMode.DVH);
                        this.handlerHeight.measureEvt.addEventListener(function (result) {
                            var distance = result.distance > 1000 ? (result.distance / 1000).toFixed(2) + 'km' : result.distance + 'm';
                            var vHeight = result.verticalHeight > 1000 ? (result.verticalHeight / 1000).toFixed(2) + 'km' : result.verticalHeight + 'm';
                            var hDistance = result.horizontalDistance > 1000 ? (result.horizontalDistance / 1000).toFixed(2) + 'km' : result.horizontalDistance + 'm';
                            supperMap.measure.handlerHeight.disLabel.text = '空间距离:' + distance;
                            supperMap.measure.handlerHeight.vLabel.text = '垂直高度:' + vHeight;
                            supperMap.measure.handlerHeight.hLabel.text = '水平距离:' + hDistance;
                        });
                        this.handlerHeight.activeEvt.addEventListener(function (isActive) {
                            if (isActive == true) {
                                supperMap.viewer.enableCursorStyle = false;
                                supperMap.viewer._element.style.cursor = '';
                                $('body').removeClass('measureCur').addClass('measureCur');
                            }
                            else {
                                supperMap.viewer.enableCursorStyle = true;
                                $('body').removeClass('measureCur');

                            }
                        });
                        //选中
                        supperMap.measure.handlerHeight && supperMap.measure.handlerHeight.activate();
                    },
                    /**
                     * 初始化画面
                     */
                    initArea: function () {
                        this.handlerArea = new Cesium.MeasureHandler(supperMap.viewer, Cesium.MeasureMode.Area, supperMap.measure.clampMode);
                        this.handlerArea.measureEvt.addEventListener(function (result) {
                            var mj = Number(result.area);
                            var selOptV = $("#selOpt").val();
                            var positions = result.positions;
                            if (selOptV == 3 || selOptV == 4) {
                                mj = Number(supperMap.calcClampValue(positions));
                            } else if (selOptV == 5) {
                                mj = Number(supperMap.calcAreaWithoutHeight(positions));
                            }
                            var area = mj > 1000000 ? (mj / 1000000).toFixed(2) + 'km²' : mj.toFixed(2) + '㎡'
                            supperMap.measure.handlerArea.areaLabel.text = '面积:' + area;
                        });
                        this.handlerArea.activeEvt.addEventListener(function (isActive) {
                            if (isActive == true) {
                                supperMap.viewer.enableCursorStyle = false;
                                supperMap.viewer._element.style.cursor = '';
                                $('body').removeClass('measureCur').addClass('measureCur');
                            }
                            else {
                                supperMap.viewer.enableCursorStyle = true;
                                $('body').removeClass('measureCur');
                            }
                        });
                        //选中
                        supperMap.measure.handlerArea && supperMap.measure.handlerArea.activate();
                    },

                    /**
                     * 初始化距离
                     */
                    initDis: function () {
                        this.handlerDis = new Cesium.MeasureHandler(supperMap.viewer, Cesium.MeasureMode.Distance, supperMap.measure.clampMode);

                        //注册测距功能事件
                        this.handlerDis.measureEvt.addEventListener(function (result) {
                            var dis = Number(result.distance);
                            var selOptV = $("#selOpt").val();
                            var positions = result.positions;
                            if (selOptV == 3 || selOptV == 4) {
                                dis = Number(supperMap.calcClampDistance(positions));
                            }
                            var distance = dis > 1000 ? (dis / 1000).toFixed(2) + 'km' : dis.toFixed(2) + 'm';
                            supperMap.measure.handlerDis.disLabel.text = '距离:' + distance;
                        });
                        this.handlerDis.activeEvt.addEventListener(function (isActive) {
                            if (isActive == true) {
                                supperMap.viewer.enableCursorStyle = false;
                                supperMap.viewer._element.style.cursor = '';
                                $('body').removeClass('measureCur').addClass('measureCur');
                            }
                            else {
                                supperMap.viewer.enableCursorStyle = true;
                                $('body').removeClass('measureCur');
                            }
                        });
                        //选中
                        supperMap.measure.handlerDis && supperMap.measure.handlerDis.activate();
                    },


                    /**
                     * 清除
                     */
                    clear: function () {
                        this.handlerDis && this.handlerDis.clear();
                        this.handlerArea && this.handlerArea.clear();
                        this.handlerHeight && this.handlerHeight.clear();
                    },
                    /**
                     * 销毁函数
                     */
                    destory: function () {
                        this.type = '';
                        this.handlerDis && this.handlerDis.deactivate();
                        this.handlerArea && this.handlerArea.deactivate();
                        this.handlerHeight && this.handlerHeight.deactivate();
                        this.handlerDis && this.handlerDis.clear();
                        this.handlerArea && this.handlerArea.clear();
                        this.handlerHeight && this.handlerHeight.clear();
                    }


                },

二.小功能

                /**
                 * 两点之间算距离
                 * @param begin
                 * @param end
                 * @returns {number}
                 */
                getDisTance: function (begin, end) {
                    var satrtPoint = Cesium.Cartographic.fromDegrees(Number(begin.lon), Number(begin.lat), Number(begin.height))
                    var endPoint = Cesium.Cartographic.fromDegrees(Number(end.lon), Number(end.lat), Number(end.height))

                    var geodesic = new Cesium.EllipsoidGeodesic();
                    geodesic.setEndPoints(satrtPoint, endPoint);
                    var a = geodesic.surfaceDistance;
                    let b = Math.abs(satrtPoint.height - endPoint.height);
                    let distance = Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));
                    return distance;
                },

                /**
 					let point1 = supperMap.calculatingTargetPoints(treeService.cameraTree.buffer.centerPosition[0], treeService.cameraTree.buffer.centerPosition[1], treeService.cameraTree.buffer.centerPosition[2], 2 * 3.14 / 360 * 30, 500);(2 * 3.14 / 360 * 30为30°)
                 * 根据距离方向和观察点计算目标点(109.878321 19.963493 82 0 500)
                 * @param {Object} lon 经度
                 * @param {Object} lat 维度
                 * @param {Object} height 高度
                 * @param {Object} direction 方向
                 * @param {Object} radius 可视距离
                 */
                calculatingTargetPoints: function (lon, lat, height, direction, radius) {
                    // 观察点
                    var viewPoint = Cesium.Cartesian3.fromDegrees(lon, lat, height);
                    // 世界坐标转换为投影坐标
                    var webMercatorProjection = new Cesium.WebMercatorProjection(supperMap.viewer.scene.globe.ellipsoid);
                    var viewPointWebMercator = webMercatorProjection.project(Cesium.Cartographic.fromCartesian(viewPoint));
                    // 计算目标点
                    var toPoint = new Cesium.Cartesian3(viewPointWebMercator.x + radius * Math.cos(direction), viewPointWebMercator.y +
                        radius * Math.sin(direction), 0);
                    // 投影坐标转世界坐标
                    toPoint = webMercatorProjection.unproject(toPoint);
                    toPoint = Cesium.Cartographic.toCartesian(toPoint.clone());
                    // 世界坐标转地理坐标
                    var cartographic = Cesium.Cartographic.fromCartesian(toPoint);
                    var point = [Cesium.Math.toDegrees(cartographic.longitude), Cesium.Math.toDegrees(cartographic.latitude)];
                    return point;
                },
                 /**
                 * 根据id找图片图层
                 * @param id
                 * @returns {*}
                 */
                getImagesLayerInView: function (id) {
                    var imageryLayersCoc = supperMap.viewer.imageryLayers
                    var imageryLayers = imageryLayersCoc._layers
                    var layer = null
                    for (var i = 0; i < imageryLayers.length; i++) {
                        console.log(imageryLayers[i].imageryProvider._layer)
                        if (imageryLayers[i].imageryProvider._layer === id) {
                            layer = imageryLayersCoc.get(i)
                            break
                        }
                    }
                    return layer
                },
                                /**
                 * 椭球贴地面积
                 * @param positions
                 * @returns {number}
                 */
                calcClampValue: function (positions) {
                    var lonlat = [];
                    var value = 0;
                    for (var i = 0; i < positions.length; i++) {
                        var cartographic = Cesium.Cartographic.fromCartesian(positions[i]);
                        var lon = Cesium.Math.toDegrees(cartographic.longitude);

                        var lat = Cesium.Math.toDegrees(cartographic.latitude);
                        lonlat.push(lon, lat);
                    }

                    var gemetry = new Cesium.PolygonGeometry.fromPositions({
                        positions: Cesium.Cartesian3.fromDegreesArray(lonlat)
                    });

                    var selOptV = $("#selOpt").val();
                    if (selOptV == 3) {
                        value = scene.globe.computeSurfaceArea(gemetry, Cesium.Ellipsoid.CGCS2000);

                    } else if (selOptV == 4) {
                        value = scene.globe.computeSurfaceArea(gemetry, Cesium.Ellipsoid.XIAN80);
                    }
                    return value;
                },

                /**
                 * 椭球贴地距离
                 * @param positions
                 * @returns {number}
                 */
                calcClampDistance: function (positions) {
                    var lonlat = [];
                    var value = 0;
                    for (var i = 0; i < positions.length; i++) {
                        var cartographic = Cesium.Cartographic.fromCartesian(positions[i]);
                        var lon = Cesium.Math.toDegrees(cartographic.longitude);

                        var lat = Cesium.Math.toDegrees(cartographic.latitude);
                        lonlat.push(lon, lat);
                    }

                    var gemetry = new Cesium.PolylineGeometry({
                        positions: Cesium.Cartesian3.fromDegreesArray(lonlat)
                    });


                    var selOptV = $("#selOpt").val();
                    if (selOptV == 3) {
                        value = scene.globe.computeSurfaceDistance(gemetry, Cesium.Ellipsoid.CGCS2000);

                    } else if (selOptV == 4) {
                        value = scene.globe.computeSurfaceDistance(gemetry, Cesium.Ellipsoid.XIAN80);
                    }
                    return value;
                },

                /**
                 * 椭球贴地高度
                 * @param positions
                 * @returns {*}
                 */
                calcAreaWithoutHeight: function (positions) {
                    var totalLon = 0;
                    for (var i = 0; i < positions.length; i++) {
                        var cartographic = Cesium.Cartographic.fromCartesian(positions[i]);
                        var lon = Cesium.Math.toDegrees(cartographic.longitude);
                        totalLon += lon;
                    }
                    var dh = Math.round((totalLon / positions.length + 6) / 6);//带号
                    var centralMeridian = dh * 6 - 3;
                    //高斯投影
                    var projection = new Cesium.CustomProjection({
                        name: "tmerc",
                        centralMeridian: centralMeridian,
                        primeMeridian: 0,
                        standardParallel_1: 0,
                        standardParallel_2: 0,
                        eastFalse: 500000.0,
                        northFalse: 0.0,
                        semimajorAxis: 6378137,
                        inverseFlattening: 298.257222101

                    });
                    var cartesians = [];
                    for (var i = 0; i < positions.length; i++) {
                        var cartographic = Cesium.Cartographic.fromCartesian(positions[i]);

                        var cartesian = projection.project(cartographic);
                        cartesians.push(cartesian);
                    }

                    cartesians.push(cartesians[0]);//首尾相接
                    var value = Cesium.getPreciseArea(cartesians, "China2000", centralMeridian, dh, 1);
                    return value;
                },
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值