cesium面积计算_Cesium之【空间面积】测量

本文介绍了使用Cesium进行空间面积测量的方法,包括创建ScreenSpaceEventHandler、动态添加点到平面并计算多边形面积,提供了从点击开始到右击结束的面积测量功能,并显示测量结果。
摘要由CSDN通过智能技术生成

Cesium之【空间面积】测量

发布时间:2018-08-22 17:23,

浏览次数:1472

, 标签:

Cesium

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

//****************************测量空间面积************************************************//

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 ='

单击开始,右击结束

'; 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='

'+distance+'米

'; }

},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.hierarchy

this.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是一个用于创建地球上交互式3D地图的开源JavaScript库。要使用Cesium进行面积测量,您可以通过以下步骤实现: 1. 首先,您需要在网页中引入Cesium的库文件。您可以从Cesium的官方网站(https://cesium.com/)下载库文件,然后将其包含在您的HTML文件中。 2. 在您的网页中创建一个Cesium Viewer对象,该对象将用于显示地球和进行测量操作。您可以通过以下代码来创建一个基本的Cesium Viewer: ``` var viewer = new Cesium.Viewer('cesiumContainer'); ``` 这里,'cesiumContainer'是一个HTML元素的ID,它将用于承载Cesium Viewer。 3. 接下来,您可以使用Cesium测量工具来测量面积。您可以使用Cesium的实体(Entity)对象来创建一个多边形实体,然后通过调用Cesium的Measurements API来获取多边形实体的面积。 以下是一个简单的示例代码,展示了如何使用Cesium测量多边形的面积: ``` var polygon = new Cesium.Entity({ polygon: { hierarchy: ... // 设置多边形的顶点 } }); var area = Cesium.Measurements.computeArea(polygon); console.log('面积:', area); ``` 在上面的代码中,您需要设置多边形的顶点(hierarchy)以定义要测量的多边形形状。然后,通过调用`Cesium.Measurements.computeArea()`方法,您可以获取多边形的面积。 这只是一个简单的示例,您可以根据您的需求进行更复杂的操作和界面设计。希望这能帮助到您!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值