//from cdxiaodao cesium.js
|
//measure or survey point, height, distance, area
|
(function (window) {
|
'use strict';
|
|
function define_CesiumSurvey() {
|
//Main object
|
var CesiumSurvey = {};
|
var handler;
|
|
//Get 3D position String when left_click
|
CesiumSurvey.getPosition = function(viewer){
|
handler = handler && handler.destroy();
|
handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
|
var resultStr;
|
handler.setInputAction(function(movement){
|
var cp = viewer.scene.pickPosition(movement.position);
|
var pickedPositionString = cp.toString();
|
//获取地理坐标(经度、纬度、高程)
|
var cartographic = Cesium.Cartographic.fromCartesian(cp);
|
var longitudeString = Cesium.Math.toDegrees(cartographic.longitude);
|
var latitudeString = Cesium.Math.toDegrees(cartographic.latitude);
|
var heightString = cartographic.height;
|
var getResult = pickedPositionString+'\r\n'+
|
'======================'+'\r\n'+
|
'经度:'+longitudeString+'\r\n'+
|
'纬度:'+latitudeString+'\r\n'+
|
'高程:'+heightString+'\r\n'+
|
'======================'+'\r\n';
|
resultStr = longitudeString+","+latitudeString+","+heightString;
|
alert(getResult);
|
},Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
handler.setInputAction(function(){
|
handler = handler && handler.destroy();
|
},Cesium.ScreenSpaceEventType.RIGHT_CLICK);
|
return resultStr;
|
};
|
|
//Get height String from 3dtiles to Mouse's position
|
CesiumSurvey.measureHeight = function (viewer){
|
handler = handler && handler.destroy();
|
if((viewer.entities.getById('measureHeightLineEntity')!==undefined)){
|
viewer.entities.removeById('measureHeightLineEntity');
|
}
|
if((viewer.entities.getById('heightPlaneEntity')!==undefined)){
|
viewer.entities.removeById('heightPlaneEntity');
|
}
|
if((viewer.entities.getById('heightLabelEntity')!==undefined)){
|
viewer.entities.removeById('heightLabelEntity');
|
}
|
var isFirst = true;
|
var firstPosition;
|
var secondPosition;
|
var previousPosition;
|
var heightLineEntity = viewer.entities.add({
|
id : 'measureHeightLineEntity',
|
polyline : {
|
followSurface : false,
|
width : 3,
|
material : Cesium.Color.RED,
|
show : true
|
}
|
});
|
var heightPlaneEntity = viewer.entities.add({
|
id : 'heightPlaneEntity',
|
ellipse : {
|
outline : true,
|
show : false
|
}
|
});
|
var heightLabelEntity = viewer.entities.add({
|
id : 'heightLabelEntity',
|
label : {
|
show : false,
|
verticalOrigin : Cesium.VerticalOrigin.BOTTOM,
|
horizontalOrigin : Cesium.HorizontalOrigin.LEFT,
|
font : '16px Helvetica',
|
fillColor : Cesium.Color.YELLOW,
|
outlineColor : Cesium.Color.BLACK,
|
outlineWidth : 1,
|
style : Cesium.LabelStyle.FILL_AND_OUTLINE,
|
showBackground: true,
|
backgroundColor: new Cesium.Color(0, 0, 1, 0.8),
|
}
|
});
|
handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
|
handler.setInputAction(function(movement){
|
if(isFirst){
|
firstPosition = viewer.scene.pickPosition(movement.position);
|
var cartographic = Cesium.Cartographic.fromCartesian(firstPosition);
|
var height = cartographic.height;//模型高度
|
if(Number(height)<0){
|
var ray = viewer.camera.getPickRay(movement.position);
|
firstPosition = viewer.scene.globe.pick(ray,viewer.scene);
|
}
|
isFirst = false;
|
}else{
|
secondPosition = viewer.scene.pickPosition(movement.position);
|
var cartographic = Cesium.Cartographic.fromCartesian(secondPosition);
|
var height = cartographic.height;//模型高度
|
if(Number(height)<0){
|
var ray = viewer.camera.getPickRay(movement.position);
|
secondPosition = viewer.scene.globe.pick(ray,viewer.scene);
|
}
|
if(secondPosition){
|
previousPosition = secondPosition.clone();
|
}else{
|
secondPosition = previousPosition.clone();
|
}
|
var centerPosition = new Cesium.Cartesian3(
|
firstPosition.x * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition),
|
firstPosition.y * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition),
|
firstPosition.z * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition)
|
);
|
heightLineEntity.polyline.positions = [firstPosition,centerPosition];
|
heightPlaneEntity.position = centerPosition;
|
var cartographicCenter = Cesium.Cartographic.fromCartesian(centerPosition);
|
var cartographicFirst = Cesium.Cartographic.fromCartesian(firstPosition);
|
heightPlaneEntity.ellipse.height = cartographicCenter.height;
|
heightPlaneEntity.ellipse.material = (cartographicCenter.height>cartographicFirst.height)>0?Cesium.Color.YELLOW.withAlpha(0.5):Cesium.Color.DEEPPINK.withAlpha(0.2);
|
heightPlaneEntity.ellipse.semiMinorAxis = Cesium.Cartesian3.distance(centerPosition,secondPosition);
|
heightPlaneEntity.ellipse.semiMajorAxis = heightPlaneEntity.ellipse.semiMinorAxis;
|
heightPlaneEntity.ellipse.show = true;
|
heightLabelEntity.position = (cartographicCenter.height>cartographicFirst.height)>0?centerPosition:firstPosition;
|
heightLabelEntity.label.show = true;
|
resultStr = cartographicCenter.height-cartographicFirst.height;
|
heightLabelEntity.label.text = '高度:'+resultStr.toFixed(2)+'米';
|
var camera = viewer.scene.camera;
|
heightLabelEntity.label.eyeOffset = new Cesium.Cartesian3(0.0, 0.5, 0.0);
|
handler = handler && handler.destroy();
|
}
|
},Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
var resultStr;
|
handler.setInputAction(function(movement){
|
if(!isFirst){
|
secondPosition = viewer.scene.pickPosition(movement.endPosition);
|
var cartographic = Cesium.Cartographic.fromCartesian(secondPosition);
|
var height = cartographic.height;//模型高度
|
if(Number(height)<0){
|
var ray = viewer.camera.getPickRay(movement.endPosition);
|
secondPosition = viewer.scene.globe.pick(ray,viewer.scene);
|
}
|
if(secondPosition){
|
previousPosition = secondPosition.clone();
|
}else{
|
secondPosition = previousPosition.clone();
|
}
|
var centerPosition = new Cesium.Cartesian3(
|
firstPosition.x * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition),
|
firstPosition.y * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition),
|
firstPosition.z * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition)
|
);
|
heightLineEntity.polyline.positions = [firstPosition,centerPosition];
|
heightPlaneEntity.position = centerPosition;
|
var cartographicCenter = Cesium.Cartographic.fromCartesian(centerPosition);
|
var cartographicFirst = Cesium.Cartographic.fromCartesian(firstPosition);
|
heightPlaneEntity.ellipse.height = cartographicCenter.height;
|
heightPlaneEntity.ellipse.material = (cartographicCenter.height>cartographicFirst.height)>0?Cesium.Color.YELLOW.withAlpha(0.5):Cesium.Color.DEEPPINK.withAlpha(0.2);
|
heightPlaneEntity.ellipse.semiMinorAxis = Cesium.Cartesian3.distance(centerPosition,secondPosition);
|
heightPlaneEntity.ellipse.semiMajorAxis = heightPlaneEntity.ellipse.semiMinorAxis;
|
heightPlaneEntity.ellipse.show = true;
|
heightLabelEntity.position = (cartographicCenter.height>cartographicFirst.height)>0?centerPosition:firstPosition;
|
heightLabelEntity.label.show = true;
|
resultStr = cartographicCenter.height-cartographicFirst.height;
|
heightLabelEntity.label.text = '高度:'+resultStr.toFixed(2)+'米';
|
var camera = viewer.scene.camera;
|
heightLabelEntity.label.eyeOffset = new Cesium.Cartesian3(0.0, 0.5, 0.0);
|
}
|
},Cesium.ScreenSpaceEventType.MOUSE_MOVE);
|
handler.setInputAction(function(){
|
handler = handler && handler.destroy();
|
},Cesium.ScreenSpaceEventType.RIGHT_CLICK);
|
return resultStr;
|
};
|
|
//Get height String from 3dtiles to Mouse's position(三角尺)
|
CesiumSurvey.measureHeightAngle = function (viewer){
|
handler = handler && handler.destroy();
|
if((viewer.entities.getById('measureHeightAngleLineEntity')!==undefined)){
|
viewer.entities.removeById('measureHeightAngleLineEntity');
|
}
|
if((viewer.entities.getById('heightAngleEntity')!==undefined)){
|
viewer.entities.removeById('heightAngleEntity');
|
}
|
if((viewer.entities.getById('heighthriEntity')!==undefined)){
|
viewer.entities.removeById('heighthriEntity');
|
}
|
if((viewer.entities.getById('heightLabelAngleEntity')!==undefined)){
|
viewer.entities.removeById('heightLabelAngleEntity');
|
}
|
var isFirst = true;
|
var firstPosition;
|
var secondPosition;
|
var previousPosition;
|
var heightLineEntity = viewer.entities.add({
|
id : 'measureHeightAngleLineEntity',
|
polyline : {
|
followSurface : false,
|
width : 3,
|
material : Cesium.Color.RED,
|
show : true
|
}
|
});
|
var heightAngleEntity = viewer.entities.add({
|
id : 'heightAngleEntity',
|
polyline : {
|
width : 3,
|
material : Cesium.Color.RED,
|
show : true
|
}
|
});
|
var heighthriEntity = viewer.entities.add({
|
id : 'heighthriEntity',
|
polyline : {
|
width : 3,
|
material : Cesium.Color.RED,
|
show : true
|
}
|
});
|
var heightLabelEntity = viewer.entities.add({
|
id : 'heightLabelAngleEntity',
|
label : {
|
show : false,
|
verticalOrigin : Cesium.VerticalOrigin.BOTTOM,
|
horizontalOrigin : Cesium.HorizontalOrigin.LEFT,
|
font : '16px Helvetica',
|
fillColor : Cesium.Color.YELLOW,
|
outlineColor : Cesium.Color.BLACK,
|
outlineWidth : 1,
|
style : Cesium.LabelStyle.FILL_AND_OUTLINE,
|
showBackground: true,
|
backgroundColor: new Cesium.Color(0, 0, 1, 0.8),
|
}
|
});
|
handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
|
handler.setInputAction(function(movement){
|
if(isFirst){
|
firstPosition = viewer.scene.pickPosition(movement.position);
|
var cartographic = Cesium.Cartographic.fromCartesian(firstPosition);
|
var height = cartographic.height;//模型高度
|
if(Number(height)<0){
|
var ray = viewer.camera.getPickRay(movement.position);
|
firstPosition = viewer.scene.globe.pick(ray,viewer.scene);
|
}
|
isFirst = false;
|
}else{
|
secondPosition = viewer.scene.pickPosition(movement.position);
|
var cartographic = Cesium.Cartographic.fromCartesian(secondPosition);
|
var height = cartographic.height;//模型高度
|
if(Number(height)<0){
|
var ray = viewer.camera.getPickRay(movement.position);
|
secondPosition = viewer.scene.globe.pick(ray,viewer.scene);
|
}
|
if(secondPosition){
|
previousPosition = secondPosition.clone();
|
}else{
|
secondPosition = previousPosition.clone();
|
}
|
var centerPosition = new Cesium.Cartesian3(
|
firstPosition.x * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition),
|
firstPosition.y * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition),
|
firstPosition.z * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition)
|
);
|
heightLineEntity.polyline.positions = [firstPosition,centerPosition];
|
heightAngleEntity.polyline.positions = [firstPosition,secondPosition];
|
heighthriEntity.polyline.positions = [centerPosition,secondPosition];
|
var cartographicCenter = Cesium.Cartographic.fromCartesian(centerPosition);
|
var cartographicFirst = Cesium.Cartographic.fromCartesian(firstPosition);
|
heightAngleEntity.polyline.material = (cartographicCenter.height>cartographicFirst.height)>0?Cesium.Color.RED:Cesium.Color.YELLOW;
|
heighthriEntity.polyline.material = (cartographicCenter.height>cartographicFirst.height)>0?Cesium.Color.RED:Cesium.Color.YELLOW;
|
heightLabelEntity.position = (cartographicCenter.height>cartographicFirst.height)>0?centerPosition:firstPosition;
|
heightLabelEntity.label.show = true;
|
resultStr = cartographicCenter.height-cartographicFirst.height;
|
var resulthoriStr = Cesium.Cartesian3.distance(centerPosition, secondPosition);
|
var resultangleStr = Cesium.Cartesian3.distance(firstPosition, secondPosition);
|
heightLabelEntity.label.text = '高度:'+resultStr.toFixed(2)+'米\n'+"水平:"+resulthoriStr.toFixed(2)+'米\n'+"直线:"+resultangleStr.toFixed(2)+"米";
|
var camera = viewer.scene.camera;
|
heightLabelEntity.label.eyeOffset = new Cesium.Cartesian3(0.0, 0.5, 0.0);
|
handler = handler && handler.destroy();
|
}
|
},Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
var resultStr;
|
handler.setInputAction(function(movement){
|
if(!isFirst){
|
secondPosition = viewer.scene.pickPosition(movement.endPosition);
|
var cartographic = Cesium.Cartographic.fromCartesian(secondPosition);
|
var height = cartographic.height;//模型高度
|
if(Number(height)<0){
|
var ray = viewer.camera.getPickRay(movement.endPosition);
|
secondPosition = viewer.scene.globe.pick(ray,viewer.scene);
|
}
|
if(secondPosition){
|
previousPosition = secondPosition.clone();
|
}else{
|
secondPosition = previousPosition.clone();
|
}
|
var centerPosition = new Cesium.Cartesian3(
|
firstPosition.x * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition),
|
firstPosition.y * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition),
|
firstPosition.z * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition)
|
);
|
heightLineEntity.polyline.positions = [firstPosition,centerPosition];
|
heightAngleEntity.polyline.positions = [firstPosition,secondPosition];
|
heighthriEntity.polyline.positions = [centerPosition,secondPosition];
|
var cartographicCenter = Cesium.Cartographic.fromCartesian(centerPosition);
|
var cartographicFirst = Cesium.Cartographic.fromCartesian(firstPosition);
|
heightAngleEntity.polyline.material = (cartographicCenter.height>cartographicFirst.height)>0?Cesium.Color.RED:Cesium.Color.YELLOW;
|
heighthriEntity.polyline.material = (cartographicCenter.height>cartographicFirst.height)>0?Cesium.Color.RED:Cesium.Color.YELLOW;
|
heightLabelEntity.position = (cartographicCenter.height>cartographicFirst.height)>0?centerPosition:firstPosition;
|
heightLabelEntity.label.show = true;
|
resultStr = cartographicCenter.height-cartographicFirst.height;
|
var resulthoriStr = Cesium.Cartesian3.distance(centerPosition, secondPosition);
|
var resultangleStr = Cesium.Cartesian3.distance(firstPosition, secondPosition);
|
heightLabelEntity.label.text = '高度:'+resultStr.toFixed(2)+'米\n'+"水平:"+resulthoriStr.toFixed(2)+'米\n'+"直线:"+resultangleStr.toFixed(2)+"米";
|
var camera = viewer.scene.camera;
|
heightLabelEntity.label.eyeOffset = new Cesium.Cartesian3(0.0, 0.5, 0.0);
|
}
|
},Cesium.ScreenSpaceEventType.MOUSE_MOVE);
|
handler.setInputAction(function(){
|
handler = handler && handler.destroy();
|
},Cesium.ScreenSpaceEventType.RIGHT_CLICK);
|
return resultStr;
|
};
|
|
//Get distence String between first left_click and second left_click
|
CesiumSurvey.measureDist = function(viewer,type){
|
handler = handler && handler.destroy();
|
if((viewer.entities.getById('dynamicLineEntity')!==undefined)){
|
viewer.entities.removeById('dynamicLineEntity');
|
}
|
if((viewer.entities.getById('dynamicLineGroundEntity')!==undefined)){
|
viewer.entities.removeById('dynamicLineGroundEntity');
|
}
|
if((viewer.entities.getById('measureLineEntity')!==undefined)){
|
viewer.entities.removeById('measureLineEntity');
|
}
|
if((viewer.entities.getById('measureLineGroundEntity')!==undefined)){
|
viewer.entities.removeById('measureLineGroundEntity');
|
}
|
if((viewer.entities.getById('distLabelEntity')!==undefined)){
|
viewer.entities.removeById('distLabelEntity');
|
}
|
var isFirst = true;//是否为第一个点
|
var previousPosition;//前一个点的坐标
|
var currentPosition;//当前点坐标
|
var measureValue = 0.0;
|
//随鼠标移动的标签entity
|
var distLabelEntity = viewer.entities.add({
|
id : 'distLabelEntity',
|
label : {
|
show : false,
|
verticalOrigin : Cesium.VerticalOrigin.BOTTOM,
|
horizontalOrigin : Cesium.HorizontalOrigin.LEFT,
|
font : '16px Helvetica',
|
fillColor : Cesium.Color.YELLOW,
|
outlineColor : Cesium.Color.BLACK,
|
outlineWidth : 1,
|
style : Cesium.LabelStyle.FILL_AND_OUTLINE,
|
showBackground: true,
|
backgroundColor: new Cesium.Color(0, 0, 1, 0.8),
|
}
|
});
|
var show3d = true,show2d = false;
|
if(type=="two"){
|
show2d = true;
|
show3d = false;
|
}
|
//前一个点与鼠标连线的entity
|
var dynamicLineEntity = viewer.entities.add({
|
id : 'dynamicLineEntity',
|
polyline : {
|
followSurface : false,
|
width : 3,
|
material : Cesium.Color.YELLOW,
|
show : show3d
|
}
|
});
|
var dynamicLineGroundEntity = viewer.entities.add({
|
id : 'dynamicLineGroundEntity',
|
polyline : {
|
clampToGround : true,
|
width : 3,
|
material : Cesium.Color.YELLOW,
|
show : show2d,
|
}
|
});
|
//已输入的线段的entity
|
var measureLineEntity = viewer.entities.add({
|
id : 'measureLineEntity',
|
polyline : {
|
followSurface : false,
|
width : 3,
|
material : Cesium.Color.RED,
|
show : show3d
|
}
|
});
|
var measureLineGroundEntity = viewer.entities.add({
|
id : 'measureLineGroundEntity',
|
polyline : {
|
clampToGround : true,
|
width : 3,
|
material : Cesium.Color.RED,
|
show : show2d
|
}
|
});
|
var measureLinePositonsArray = [];//存储已量测的线段的折点
|
handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
|
handler.setInputAction(function(movement){
|
if(isFirst){
|
previousPosition = viewer.scene.pickPosition(movement.position);
|
var cartographic = Cesium.Cartographic.fromCartesian(previousPosition);
|
var height = cartographic.height;//模型高度
|
if(Number(height)<0){
|
var ray = viewer.camera.getPickRay(movement.position);
|
previousPosition = viewer.scene.globe.pick(ray,viewer.scene);
|
}
|
var tmp1 = previousPosition.clone();
|
measureValue = 0.0;
|
isFirst = false;
|
measureLinePositonsArray.push(tmp1);
|
}else{
|
currentPosition = viewer.scene.pickPosition(movement.position);
|
var cartographic = Cesium.Cartographic.fromCartesian(currentPosition);
|
var height = cartographic.height;//模型高度
|
if(Number(height)<0){
|
var ray = viewer.camera.getPickRay(movement.position);
|
currentPosition = viewer.scene.globe.pick(ray,viewer.scene);
|
}
|
var tmp2 = currentPosition.clone();
|
measureLinePositonsArray.push(tmp2);
|
measureLineEntity.polyline.positions = measureLinePositonsArray;
|
measureLineGroundEntity.polyline.positions = measureLinePositonsArray;
|
measureValue = measureValue + Cesium.Cartesian3.distance(currentPosition, previousPosition);
|
previousPosition = currentPosition.clone();
|
}
|
},Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
var measureValueShow;
|
handler.setInputAction(function(movement){
|
//move事件监听
|
if(!isFirst){
|
//console.log('move,不是第一个点');
|
//获取当前点的坐标
|
currentPosition = viewer.scene.pickPosition(movement.endPosition);
|
var cartographic = Cesium.Cartographic.fromCartesian(currentPosition);
|
var height = cartographic.height;//模型高度
|
if(Number(height)<0){
|
var ray = viewer.camera.getPickRay(movement.endPosition);
|
currentPosition = viewer.scene.globe.pick(ray,viewer.scene);
|
}
|
if(currentPosition){
|
distLabelEntity.position = currentPosition;
|
distLabelEntity.label.show = true;
|
measureValueShow = measureValue+Cesium.Cartesian3.distance(currentPosition, previousPosition);
|
distLabelEntity.label.text = '距离:'+ measureValueShow.toFixed(2)+'米';
|
var camera = viewer.scene.camera;
|
distLabelEntity.label.eyeOffset = new Cesium.Cartesian3(0.0, 1, 0.0);
|
dynamicLineEntity.polyline.positions = [previousPosition,currentPosition];
|
dynamicLineGroundEntity.polyline.positions = [previousPosition,currentPosition];
|
}
|
}
|
},Cesium.ScreenSpaceEventType.MOUSE_MOVE);
|
handler.setInputAction(function(){
|
//move事件监听
|
handler = handler && handler.destroy();
|
},Cesium.ScreenSpaceEventType.RIGHT_CLICK);
|
return measureValueShow;
|
};
|
|
//Get area string by dynamic polygon on earth
|
var pointArr = [];
|
CesiumSurvey.measureArea = function(viewer){
|
var measureAreaValue = 0.0;
|
var activeShapePoints = [];
|
handler = handler && handler.destroy();
|
if((viewer.entities.getById('areaLabelEntity')!==undefined)){
|
viewer.entities.removeById('areaLabelEntity');
|
}
|
if((viewer.entities.getById('areaEntity')!==undefined)){
|
viewer.entities.removeById('areaEntity');
|
}
|
for (var i = 0; i < pointArr.length; i++) {
|
viewer.entities.remove(pointArr[i]);
|
}
|
var areaLabelEntity = viewer.entities.add({
|
id : 'areaLabelEntity',
|
label : {
|
show : false,
|
verticalOrigin : Cesium.VerticalOrigin.BOTTOM,
|
horizontalOrigin : Cesium.HorizontalOrigin.LEFT,
|
font : '16px Helvetica',
|
fillColor : Cesium.Color.YELLOW,
|
outlineColor : Cesium.Color.BLACK,
|
outlineWidth : 1,
|
style : Cesium.LabelStyle.FILL_AND_OUTLINE,
|
showBackground: true,
|
backgroundColor: new Cesium.Color(0, 0, 1, 0.8),
|
}
|
});
|
function createPoint(worldPosition) {
|
pointArr.push(viewer.entities.add({
|
position : worldPosition,
|
point : {
|
color : Cesium.Color.RED,
|
pixelSize : 10,
|
outlineWidth : 1,
|
outlineColor : Cesium.Color.WHITE,
|
disableDepthTestDistance : 10000
|
}
|
}));
|
}
|
function drawPolygon(){
|
if((viewer.entities.getById('areaEntity')!==undefined)){
|
viewer.entities.removeById('areaEntity');
|
}
|
viewer.entities.add({
|
id: 'areaEntity',
|
polygon: {
|
hierarchy: new Cesium.PolygonHierarchy(activeShapePoints),
|
/*new Cesium.CallbackProperty(function () {
|
return activeShapePoints;
|
}, false),*/
|
material: new Cesium.ColorMaterialProperty(Cesium.Color.YELLOW.withAlpha(0.6)),
|
classificationType : Cesium.ClassificationType.BOTH,
|
outline: true,
|
outlineColor: Cesium.Color.WHITE
|
}
|
});
|
}
|
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 radiansPerDegree = Cesium.Math.PI / 180.0;//角度转化为弧度(rad)
|
var degreesPerRadian = 180.0 / Cesium.Math.PI;//弧度转化为角度
|
//计算多边形面积
|
function getArea(points) {
|
var res = 0.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[0], points[j], points[k]);
|
var dis_temp1 = distance(activeShapePoints[0], activeShapePoints[j]);
|
var dis_temp2 = distance(activeShapePoints[0], activeShapePoints[k]);
|
var tmp = 0.5*dis_temp1 * dis_temp2 * Math.sin(totalAngle*radiansPerDegree) ;
|
res = res+tmp;
|
//console.log(res);
|
}
|
return Math.abs(res.toFixed(1));//顺时针负,逆时针正
|
}
|
/*角度*/
|
function Angle(p1, p2, p3) {
|
var bearing12 = Bearing(p1, p2);
|
var bearing13 = Bearing(p1, p3);
|
var angle = bearing12 - bearing13;
|
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 += Cesium.Math.PI * 2.0;
|
}
|
angle = angle * degreesPerRadian;//角度
|
return angle;
|
}
|
//选点
|
handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
|
handler.setInputAction(function(movement){
|
var earthPosition = viewer.scene.pickPosition(movement.position);
|
//获取地理坐标(经度、纬度、高程)
|
var cartographic = Cesium.Cartographic.fromCartesian(earthPosition);
|
var height = cartographic.height;//模型高度
|
if(Number(height)<0){
|
var ray = viewer.camera.getPickRay(movement.position);
|
earthPosition = viewer.scene.globe.pick(ray,viewer.scene);
|
}
|
if (Cesium.defined(earthPosition)) {
|
activeShapePoints.push(earthPosition);
|
if(activeShapePoints.length>3){
|
drawPolygon();
|
}
|
createPoint(earthPosition);
|
}
|
},Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
//移动
|
handler.setInputAction(function(movement) {
|
var newPosition = viewer.scene.pickPosition(movement.endPosition);
|
var cartographic = Cesium.Cartographic.fromCartesian(newPosition);
|
var height = cartographic.height;//模型高度
|
if(Number(height)<0){
|
var ray = viewer.camera.getPickRay(movement.endPosition);
|
newPosition = viewer.scene.globe.pick(ray,viewer.scene);
|
}
|
activeShapePoints.pop();
|
activeShapePoints.push(newPosition);
|
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
|
//结束并计算
|
var areaResult;
|
handler.setInputAction(function(movement){
|
handler = handler && handler.destroy();
|
if(activeShapePoints.length >2){
|
var rightPosition = viewer.scene.pickPosition(movement.position);
|
var cartographic = Cesium.Cartographic.fromCartesian(rightPosition);
|
var height = cartographic.height;//模型高度
|
if(Number(height)<0){
|
var ray = viewer.camera.getPickRay(movement.position);
|
rightPosition = viewer.scene.globe.pick(ray,viewer.scene);
|
}
|
var tempPoints=[];
|
for(var pindex = 0;pindex<activeShapePoints.length;pindex++){
|
var cartographic = Cesium.Cartographic.fromCartesian(activeShapePoints[pindex].clone());
|
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});
|
}
|
drawPolygon();
|
areaResult = getArea(tempPoints);
|
areaLabelEntity.label.text = '面积:'+ areaResult +'平方米';
|
areaLabelEntity.position = rightPosition.clone();
|
areaLabelEntity.label.show = true;
|
var camera = viewer.scene.camera;
|
areaLabelEntity.label.eyeOffset = new Cesium.Cartesian3(0.0, 0.5, 0.0);
|
}
|
},Cesium.ScreenSpaceEventType.RIGHT_CLICK);
|
return areaResult;
|
};
|
|
var measurePointArr = [];
|
CesiumSurvey.measurePoint = function(viewer,img){
|
var poiResult;
|
handler = handler && handler.destroy();
|
handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
|
handler.setInputAction(function(movement){
|
//获取鼠标点击处的坐标
|
var cartesian = viewer.scene.pickPosition(movement.position);
|
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
|
var height = cartographic.height;//模型高度
|
if(Number(height)<0){
|
var ray = viewer.camera.getPickRay(movement.position);
|
cartesian = viewer.scene.globe.pick(ray,viewer.scene);
|
}
|
cartographic = Cesium.Cartographic.fromCartesian(cartesian);
|
height = cartographic.height;//地形高度
|
var lng = Cesium.Math.toDegrees(cartographic.longitude);
|
var lat = Cesium.Math.toDegrees(cartographic.latitude);
|
var heading = Cesium.Math.toDegrees(viewer.camera.heading);
|
var pitch = Cesium.Math.toDegrees(viewer.camera.pitch);
|
var roll = Cesium.Math.toDegrees(viewer.camera.roll);
|
poiResult = lng.toFixed(4)+"\u00B0"+"\n"+lat.toFixed(4)+"\u00B0"+"\n"+height.toFixed(1)+"米";
|
console.log(lng+','+lat+','+height+','+heading+','+pitch+','+roll);
|
var pinBuilder = new Cesium.PinBuilder();//创建cesium pin标签
|
var point;
|
if(img&&img!=''){
|
point = viewer.entities.add({
|
id : 'measurePointEntity'+new Date().getTime(),
|
position : cartesian.clone(),
|
billboard : {
|
image : img,
|
verticalOrigin : Cesium.VerticalOrigin.BOTTOM,
|
pixelOffset : new Cesium.Cartesian2(43.0, 0.0),
|
},
|
label : {
|
show : true,
|
verticalOrigin : Cesium.VerticalOrigin.BOTTOM,
|
horizontalOrigin : Cesium.HorizontalOrigin.CENTER,
|
font : 'bold 16px Helvetica',
|
fillColor : Cesium.Color.WHITE,
|
text : poiResult,
|
pixelOffset : new Cesium.Cartesian2(56.0, -126.0),
|
disableDepthTestDistance : 100000000,
|
}
|
});
|
}else{
|
point = viewer.entities.add({
|
id : 'measurePointEntity'+new Date().getTime(),
|
position : cartesian.clone(),
|
billboard : {
|
image : pinBuilder.fromText('测',Cesium.Color.RED,36).toDataURL(),
|
verticalOrigin : Cesium.VerticalOrigin.BOTTOM
|
},
|
label : {
|
show : true,
|
verticalOrigin : Cesium.VerticalOrigin.BOTTOM,
|
horizontalOrigin : Cesium.HorizontalOrigin.CENTER,
|
font : '16px sans-serif',
|
fillColor : Cesium.Color.YELLOW,
|
outlineColor : Cesium.Color.BLACK,
|
outlineWidth : 1,
|
style : Cesium.LabelStyle.FILL_AND_OUTLINE,
|
text : poiResult,
|
pixelOffset : new Cesium.Cartesian2(0.0, -14.0),
|
pixelOffsetScaleByDistance : new Cesium.NearFarScalar(1.5e2, 3.0, 1.5e7, 0.5),
|
backgroundColor: Cesium.Color.BLUE.withAlpha(0.8),
|
showBackground: true,
|
}
|
});
|
}
|
measurePointArr.push(point);
|
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
handler.setInputAction(function(movement){
|
handler = handler && handler.destroy();
|
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
|
return poiResult;
|
};
|
|
var mmhandler;
|
CesiumSurvey.measureMovePoint = function(viewer,resultid){
|
mmhandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
|
//移动
|
mmhandler.setInputAction(function(movement) {
|
var newPosition = viewer.scene.pickPosition(movement.endPosition);
|
if(newPosition!=undefined){
|
var cartographic = Cesium.Cartographic.fromCartesian(newPosition);
|
var height = cartographic.height;//模型高度
|
if(Number(height)<0){
|
var ray = viewer.camera.getPickRay(movement.endPosition);
|
newPosition = viewer.scene.globe.pick(ray,viewer.scene);
|
cartographic = Cesium.Cartographic.fromCartesian(newPosition);
|
}
|
height = cartographic.height;//地形高度
|
var lng = Cesium.Math.toDegrees(cartographic.longitude);
|
var lat = Cesium.Math.toDegrees(cartographic.latitude);
|
var camPoiR = viewer.camera.position;
|
var camcartographic = Cesium.Cartographic.fromCartesian(camPoiR);
|
var camheight = camcartographic.height;//地形高度
|
var camlng = Cesium.Math.toDegrees(camcartographic.longitude);
|
var camlat = Cesium.Math.toDegrees(camcartographic.latitude);
|
var heading = Cesium.Math.toDegrees(viewer.camera.heading);
|
var pitch = Cesium.Math.toDegrees(viewer.camera.pitch);
|
var roll = Cesium.Math.toDegrees(viewer.camera.roll);
|
var poiResult = lng.toFixed(4)+"\u00B0"+","+lat.toFixed(4)+"\u00B0"+","+height.toFixed(1)+"米"
|
document.getElementById(resultid).innerHTML = poiResult;
|
}
|
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
|
};
|
|
var cammmhandler;
|
CesiumSurvey.cammeasureMovePoint = function(viewer,camresultid){
|
cammmhandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
|
//移动
|
cammmhandler.setInputAction(function(movement) {
|
var camPoiR = viewer.camera.position;
|
var camcartographic = Cesium.Cartographic.fromCartesian(camPoiR);
|
var camheight = camcartographic.height;//地形高度
|
var camlng = Cesium.Math.toDegrees(camcartographic.longitude);
|
var camlat = Cesium.Math.toDegrees(camcartographic.latitude);
|
var heading = Cesium.Math.toDegrees(viewer.camera.heading);
|
var pitch = Cesium.Math.toDegrees(viewer.camera.pitch);
|
var roll = Cesium.Math.toDegrees(viewer.camera.roll);
|
var camResult = camlng.toFixed(4)+"\u00B0"+","+camlat.toFixed(4)+"\u00B0"+","+camheight.toFixed(1)+"米,"
|
+heading.toFixed(2)+"\u00B0"+","+pitch.toFixed(2)+"\u00B0"+","+roll.toFixed(1)+"\u00B0";
|
document.getElementById(camresultid).innerHTML = camResult;
|
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
|
};
|
|
//Clear measure result
|
CesiumSurvey.measureClear = function(viewer){
|
handler = handler && handler.destroy();
|
if((viewer.entities.getById('measureHeightLineEntity')!==undefined)){
|
viewer.entities.removeById('measureHeightLineEntity');
|
}
|
if((viewer.entities.getById('heightPlaneEntity')!==undefined)){
|
viewer.entities.removeById('heightPlaneEntity');
|
}
|
if((viewer.entities.getById('heightLabelEntity')!==undefined)){
|
viewer.entities.removeById('heightLabelEntity');
|
}
|
if((viewer.entities.getById('measureHeightAngleLineEntity')!==undefined)){
|
viewer.entities.removeById('measureHeightAngleLineEntity');
|
}
|
if((viewer.entities.getById('heightAngleEntity')!==undefined)){
|
viewer.entities.removeById('heightAngleEntity');
|
}
|
if((viewer.entities.getById('heighthriEntity')!==undefined)){
|
viewer.entities.removeById('heighthriEntity');
|
}
|
if((viewer.entities.getById('heightLabelAngleEntity')!==undefined)){
|
viewer.entities.removeById('heightLabelAngleEntity');
|
}
|
if((viewer.entities.getById('dynamicLineEntity')!==undefined)){
|
viewer.entities.removeById('dynamicLineEntity');
|
}
|
if((viewer.entities.getById('dynamicLineGroundEntity')!==undefined)){
|
viewer.entities.removeById('dynamicLineGroundEntity');
|
}
|
if((viewer.entities.getById('measureLineEntity')!==undefined)){
|
viewer.entities.removeById('measureLineEntity');
|
}
|
if((viewer.entities.getById('measureLineGroundEntity')!==undefined)){
|
viewer.entities.removeById('measureLineGroundEntity');
|
}
|
if((viewer.entities.getById('distLabelEntity')!==undefined)){
|
viewer.entities.removeById('distLabelEntity');
|
}
|
if((viewer.entities.getById('areaLabelEntity')!==undefined)){
|
viewer.entities.removeById('areaLabelEntity');
|
}
|
if((viewer.entities.getById('areaEntity')!==undefined)){
|
viewer.entities.removeById('areaEntity');
|
}
|
for (var i = 0; i < pointArr.length; i++) {
|
viewer.entities.remove(pointArr[i]);
|
}
|
if((viewer.entities.getById('measurePointEntity')!==undefined)){
|
viewer.entities.removeById('measurePointEntity');
|
}
|
for ( var i = 0; i < measurePointArr.length; i++) {
|
viewer.entities.remove(measurePointArr[i]);
|
}
|
//measurePointArr = [];
|
return true;
|
};
|
|
//shutdown handler
|
CesiumSurvey.clearHandler = function(){
|
handler = handler && handler.destroy();
|
};
|
|
//shutdown mmhandler
|
CesiumSurvey.clearMMHandler = function(){
|
mmhandler = mmhandler && mmhandler.destroy();
|
};
|
|
//shutdown cammmhandler
|
CesiumSurvey.clearCamMMHandler = function(){
|
cammmhandler = cammmhandler && cammmhandler.destroy();
|
};
|
|
return CesiumSurvey;
|
}
|
if (typeof(CesiumSurvey) === 'undefined') {
|
window.CesiumSurvey = define_CesiumSurvey();
|
} else {
|
console.log("CesiumSurvey already defined.");
|
}
|
})(window);
|