Cesium【空间距离】量算

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

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

/******************************************* */
//测量空间直线距离 
/******************************************* */
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 = '<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(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='<p>'+distance+'米</p>';
        }
    }, 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);    
  }