Cesium 空间量算——面积量算

news2024/9/28 15:33:37

面积量算

    • 需求
    • 分析

需求

对页面上所选内容进行面积计算

在这里插入图片描述

分析

其实,计算面积其实就是把一个面,拆分成一个一个的三角曲面计算然后相加得到,下面是计算的面积的代码

/**
* @description : 面积量算
 * @author : 'Hukang'
 * @date : 2023-09-20 13:19:00
*/
//  添加标签
addLabel(centerPosition, text) {
      return this.viewer.entities.add(new Cesium.Entity({
          position: centerPosition,
          label: {
              text: text,
              font: '14px sans-serif',
              style: Cesium.LabelStyle.FILL_AND_OUTLINE, //FILL  FILL_AND_OUTLINE OUTLINE
              fillColor: Cesium.Color.YELLOW,
              showBackground: true, //指定标签后面背景的可见性
              backgroundColor: new Cesium.Color(0.165, 0.165, 0.165, 0.8), // 背景颜色
              backgroundPadding: new Cesium.Cartesian2(6, 6), //指定以像素为单位的水平和垂直背景填充padding
              pixelOffset: new Cesium.Cartesian2(0, -25),
              disableDepthTestDistance: Number.POSITIVE_INFINITY
          }
      }));
  },
//计算多边形面积
getArea(points) {
    var degreesPerRadian = 180.0 / Math.PI; //弧度转化为角度

    /*角度*/
    function Angle(p1, p2, p3) {
        var bearing21 = Bearing(p2, p1);
        var bearing23 = Bearing(p2, p3);
        var angle = bearing21 - bearing23;
        if (angle < 0) {
            angle += 360;
        }
        return angle;
    }

    /*方向*/
    function Bearing(from, to) {
        from = Cesium.Cartographic.fromCartesian(from);
        to = Cesium.Cartographic.fromCartesian(to);
        var lat1 = from.latitude;
        var lon1 = from.longitude;
        var lat2 = to.latitude;
        var lon2 = to.longitude;
        var angle = -Math.atan2(Math.sin(lon1 - lon2) * Math.cos(lat2), Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2));
        if (angle < 0) {
            angle += Math.PI * 2.0;
        }
        angle = angle * degreesPerRadian; //角度
        return angle;
    }

    function distance(point1, point2) {
        var point1cartographic = Cesium.Cartographic.fromCartesian(point1);
        var point2cartographic = Cesium.Cartographic.fromCartesian(point2);
        /**根据经纬度计算出距离**/
        var geodesic = new Cesium.EllipsoidGeodesic();
        geodesic.setEndPoints(point1cartographic, point2cartographic);
        var s = geodesic.surfaceDistance;
        //console.log(Math.sqrt(Math.pow(distance, 2) + Math.pow(endheight, 2)));
        //返回两点之间的距离
        s = Math.sqrt(Math.pow(s, 2) + Math.pow(point2cartographic.height - point1cartographic.height, 2));
        return s;
    }

    var res = 0;
    //拆分三角曲面

    for (var i = 0; i < points.length - 2; i++) {
        var j = (i + 1) % points.length;
        var k = (i + 2) % points.length;
        var totalAngle = Angle(points[i], points[j], points[k]);


        var dis_temp1 = distance(points[j], points[0]);
        var dis_temp2 = distance(points[k], points[0]);
        res += dis_temp1 * dis_temp2 * Math.sin(totalAngle) / 2;
        // console.log(res);
    }

    if (res < 1000000) {
        res = Math.abs(res).toFixed(4) + " 平方米";
    } else {
        res = Math.abs((res / 1000000.0).toFixed(4)) + " 平方公里";
    }

    return res;

},
// 添加面
addPolyGon(positions) {
    var dynamicPositions = new Cesium.CallbackProperty(() => {
        return new Cesium.PolygonHierarchy(positions);
    }, false);
    this.entityCollection.push(this.viewer.entities.add(new Cesium.Entity({
        polygon: {
            hierarchy: dynamicPositions,
            material: Cesium.Color.RED.withAlpha(0.6),
            classificationType: Cesium.ClassificationType.BOTH // 贴地表和贴模型,如果设置了,这不能使用挤出高度
        }
    })));
},
measurePolygon() {
    var positions = [];
    var clickStatus = false;
    var labelEntity = null;
    this.viewer.screenSpaceEventHandler.setInputAction((clickEvent) => {
        clickStatus = true;
        var cartesian = this.viewer.scene.globe.pick(this.viewer.camera.getPickRay(clickEvent.position), this.viewer.scene);
        if(!cartesian){
            return false
        }
        if (positions.length == 0) {
            positions.push(cartesian.clone()); //鼠标左击 添加第1个点
            this.addPoint(cartesian);

            this.viewer.screenSpaceEventHandler.setInputAction((moveEvent) => {
                var movePosition = this.viewer.scene.globe.pick(this.viewer.camera.getPickRay(moveEvent.endPosition), this.viewer.scene);
                if(!movePosition){
                    return false;
                }
                if (positions.length == 1) {
                    positions.push(movePosition);
                    this.addLine(positions);
                } else {
                    if (clickStatus) {
                        positions.push(movePosition);
                    } else {
                        positions.pop();
                        positions.push(movePosition);
                    }
                }
                if (positions.length >= 3) {
                    // 绘制label
                    if (labelEntity) {
                        this.viewer.entities.remove(labelEntity);
                        this.entityCollection.splice(this.entityCollection.indexOf(labelEntity), 1);
                    }

                    var text = "面积:" + this.getArea(positions);
                    labelEntity = this.addLabel(cartesian, text);
                    this.entityCollection.push(labelEntity);
                }
                clickStatus = false;
            }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);


        } else if (positions.length == 2) {
            if(!cartesian){
                return false
            }
            positions.pop();
            positions.push(cartesian.clone()); // 鼠标左击 添加第2个点

            this.addPoint(cartesian);

            this.addPolyGon(positions);

            // 右击结束
            this.viewer.screenSpaceEventHandler.setInputAction((clickEvent) => {
                var clickPosition = this.viewer.scene.globe.pick(this.viewer.camera.getPickRay(clickEvent.position), this.viewer.scene);
                if(!clickPosition){
                    return false;
                }
                positions.pop();
                positions.push(clickPosition);
                positions.push(positions[0]); // 闭合
                this.addPoint(clickPosition);

                this.viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
                this.viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
                this.viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_CLICK);
            }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);


        } else if (positions.length >= 3) {
            if(!cartesian){
                return false
            }
            positions.pop();
            positions.push(cartesian.clone()); // 鼠标左击 添加第3个点
            this.addPoint(cartesian);
        }

    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
},

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1025966.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Date类的学习笔记-超级详细

Date 的定义, 在开始研究这个之前我们首先要能够明白一点&#xff0c;这个 Date 其实本质上是一个对象&#xff0c;我们通过这个对象可以去构建变量&#xff0c;知道这个之后就可以开展后续的研究了 JDK 通用 Date 类的构造方法 测试 获取当前的时间 // 构造这个日期对象Date…

计算机毕设 opencv python 深度学习垃圾图像分类系统

文章目录 0 前言课题简介一、识别效果二、实现1.数据集2.实现原理和方法3.网络结构 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟…

Vue系列(三)之 基础语法【下篇】

一. 事件处理 在 Vue.js 中&#xff0c;v-on 指令被用于监听 DOM 事件&#xff0c;并在事件触发时执行相应的方法&#xff0c;这些方法就是事件处理器。v-on 指令有简写形式 &#xff0c;例如 click"handleClick" 会监听点击事件并执行 handleClick 方法。 事件处理…

MQ - 09 RabbitMQ的架构设计与实现

文章目录 导图概述RabbitMQ 系统架构协议和网络模块数据存储元数据存储 ---> 自带的分布式数据库 Mnesia消息数据存储 生产者和消费者HTTP 协议支持和管控操作RabbitMQ 从生产到消费的全过程总结 导图 概述 最基础的消息队列应该具备通信协议、网络模块、存储模块、生产者、…

socket() failed (24: Too many open files) while connecting to upstream, client

一、这个错误通常是因为文件句柄数目超过系统限制导致的。要解决这个问题&#xff0c;您可以尝试以下几个步骤&#xff1a; 调整系统文件句柄限制&#xff1a;您可以通过修改/etc/security/limits.conf文件中的nofile参数来增加系统文件句柄的最大数目。将nofile的值增加到更高…

zabbix监控平台部署(二)

目录 一、自定义监控 二、Nginx监控 三、监控mysql 四、钉钉告警 五、163邮箱报警 总结 zabbix5.0 一、自定义监控 zabbix-agent&#xff08;147&#xff09; agent端操作 vim /etc/zabbix/zabbix_agentd.conf 在配置未文件末尾添加 UserParametermemory_userd,free…

C++中 负数与String字符串的长度 string.size()作比较 输出错误

在刷题的时候&#xff0c;发现用 -1<t.size() 输出的是错误的值&#xff0c;如下&#xff0c;t“ABC”&#xff0c;但重新定义一个变量后又可以了&#xff0c;查阅检查后&#xff0c;发现string.size()返回的是一个无符号的整数&#xff0c;因此与有符号整数比较&#xff0c…

SpingBoot:整合Mybatis-plus+Druid+mysql

SpingBoot&#xff1a;整合Mybatis-plusDruid 一、特别说明二、创建springboot新工程三、配置3.1 配置pom.xml文件3.2 配置数据源和durid连接池3.3 编写拦截器配置类 四、自动生成代码五、测试六、附件-mysql数据库表 本文参考链接&#xff1a; [Java] Spring Boot 集成 MyBati…

免费、安全、可靠!一站式构建平台 ABS 介绍及实例演示 | 龙蜥技术

编者按&#xff1a;操作系统是一个大的软件集合&#xff0c;成百上千个软件之间有相互调用、相互依赖等各种复杂的关联关系&#xff0c;所以统一的软件包格式&#xff0c;能够更友好地管理、定义这些复杂关系。今天&#xff0c;龙蜥社区基础设施 Contributor 单凯伦带大家了解龙…

Python灰帽编程——网页信息爬取

文章目录 网页信息爬取1. 相关模块1.1 requests 模块1.1.1 模块中的请求方法1.1.2 请求方法中的参数1.1.3 响应对象中属性 1.2 RE 模块1.2.1 匹配单个字符1.2.2 匹配一组字符1.2.3 其他元字符1.2.4 核心函数 2. 网页信息爬取2.1 获取网页HTML 源代码2.2 提取图片地址2.3 下载图…

【机器学习】详解回归(Regression)

文章目录 是什么的问题案例说明 是什么的问题 回归分析&#xff08;Regression Analysis&#xff09; 是研究自变量与因变量之间数量变化关系的一种分析方法&#xff0c;它主要是通过因变量Y与影响它的自变量 X i &#xff08; i 1 , 2 , 3 … &#xff09; X_i&#xff08;i1…

鉴源论坛 · 观模丨基于应用程序编程接口(API)的自动化测试(下)

作者 | 黄杉 华东师范大学软件工程学院博士 苏亭 华东师范大学软件工程学院教授 版块 | 鉴源论坛 观模 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 上文“基于应用程序编程接口&#xff08;API&#xff09;的自动化测试&#xff08;上&#xff09;”…

阿里巴巴全店商品采集教程,阿里巴巴店铺所有商品接口(详解阿里巴巴店铺所有商品数据采集步骤方法和代码示例)

随着电商行业的快速发展&#xff0c;阿里巴巴已成为国内的电商平台之一&#xff0c;拥有着海量的商品资源。对于一些需要大量商品数据的商家或者需求方来说&#xff0c;阿里巴巴全店采集是非常必要的。本文将详细介绍阿里巴巴全店采集的步骤和技巧&#xff0c;帮助大家更好地完…

自定义实现:头像上传View

看看效果&#xff1a; 非常简单&#xff1a;代码直接贴在下面&#xff0c;有需要的直接带走 /*** 带有自定义字体TextView。*/ class EditAvatarUploadView : AppCompatTextView {lateinit var paint:Paintconstructor(context: Context) : this(context, null){iniPaint()}con…

广告电商:一种新型的电商模式

电商行业是一个竞争激烈的领域&#xff0c;要想在这个领域中脱颖而出&#xff0c;就需要不断创新和变革。广告电商就是一种新型的电商模式&#xff0c;它结合了社交电商和广告分佣的优势&#xff0c;让消费者在购物的同时可以获得积分&#xff0c;并且还能通过观看平台对接的广…

【ES6】

ES6 1 ES6简介1.1 什么是ES61.2 为什么使用ES6 2 ES6的新增语法2.1 let2.2 const2.3 let、const、var的区别2.4 解构赋值2.4.1 数组解构2.4.2 对象解构 2.5 箭头函数2.6 剩余参数 3 ES6的内置对象扩展3.1 Array的扩展方法3.1.1 扩展运算符(展开语法)3.1.2 构造函数方法&#xf…

开启潮玩文化新篇章,泡泡玛特首届海外PTS潮玩成功落地新加坡

近日&#xff0c;泡泡玛特2023 PTS潮流玩具展&#xff08;下简称新加坡PTS&#xff09;在新加坡滨海湾金沙成功举办&#xff0c;本届潮玩展主题为“Back to Play in the Garden City”&#xff0c;现场人气爆棚&#xff0c;三天吸引了超过2万观众入场&#xff0c;这也是泡泡玛特…

Hadoop源码阅读(三):HDFS上传

说明&#xff1a; 1.Hadoop版本&#xff1a;3.1.3 2.阅读工具&#xff1a;IDEA 2023.1.2 3.源码获取&#xff1a;Index of /dist/hadoop/core/hadoop-3.1.3 (apache.org) 4.工程导入&#xff1a;下载源码之后得到 hadoop-3.1.3-src.tar.gz 压缩包&#xff0c;在当前目录打开Pow…

【计算机网络】 拥塞控制

文章目录 背景TCP的四种拥塞控制算法慢开始与拥塞避免&#xff1a;快重传&#xff1a;快恢复&#xff1a; 流量控制和拥塞控制本质上的 区别 背景 网络中的链路容量和交换节点中的缓存和处理机都有着工作的极限&#xff0c;当网络的需求超过他们的工作极限时&#xff0c;就出现…

电脑回收站为什么自动清空?win10回收站自动清理的东西怎么找回

“很奇怪&#xff0c;我昨天才删除的文件&#xff0c;但是今天回收站中啥也没有了。难道win10回收站是自动清空的吗&#xff1f;&#xff1f;请问如何恢复这些文件呢&#xff1f;” ——您是否曾经遇到过回收站自动清空的情况&#xff1f;您是如何处理的呢&#xff1f;下面为大…