空间面积测量对象是平面,考虑到了取点的高度;地表面积测量的是球体(地球)曲面

//****************************测量空间面积************************************************//
var measureAreaSpace = function (viewer, handler){ handler = new Cesium.ScreenSpaceEventHandler(viewer.scene._imageryLayerCollection);var positions = [];var tempPoints = [];var polygon = null;var tooltip = document.getElementById("toolTip");var cartesian = null;var floatingPoint;//浮动点tooltip.style.display = "block";handler.setInputAction(function(movement){tooltip.style.left = movement.endPosition.x + 3 + "px";tooltip.style.top = movement.endPosition.y - 25 + "px";tooltip.innerHTML ='<p>单击开始,右击结束</p>';cartesian = viewer.scene.pickPosition(movement.endPosition); //cartesian = viewer.scene.camera.pickEllipsoid(movement.endPosition, viewer.scene.globe.ellipsoid);if(positions.length >= 2){if (!Cesium.defined(polygon)) {polygon = new PolygonPrimitive(positions);}else{positions.pop();// cartesian.y += (1 + Math.random());positions.push(cartesian);}// tooltip.innerHTML='<p>'+distance+'米</p>';}},Cesium.ScreenSpaceEventType.MOUSE_MOVE);handler.setInputAction(function(movement){tooltip.style.display = "none";cartesian = viewer.scene.pickPosition(movement.position); // cartesian = viewer.scene.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid);if(positions.length == 0) {positions.push(cartesian.clone());}//positions.pop();positions.push(cartesian);//在三维场景中添加点var cartographic = Cesium.Cartographic.fromCartesian(positions[positions.length - 1]);var longitudeString = Cesium.Math.toDegrees(cartographic.longitude);var latitudeString = Cesium.Math.toDegrees(cartographic.latitude);var heightString = cartographic.height;tempPoints.push({ lon: longitudeString, lat: latitudeString ,hei:heightString});floatingPoint = viewer.entities.add({name : '多边形面积',position : positions[positions.length - 1],         point : {pixelSize : 5,color : Cesium.Color.RED,outlineColor : Cesium.Color.WHITE,outlineWidth : 2,heightReference:Cesium.HeightReference.none }}); },Cesium.ScreenSpaceEventType.LEFT_CLICK);handler.setInputAction(function(movement){handler.destroy();positions.pop();//tempPoints.pop();viewer_g.entities.remove(floatingPoint);tooltip.style.display = "none";//在三维场景中添加点// var cartographic = Cesium.Cartographic.fromCartesian(positions[positions.length - 1]);// var longitudeString = Cesium.Math.toDegrees(cartographic.longitude);// var latitudeString = Cesium.Math.toDegrees(cartographic.latitude);// var heightString = cartographic.height;// tempPoints.push({ lon: longitudeString, lat: latitudeString ,hei:heightString});var textArea = getArea(tempPoints) + "平方公里";viewer.entities.add({name : '多边形面积',position : positions[positions.length - 1],// point : {//     pixelSize : 5,//    color : Cesium.Color.RED,//     outlineColor : Cesium.Color.WHITE,//    outlineWidth : 2,//     heightReference:Cesium.HeightReference.CLAMP_TO_GROUND // },label : {text : textArea,font : '18px sans-serif',fillColor : Cesium.Color.GOLD,style: Cesium.LabelStyle.FILL_AND_OUTLINE,outlineWidth : 2,verticalOrigin : Cesium.VerticalOrigin.BOTTOM,pixelOffset : new Cesium.Cartesian2(20, -40)}});     }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK ); var radiansPerDegree = Math.PI / 180.0;//角度转化为弧度(rad) var degreesPerRadian = 180.0 / Math.PI;//弧度转化为角度//计算多边形面积function getArea(points) {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(positions[j], positions[0]);var dis_temp2 = distance(positions[k], positions[0]);res += dis_temp1 * dis_temp2 * Math.sin(totalAngle) / 2;// console.log(res);}return Math.abs((res / 1000000.0).toFixed(4));}/*角度*/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) {var lat1 = from.lat * radiansPerDegree;var lon1 = from.lon * radiansPerDegree;var lat2 = to.lat * radiansPerDegree;var lon2 = to.lon * radiansPerDegree;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;} var PolygonPrimitive = (function(){function _(positions){this.options = {name:'多边形',polygon : {hierarchy : [],perPositionHeight : true,material : Cesium.Color.GREEN.withAlpha(0.5)}};this.hierarchy = positions;this._init();}_.prototype._init = function(){var _self = this;var _update = function(){return _self.hierarchy;};//实时更新polygon.hierarchythis.options.polygon.hierarchy = new Cesium.CallbackProperty(_update,false);viewer.entities.add(this.options);};return _;})();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;}
};

参考: https://www.cnblogs.com/xiexinxinlove/p/3708147.html

Cesium之【空间面积】测量相关推荐

  1. cesium面积计算_cesium-长度测量和面积测量

    import Cesium from "cesium/Cesium"; import widgets from "cesium/Widgets/widgets.css&q ...

  2. 智能密集型仓储货架自动化立体库|四向穿梭式货架对于仓库空间面积上有什么要求?

    穿梭式货架是智能货架的一种,同时也是目前智能货架中常用的货架类型,更是一种高端的立体化的存储设备,因为节省人工运作成本.存储密度高.存储量大,还可以实现仓储自动化人等优点受到众多企业的青睐.正是因为它 ...

  3. cesium添加淹没分析测量面积

    var viewer=ysc.createNormalCesium("cesiumContainer",{         //添加cesium中的基础属性         inf ...

  4. cesium 测距 测面积 测高

    /*** 测量线段*/function MeasureTools(viewer) {var entityCollection = [];var handler=new Cesium.ScreenSpa ...

  5. Cesium专栏-空间分析之坡向分析(附源码下载)

    Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...

  6. Cesium专栏-空间分析之剖面分析(附源码下载)

    Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...

  7. Cesium专栏-空间分析之坡度分析(附源码下载)

    Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...

  8. Science重磅 | 新技术Slide-seq能以高空间分辨率测量全基因组的表达情况

    原文地址:https://science.sciencemag.org/content/363/6434/1463.full Slide-seq: A scalable technology for ...

  9. 百米空间尺寸测量|国产激光跟踪仪大显身手

    经过长期的经验积累,激光跟踪仪集激光干涉测距技术.光电检测技术.精密机械技术.计算机及控制技术.现代数值计算理论于一体,突破了百米的测量范围.毫秒级的测量时间.微米级的测量精度以及动态实时跟踪测量等各 ...

  10. cesium进行模型高度测量的代码片段

    主要参考 https://sandcastle.cesium.com/index.html?src=Picking.html export function monitorMove() {const ...

最新文章

  1. 006_Maven仓库
  2. numpy.random.uniform()
  3. Zynq器件的时钟系统
  4. 中国互联网发展的两个瓶颈
  5. 30 多年的软件经验,总结出 10 个编写出更好代码的技巧
  6. Cocos2dx开发之锚点
  7. .NET Core跨平台图形处理库ImageSharp
  8. ROS学习笔记3(创建一个ROS Package)
  9. 解决vim编译后的乱码问题
  10. [外包]!采用asp.net core 快速构建小型创业公司后台管理系统(四.quartz 简单配置使用)...
  11. 用回溯法求子集和的c++代码
  12. sqoop从mysql导入hive字符集的问题乱码问题
  13. 20155207 2016-2017-2 《Java程序设计》第七周学习总结
  14. C/C++[算法入门]
  15. 为你的Android应用构建窗口小部件(App Widget)
  16. 相关系数excel_利用【相关系数】理解数据之间的关系
  17. Python爬取图片显示似乎不支持此文件格式
  18. 【Nacos】Nacos注册中心的使用
  19. excel根据空格把数据分列
  20. 《用户至上:用户研究方法与实践(原书第2版)》一1.1 什么是用户体验

热门文章

  1. 基于STM32单片机多功能电梯系统设计(论文原理图程序)
  2. python词云词频分析_Python数据挖掘:WordCloud词云配置过程及词频分析
  3. js动画 无缝轮播 进度条 文字页面展示 div弹窗遮罩效果
  4. 900行c语言贪吃蛇,挑战CMD版贪吃蛇,能超过我的分算你赢
  5. C++软件调试与异常排查从入门到精通系列汇总
  6. Python爬虫 - 理解深度优先和广度优先
  7. Ubuntu下LimeSDR-USB或LimeSDR Mini使用说明
  8. 跳一跳html小游戏代码,100 行代码实现『跳一跳』辅助
  9. TCP segment of a reassembled PDU,就这么简单!
  10. 听刘万祥老师讲“竖向折线图”、“点图”画法