Cesium【空间距离】量算

网上提供了地表测距方法,这里供上【空间】测距的方法:

两者区别是前者只是两点间的水平距离,仅考虑到【经纬度】,后者还考虑到了【高度】。 

/******************************************* */
//测量空间直线距离 
/******************************************* */
var measureLineSpace = function (viewer,handler) {
    handler = new Cesium.ScreenSpaceEventHandler(viewer.scene._imageryLayerCollection);
    var positions = [];
    var poly = null;
    var tooltip = document.getElementById("toolTip");
    var distance = 0;
	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(poly)) { poly = new PolyLinePrimitive(positions); } else { positions.pop(); // cartesian.y += (1 + Math.random()); positions.push(cartesian); } distance = getSpaceDistance(positions); // console.log("distance: " + distance); // tooltip.innerHTML='

'+distance+'米

'; } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); handler.setInputAction(function (movement) { tooltip.style.display = "none"; // cartesian = viewer.scene.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid); cartesian = viewer.scene.pickPosition(movement.position); if (positions.length == 0) { positions.push(cartesian.clone()); } positions.push(cartesian); //在三维场景中添加Label // var cartographic = Cesium.Cartographic.fromCartesian(cartesian); var textDisance = distance + "米"; // console.log(textDisance + ",lng:" + cartographic.longitude/Math.PI*180.0); floatingPoint = viewer.entities.add({ name: '空间直线距离', // position: Cesium.Cartesian3.fromDegrees(cartographic.longitude / Math.PI * 180, cartographic.latitude / Math.PI * 180,cartographic.height), position:positions[positions.length - 1], point: { pixelSize: 5, color: Cesium.Color.RED, outlineColor: Cesium.Color.WHITE, outlineWidth: 2, heightReference:Cesium.HeightReference.NONE }, label: { text: textDisance, 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, -20), heightReference:Cesium.HeightReference.NONE } }); }, Cesium.ScreenSpaceEventType.LEFT_CLICK); handler.setInputAction(function (movement) { handler.destroy();//关闭事件句柄 positions.pop();//最后一个点无效 viewer_g.entities.remove(floatingPoint); tooltip.style.display = "none"; }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK); var PolyLinePrimitive = (function () { function _(positions) { this.options = { name: '直线', polyline: { show: true, positions: [], material: Cesium.Color.CHARTREUSE , width: 2 } }; this.positions = positions; this._init(); } _.prototype._init = function () { var _self = this; var _update = function () { return _self.positions; }; //实时更新polyline.positions this.options.polyline.positions = new Cesium.CallbackProperty(_update, false); viewer.entities.add(this.options); }; return _; })(); }; //空间两点距离计算函数 function getSpaceDistance(positions) { var distance = 0; for (var i = 0; i < positions.length - 1; i++) { var point1cartographic = Cesium.Cartographic.fromCartesian(positions[i]); var point2cartographic = Cesium.Cartographic.fromCartesian(positions[i+1]); /**根据经纬度计算出距离**/ 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)); distance = distance + s; } return distance.toFixed(2); }

Cesium【空间距离】量算_第1张图片

Cesium【空间距离】量算_第2张图片

 

你可能感兴趣的:(Cesium,JavaScript,webGIS)