Cesium-Examples/examples/cesiumEx/MeasureTool.js
2025-03-11 17:51:04 +08:00

1348 lines
60 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @class {MeasureTool} 测量工具
* @param {viewer} viewer 三维视图
* @param {target} string 测量工具放置的div的id
* @param {classname} string 样式名
* @param {terrainProvider} terrain 地形
* @param {show} bool 是否显示界面
* */
class MeasureTool {
constructor(option) {
this.viewer = option.viewer;
this.terrainProvider = option.terrainProvider;
this.options = option;
var me = this;
if (option.show !== false) {
if (option.target) {
this.dom = document.getElementById(option.target);
this.dom.classList.add("measureTool");
if (option.classname) {
this.dom.classList.add(option.classname);
}
} else {
var div = document.createElement('div');
div.className = "measureTool measureTool_" + (option.classname ? " " + option.classname : "");
document.body.appendChild(div);
this.dom = div;
}
//空间测量距离
var btnDistance = document.createElement('div');
btnDistance.className = "measureItem";
btnDistance.innerHTML = '空间距离';
btnDistance.onclick = function () {
this.classList.add('selItembox1');
me.btnclick('空间距离');
};
this.dom.appendChild(btnDistance);
//地表测量距离
var btnGroundDistance = document.createElement('div');
btnGroundDistance.className = "measureItem";
btnGroundDistance.innerHTML = '地表距离';
btnGroundDistance.onclick = function () {
this.classList.add('selItembox1');
me.btnclick('地表距离');
};
this.dom.appendChild(btnGroundDistance);
//地表测量面积
var btnArea = document.createElement('div');
btnArea.className = "measureItem";
btnArea.innerHTML = '地表面积';
btnArea.onclick = function () {
this.classList.add('selItembox1');
me.btnclick('地表面积');
};
this.dom.appendChild(btnArea);
//高度差
var btnAltitude = document.createElement('div');
btnAltitude.className = "measureItem";
btnAltitude.innerHTML = '高度差';
btnAltitude.onclick = function () {
this.classList.add('selItembox1');
me.btnclick('高度差');
};
this.dom.appendChild(btnAltitude);
//三角测量
var btnTriangle = document.createElement('div');
btnTriangle.className = "measureItem";
btnTriangle.innerHTML = '三角测量';
btnTriangle.onclick = function () {
this.classList.add('selItembox1');
me.btnclick('三角测量');
};
this.dom.appendChild(btnTriangle);
//方位角
var btnAngle = document.createElement('div');
btnAngle.className = "measureItem";
btnAngle.innerHTML = '方位角';
btnAngle.onclick = function () {
this.classList.add('selItembox1');
me.btnclick('方位角');
};
this.dom.appendChild(btnAngle);
//清除结果
var btnClear = document.createElement('div');
btnClear.className = "measureItem";
btnClear.innerHTML = '清除结果';
btnClear.onclick = function () {
me.btnclick('清除结果');
};
this.dom.appendChild(btnClear);
//
// //事件
document.onclick = function (e) {
var len = document.querySelectorAll('.selItembox1').length;
if (e.target.className !== "" && e.target.className.indexOf("selItembox1") >= 0 && len == 1) {
return
}
if (len > 0) {
if (len > 1) {
var all = document.querySelectorAll(".selItembox1");
for (var a = 0; a < all.length; a++) {
if (all[a] !== e.target) {
all[a].classList.remove('selItembox1');
}
}
} else {
document.querySelector('.selItembox1').classList.remove('selItembox1');
}
}
};
}
this.bMeasuring = false;
me.viewer._container.style.cursor = "";
this.measureIds = [];
return {
name: "测量",
measureLineSpace: function () {
me.btnclick("空间距离");
},
groundMeasureLineSpace: function () {
me.btnclick("地表距离");
},
measureAreaSpace: function () {
me.btnclick("地表面积");
},
altitude: function () {
me.btnclick("高度差");
},
Triangle: function () {
me.btnclick("三角测量");
},
measureAngle: function () {
me.btnclick("方位角");
},
Clear: function () {
me.btnclick("清除结果")
},
finishMeasure: function () {
me._finishMeasure();
}
};
}
//点击事件
btnclick(type) {
var me = this;
if (type != "清除结果") {
if (me.bMeasuring)
if (me.handler && !me.handler.isDestroyed())
me.handler = me.handler && me.handler.destroy();
// return;
}
switch (type) {
case "空间距离":
me.bMeasuring = true;
me.viewer._container.style.cursor = "crosshair";
me._measureLineSpace();
break;
case "地表距离":
me.bMeasuring = true;
me.viewer._container.style.cursor = "crosshair";
me._groundMeasureLineSpace();
break;
case "地表面积":
me.bMeasuring = true;
me.viewer._container.style.cursor = "crosshair";
me._measureAreaSpace();
break;
case "高度差":
me.bMeasuring = true;
me.viewer._container.style.cursor = "crosshair";
me._altitude();
break;
case "三角测量":
me.bMeasuring = true;
me.viewer._container.style.cursor = "crosshair";
me._Triangle();
break;
case "方位角":
me.bMeasuring = true;
me.viewer._container.style.cursor = "crosshair";
me._measureAngle();
break;
case "清除结果":
//删除事先记录的id
for (var jj = 0; jj < me.measureIds.length; jj++) {
me.viewer.entities.removeById(me.measureIds[jj]);
}
me.measureIds.length = 0;
if (me.handler && !me.handler.isDestroyed())
me.handler = me.handler && me.handler.destroy();
break;
}
}
_finishMeasure() {
var me = this;
me.btnclick("清除结果")
me.bMeasuring = false;
me.viewer._container.style.cursor = "";
document.getElementsByClassName("measureTool")[0].parentNode.removeChild(document.getElementsByClassName("measureTool")[0]);
}
//空间距离测量
_measureLineSpace() {
var me = this;
var viewer = this.viewer;
me.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
var positions = [];
var poly = null;
var distance = 0;
var cartesian = null;
var floatingPoint;
//监听移动事件
me.handler.setInputAction(function (movement) {
//移动结束位置
cartesian = viewer.scene.pickPosition(movement.endPosition);
if (!Cesium.defined(cartesian)) {
var ray = viewer.camera.getPickRay(movement.endPosition);
cartesian = viewer.scene.globe.pick(ray, viewer.scene);
}
//判断点是否在画布上
if (Cesium.defined(cartesian)) {
if (positions.length >= 2) {
if (!Cesium.defined(poly)) {
//画线
poly = new PolyLinePrimitive(positions);
} else {
positions.pop();
// cartesian.y += (1 + Math.random());
positions.push(cartesian);
}
}
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
//监听单击事件
me.handler.setInputAction(function (movement) {
cartesian = viewer.scene.pickPosition(movement.position);
if (!Cesium.defined(cartesian)) {
var ray = viewer.camera.getPickRay(movement.position);
cartesian = viewer.scene.globe.pick(ray, viewer.scene);
}
if (Cesium.defined(cartesian)) {
if (positions.length == 0) {
positions.push(cartesian.clone());
}
positions.push(cartesian);
var distance_add = parseFloat(getSpaceDistance(positions));
distance += distance_add;
//在三维场景中添加Label
var textDisance = ((distance > 1000) ? (distance / 1000).toFixed(3) + '千米' : distance.toFixed(2) + '米') + "\n(+" + (distance_add > 1000 ? (distance_add / 1000).toFixed(3) + '千米' : distance_add + '米') + ")"
// var textDisance = distance + "米";
// if (distance > 1000) {
// textDisance = (parseFloat(distance) / 1000).toFixed(3) + "千米";
// }
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
},
label: {
text: textDisance,
font: '18px sans-serif',
fillColor: Cesium.Color.CHARTREUSE,
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
outlineWidth: 2,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
pixelOffset: new Cesium.Cartesian2(20, -20),
disableDepthTestDistance: Number.POSITIVE_INFINITY,
heightReference: Cesium.HeightReference.NONE
}
});
me.measureIds.push(floatingPoint.id);
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
//监听双击事件
me.handler.setInputAction(function (movement) {
me.handler.destroy(); //关闭事件句柄
positions.pop(); //最后一个点无效
me.bMeasuring = false;
viewer._container.style.cursor = "";
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
//绘线效果1
var PolyLinePrimitive = (function () {
function _(positions) {
this.options = {
name: '直线',
polyline: {
show: true,
positions: [],
arcType: Cesium.ArcType.NONE,
// material: new Cesium.PolylineOutlineMaterialProperty({
// color: Cesium.Color.CHARTREUSE
// }),
material: Cesium.Color.CHARTREUSE,
// depthFailMaterial: new Cesium.PolylineOutlineMaterialProperty({
// color: Cesium.Color.RED
// }),
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);
var et = viewer.entities.add(this.options);
me.measureIds.push(et.id);
};
return _;
})();
//空间两点距离计算函数
function getSpaceDistance(positions) {
var distance_ = 0;
if (positions.length > 2) {
var point1cartographic = Cesium.Cartographic.fromCartesian(positions[positions.length - 3]);
var point2cartographic = Cesium.Cartographic.fromCartesian(positions[positions.length - 2]);
/**根据经纬度计算出距离**/
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);
}
}
//贴地测量距离函数
_groundMeasureLineSpace() {
var me = this;
var viewer = this.viewer;
var terrainProvider = this.terrainProvider;
viewer.scene.globe.depthTestAgainstTerrain = true;
me.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";
me.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);
if (!Cesium.defined(cartesian)) {
let ray = viewer.camera.getPickRay(movement.endPosition);
cartesian = viewer.scene.globe.pick(ray, viewer.scene);
}
let p = Cesium.Cartographic.fromCartesian(cartesian);
p.height = viewer.scene.sampleHeight(p);
cartesian = viewer.scene.globe.ellipsoid.cartographicToCartesian(p);
//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);
}
// console.log("distance: " + distance);
// tooltip.innerHTML='<p>'+distance+'米</p>';
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
me.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 (!Cesium.defined(cartesian)) {
let ray = viewer.camera.getPickRay(movement.position);
cartesian = viewer.scene.globe.pick(ray, viewer.scene);
}
let p = Cesium.Cartographic.fromCartesian(cartesian);
p.height = viewer.scene.sampleHeight(p);
cartesian = viewer.scene.globe.ellipsoid.cartographicToCartesian(p);
if (positions.length == 0) {
positions.push(cartesian.clone());
}
positions.push(cartesian);
getSpaceDistance(positions);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
me.handler.setInputAction(function (movement) {
me.handler.destroy(); //关闭事件句柄
positions.pop(); //最后一个点无效
// viewer.entities.remove(floatingPoint);
// tooltip.style.display = "none";
me.bMeasuring = false;
viewer._container.style.cursor = "";
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
var PolyLinePrimitive = (function () {
function _(positions) {
this.options = {
name: '直线',
polyline: {
show: true,
positions: [],
material: Cesium.Color.GOLD,
width: 2,
clampToGround: true
}
};
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);
var et = viewer.entities.add(this.options);
me.measureIds.push(et.id);
};
return _;
})();
//空间两点距离计算函数
function getSpaceDistance(positions) {
var distance_ = 0;
if (positions.length > 2) {
var positions_ = [];
var sp = Cesium.Cartographic.fromCartesian(positions[positions.length - 3]);
var ep = Cesium.Cartographic.fromCartesian(positions[positions.length - 2]);
var geodesic = new Cesium.EllipsoidGeodesic();
geodesic.setEndPoints(sp, ep);
var s = geodesic.surfaceDistance;
positions_.push(sp);
var num = parseInt((s / 100).toFixed(0));
num = num > 200 ? 200 : num;
num = num < 20 ? 20 : num;
for (var i = 1; i < num; i++) {
var res = geodesic.interpolateUsingSurfaceDistance(s / num * i, new Cesium.Cartographic());
res.height = viewer.scene.sampleHeight(res);
positions_.push(res);
}
positions_.push(ep);
// var promise = Cesium.sampleTerrainMostDetailed(terrainProvider, positions_);
// Cesium.when(promise, function (updatedPositions) {
for (var ii = 0; ii < positions_.length - 1; ii++) {
geodesic.setEndPoints(positions_[ii], positions_[ii + 1]);
var d = geodesic.surfaceDistance;
distance_ = Math.sqrt(Math.pow(d, 2) + Math.pow(positions_[ii + 1].height - positions_[ii]
.height,
2)) + distance_;
}
//在三维场景中添加Label
var distance_add = parseFloat(distance_.toFixed(2));
distance += distance_add;
var textDisance = ((distance > 1000) ? (distance / 1000).toFixed(3) + '千米' : distance.toFixed(2) + '米') + "\n(+" + (distance_add > 1000 ? (distance_add / 1000).toFixed(3) + '千米' : distance_add + '米') + ")"
// var textDisance = distance + "米";
// if (distance > 1000) {
// textDisance = (distance / 1000).toFixed(3) + "千米";
// }
floatingPoint = viewer.entities.add({
name: '空间直线距离',
position: positions[positions.length - 1],
point: {
pixelSize: 5,
color: Cesium.Color.RED,
outlineColor: Cesium.Color.WHITE,
outlineWidth: 2,
// disableDepthTestDistance: Number.POSITIVE_INFINITY
},
label: {
text: textDisance,
font: '18px sans-serif',
fillColor: Cesium.Color.GOLD,
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
outlineWidth: 2,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
pixelOffset: new Cesium.Cartesian2(20, -20),
// disableDepthTestDistance: Number.POSITIVE_INFINITY
}
});
me.measureIds.push(floatingPoint.id);
// });
}
}
//空间两点距离计算函数
function getSpaceDistance_(positions) {
var distance_ = 0;
if (positions.length > 2) {
var positions_ = [];
var sp = Cesium.Cartographic.fromCartesian(positions[positions.length - 3]);
var ep = Cesium.Cartographic.fromCartesian(positions[positions.length - 2]);
var geodesic = new Cesium.EllipsoidGeodesic();
geodesic.setEndPoints(sp, ep);
var s = geodesic.surfaceDistance;
positions_.push(sp);
var num = parseInt((s / 100).toFixed(0));
num = num > 200 ? 200 : num;
num = num < 20 ? 20 : num;
for (var i = 1; i < num; i++) {
var res = geodesic.interpolateUsingSurfaceDistance(s / num * i, new Cesium.Cartographic());
positions_.push(res);
}
positions_.push(ep);
var promise = Cesium.sampleTerrainMostDetailed(terrainProvider, positions_);
Cesium.when(promise, function (updatedPositions) {
for (var ii = 0; ii < positions_.length - 1; ii++) {
geodesic.setEndPoints(positions_[ii], positions_[ii + 1]);
var d = geodesic.surfaceDistance;
distance_ = Math.sqrt(Math.pow(d, 2) + Math.pow(positions_[ii + 1].height - positions_[ii]
.height,
2)) + distance_;
}
distance = parseFloat(distance_.toFixed(2));
//在三维场景中添加Label
var textDisance = distance + "米";
if (distance > 1000) {
textDisance = (distance / 1000).toFixed(3) + "千米";
}
floatingPoint = viewer.entities.add({
name: '空间直线距离',
position: positions[positions.length - 1],
point: {
pixelSize: 5,
color: Cesium.Color.RED,
outlineColor: Cesium.Color.WHITE,
outlineWidth: 2,
},
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),
}
});
me.measureIds.push(floatingPoint.id);
});
}
}
}
//内部测量面积函数
_measureAreaSpace() {
var me = this;
var viewer = this.viewer;
// 鼠标事件
me.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";
me.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);
if (!Cesium.defined(cartesian)) {
let ray = viewer.camera.getPickRay(movement.endPosition);
cartesian = viewer.scene.globe.pick(ray, viewer.scene);
}
//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);
me.handler.setInputAction(function (movement) {
// tooltip.style.display = "none";
cartesian = viewer.scene.pickPosition(movement.position);
if (!Cesium.defined(cartesian)) {
let ray = viewer.camera.getPickRay(movement.position);
cartesian = viewer.scene.globe.pick(ray, viewer.scene);
}
// 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: 3,
color: Cesium.Color.RED,
outlineColor: Cesium.Color.WHITE,
outlineWidth: 2,
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
}
});
me.measureIds.push(floatingPoint.id);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
me.handler.setInputAction(function (movement) {
me.handler.destroy();
positions.pop();
//tempPoints.pop();
// viewer.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 a = getArea(tempPoints);
if (a < 0.001) {
a = (a * 1000000).toFixed(4) + "平方米";
} else {
a = a.toFixed(4) + "平方公里";
}
var textArea = a;
var et = 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.CYAN,
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
outlineWidth: 2,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
pixelOffset: new Cesium.Cartesian2(20, -40),
disableDepthTestDistance: Number.POSITIVE_INFINITY,
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
}
});
me.measureIds.push(et.id);
me.bMeasuring = false;
viewer._container.style.cursor = "";
}, Cesium.ScreenSpaceEventType.RIGHT_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[i], positions[j]);
var dis_temp2 = distance(positions[j], positions[k]);
res += dis_temp1 * dis_temp2 * Math.abs(Math.sin(totalAngle));
}
return (res / 1000000.0);
}
/*角度*/
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.DARKTURQUOISE.withAlpha(0.4),
outlineColor: Cesium.Color.CYAN.withAlpha(0.8),
// heightReference:20000
}
};
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);
var et = viewer.entities.add(this.options);
me.measureIds.push(et.id);
};
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;
}
}
//高度差
_altitude() {
var me = this;
var viewer = this.viewer;
var trianArr = [];
var distanceLineNum = 0;
var Line1, Line2;
var H;
var floatingPoint; //浮动点
me.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
me.handler.setInputAction(function (movement) {
var cartesian = viewer.scene.pickPosition(movement.endPosition);
if (!Cesium.defined(cartesian)) {
var ray = viewer.camera.getPickRay(movement.endPosition);
cartesian = viewer.scene.globe.pick(ray, viewer.scene);
}
//cartesian = viewer.scene.camera.pickEllipsoid(movement.endPosition, viewer.scene.globe.ellipsoid);
if (distanceLineNum === 1) {
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
var lon = Cesium.Math.toDegrees(cartographic.longitude);
var lat = Cesium.Math.toDegrees(cartographic.latitude);
var MouseHeight = cartographic.height;
trianArr.length = 3;
trianArr.push(lon, lat, MouseHeight);
draw_Triangle();
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
me.handler.setInputAction(function (movement) {
var cartesian = viewer.scene.pickPosition(movement.position);
if (!Cesium.defined(cartesian)) {
var ray = viewer.camera.getPickRay(movement.position);
cartesian = viewer.scene.globe.pick(ray, viewer.scene);
}
// var cartesian = viewer.scene.pickPosition(movement.position);
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
var lon = Cesium.Math.toDegrees(cartographic.longitude);
var lat = Cesium.Math.toDegrees(cartographic.latitude);
var MouseHeight = cartographic.height;
floatingPoint = viewer.entities.add({
name: '多边形面积',
position: cartesian,
point: {
pixelSize: 3,
color: Cesium.Color.RED,
outlineColor: Cesium.Color.WHITE,
outlineWidth: 2,
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
}
});
me.measureIds.push(floatingPoint.id);
distanceLineNum++;
if (distanceLineNum === 1) {
trianArr.push(lon, lat, MouseHeight);
} else {
trianArr.length = 3;
trianArr.push(lon, lat, MouseHeight);
me.handler.destroy();
me.bMeasuring = false;
viewer._container.style.cursor = "";
draw_Triangle();
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
me.handler.setInputAction(function (movement) {
me.handler.destroy();
me.bMeasuring = false;
viewer._container.style.cursor = "";
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
function draw_Triangle() {
if (Cesium.defined(Line1)) {
//更新三角线
Line1.polyline.positions = trianArr[5] > trianArr[2] ? new Cesium.Cartesian3.fromDegreesArrayHeights([
trianArr[0],
trianArr[1], trianArr[5], trianArr[0], trianArr[1], trianArr[2]
]) : new Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[3], trianArr[4], trianArr[2], trianArr[
3], trianArr[4], trianArr[5]]);
Line2.polyline.positions = trianArr[5] > trianArr[2] ? new Cesium.Cartesian3.fromDegreesArrayHeights([
trianArr[0],
trianArr[1], trianArr[5], trianArr[3], trianArr[4],
trianArr[5]
]) : new Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[3], trianArr[4], trianArr[2], trianArr[
0], trianArr[1], trianArr[2]]);
//高度
var height = Math.abs(trianArr[2] - trianArr[5]).toFixed(2);
H.position = trianArr[5] > trianArr[2] ? Cesium.Cartesian3.fromDegrees(trianArr[0], trianArr[1], (
trianArr[2] + trianArr[5]) / 2) : Cesium.Cartesian3.fromDegrees(trianArr[3], trianArr[4], (
trianArr[2] + trianArr[5]) / 2);
H.label.text = '高度差:' + height + '米';
return;
}
Line1 = viewer.entities.add({
name: 'triangleLine',
polyline: {
positions: trianArr[5] > trianArr[2] ? new Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[0],
trianArr[1], trianArr[5], trianArr[0], trianArr[1], trianArr[2]
]) : new Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[3], trianArr[4], trianArr[2], trianArr[
3], trianArr[4], trianArr[5]]),
arcType: Cesium.ArcType.NONE,
width: 2,
material: new Cesium.PolylineOutlineMaterialProperty({
color: Cesium.Color.CHARTREUSE
}),
depthFailMaterial: new Cesium.PolylineOutlineMaterialProperty({
color: Cesium.Color.RED
})
}
});
me.measureIds.push(Line1.id);
Line2 = viewer.entities.add({
name: 'triangleLine',
polyline: {
positions: trianArr[5] > trianArr[2] ? new Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[0],
trianArr[1], trianArr[5], trianArr[3], trianArr[4],
trianArr[5]
]) : new Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[3], trianArr[4], trianArr[2], trianArr[
0], trianArr[1], trianArr[2]]),
arcType: Cesium.ArcType.NONE,
width: 2,
// material: new Cesium.PolylineOutlineMaterialProperty({
material: new Cesium.PolylineDashMaterialProperty({
color: Cesium.Color.CHARTREUSE,
// dashLength: 5,
// dashPattern: 10,
// gapColor:Cesium.Color.YELLOW
}),
// depthFailMaterial: new Cesium.PolylineOutlineMaterialProperty({
depthFailMaterial: new Cesium.PolylineDashMaterialProperty({
color: Cesium.Color.RED
})
}
});
me.measureIds.push(Line2.id);
// 空间
var lineDistance = Cesium.Cartesian3.distance(Cesium.Cartesian3.fromDegrees(trianArr[0], trianArr[1]),
Cesium.Cartesian3.fromDegrees(trianArr[3], trianArr[4])).toFixed(2);
//高度
var height = Math.abs(trianArr[2] - trianArr[5]).toFixed(2);
H = viewer.entities.add({
name: 'lineZ',
position: trianArr[5] > trianArr[2] ? Cesium.Cartesian3.fromDegrees(trianArr[0], trianArr[1], (
trianArr[2] + trianArr[5]) / 2) : Cesium.Cartesian3.fromDegrees(trianArr[3], trianArr[4], (
trianArr[2] + trianArr[5]) / 2),
label: {
text: '高度差:' + height + '米',
translucencyByDistance: new Cesium.NearFarScalar(1.5e2, 2.0, 1.5e5, 0),
font: '45px 楷体',
fillColor: Cesium.Color.WHITE,
outlineColor: Cesium.Color.BLACK,
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
outlineWidth: 3,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
scale: 0.5,
pixelOffset: new Cesium.Cartesian2(0, -10),
backgroundColor: new Cesium.Color.fromCssColorString("rgba(0, 0, 0, 0.7)"),
backgroundPadding: new Cesium.Cartesian2(10, 10),
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
}
});
me.measureIds.push(H.id);
}
}
//三角测量
_Triangle() {
var me = this;
var viewer = this.viewer;
var trianArr = [];
var distanceLineNum = 0;
var XLine;
var X, Y, H;
var floatingPoint; //浮动点
me.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
me.handler.setInputAction(function (movement) {
var cartesian = viewer.scene.pickPosition(movement.endPosition);
if (!Cesium.defined(cartesian)) {
var ray = viewer.camera.getPickRay(movement.endPosition);
cartesian = viewer.scene.globe.pick(ray, viewer.scene);
}
//cartesian = viewer.scene.camera.pickEllipsoid(movement.endPosition, viewer.scene.globe.ellipsoid);
if (distanceLineNum === 1) {
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
var lon = Cesium.Math.toDegrees(cartographic.longitude);
var lat = Cesium.Math.toDegrees(cartographic.latitude);
var MouseHeight = cartographic.height;
trianArr.length = 3;
trianArr.push(lon, lat, MouseHeight);
draw_Triangle();
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
me.handler.setInputAction(function (movement) {
var cartesian = viewer.scene.pickPosition(movement.position);
if (!Cesium.defined(cartesian)) {
var ray = viewer.camera.getPickRay(movement.position);
cartesian = viewer.scene.globe.pick(ray, viewer.scene);
}
// var cartesian = viewer.scene.pickPosition(movement.position);
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
var lon = Cesium.Math.toDegrees(cartographic.longitude);
var lat = Cesium.Math.toDegrees(cartographic.latitude);
var MouseHeight = cartographic.height;
floatingPoint = viewer.entities.add({
name: '多边形面积',
position: cartesian,
point: {
pixelSize: 3,
color: Cesium.Color.RED,
outlineColor: Cesium.Color.WHITE,
outlineWidth: 2,
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
}
});
me.measureIds.push(floatingPoint.id);
distanceLineNum++;
if (distanceLineNum === 1) {
trianArr.push(lon, lat, MouseHeight);
} else {
trianArr.length = 3;
trianArr.push(lon, lat, MouseHeight);
me.handler.destroy();
me.bMeasuring = false;
viewer._container.style.cursor = "";
draw_Triangle();
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
me.handler.setInputAction(function (movement) {
me.handler.destroy();
me.bMeasuring = false;
viewer._container.style.cursor = "";
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
function draw_Triangle() {
if (Cesium.defined(XLine)) {
//更新三角线
XLine.polyline.positions = trianArr[5] > trianArr[2] ? new Cesium.Cartesian3.fromDegreesArrayHeights([
trianArr[0],
trianArr[1], trianArr[2], trianArr[0], trianArr[1], trianArr[5], trianArr[3], trianArr[4],
trianArr[5], trianArr[0], trianArr[1], trianArr[2]
]) : new Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[0], trianArr[1], trianArr[2],
trianArr[3], trianArr[4], trianArr[5], trianArr[3], trianArr[4], trianArr[2], trianArr[0],
trianArr[1], trianArr[2]
]);
// 空间
var lineDistance = Cesium.Cartesian3.distance(Cesium.Cartesian3.fromDegrees(trianArr[0], trianArr[1]),
Cesium.Cartesian3.fromDegrees(trianArr[3], trianArr[4])).toFixed(2);
//高度
var height = Math.abs(trianArr[2] - trianArr[5]).toFixed(2);
//直线距离
var strLine = (Math.sqrt(Math.pow(lineDistance, 2) + Math.pow(height, 2))).toFixed(2);
X.position = Cesium.Cartesian3.fromDegrees((trianArr[0] + trianArr[3]) / 2, (trianArr[1] + trianArr[
4]) / 2, Math.max(trianArr[2], trianArr[5]));
H.position = trianArr[5] > trianArr[2] ? Cesium.Cartesian3.fromDegrees(trianArr[0], trianArr[1], (
trianArr[2] + trianArr[5]) / 2) : Cesium.Cartesian3.fromDegrees(trianArr[3], trianArr[4], (
trianArr[2] + trianArr[5]) / 2);
Y.position = Cesium.Cartesian3.fromDegrees((trianArr[0] + trianArr[3]) / 2, (trianArr[1] + trianArr[
4]) / 2, (trianArr[2] + trianArr[5]) / 2);
X.label.text = '水平距离:' + lineDistance + '米';
H.label.text = '高度差:' + height + '米';
Y.label.text = '空间距离:' + strLine + '米';
return;
}
XLine = viewer.entities.add({
name: 'triangleLine',
polyline: {
positions: trianArr[5] > trianArr[2] ? new Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[0],
trianArr[1], trianArr[2], trianArr[0], trianArr[1], trianArr[5], trianArr[3], trianArr[4],
trianArr[5], trianArr[0], trianArr[1], trianArr[2]
]) : new Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[0], trianArr[1], trianArr[2],
trianArr[3], trianArr[4], trianArr[5], trianArr[3], trianArr[4], trianArr[2], trianArr[0],
trianArr[1], trianArr[2]
]),
arcType: Cesium.ArcType.NONE,
width: 2,
material: new Cesium.PolylineOutlineMaterialProperty({
color: Cesium.Color.YELLOW
}),
depthFailMaterial: new Cesium.PolylineOutlineMaterialProperty({
color: Cesium.Color.RED
})
}
});
me.measureIds.push(XLine.id);
// 空间
var lineDistance = Cesium.Cartesian3.distance(Cesium.Cartesian3.fromDegrees(trianArr[0], trianArr[1]),
Cesium.Cartesian3.fromDegrees(trianArr[3], trianArr[4])).toFixed(2);
//高度
var height = Math.abs(trianArr[2] - trianArr[5]).toFixed(2);
//直线距离
var strLine = (Math.sqrt(Math.pow(lineDistance, 2) + Math.pow(height, 2))).toFixed(2);
X = viewer.entities.add({
name: 'lineX',
position: Cesium.Cartesian3.fromDegrees((trianArr[0] + trianArr[3]) / 2, (trianArr[1] + trianArr[
4]) / 2, Math.max(trianArr[2], trianArr[5])),
label: {
text: '水平距离:' + lineDistance + '米',
translucencyByDistance: new Cesium.NearFarScalar(1.5e2, 2.0, 1.5e5, 0),
font: '45px 楷体',
fillColor: Cesium.Color.WHITE,
outlineColor: Cesium.Color.BLACK,
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
outlineWidth: 3,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
scale: 0.5,
pixelOffset: new Cesium.Cartesian2(0, -10),
backgroundColor: new Cesium.Color.fromCssColorString("rgba(0, 0, 0, 0.7)"),
backgroundPadding: new Cesium.Cartesian2(10, 10),
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
}
});
me.measureIds.push(X.id);
H = viewer.entities.add({
name: 'lineZ',
position: trianArr[5] > trianArr[2] ? Cesium.Cartesian3.fromDegrees(trianArr[0], trianArr[1], (
trianArr[2] + trianArr[5]) / 2) : Cesium.Cartesian3.fromDegrees(trianArr[3], trianArr[4], (
trianArr[2] + trianArr[5]) / 2),
label: {
text: '高度差:' + height + '米',
translucencyByDistance: new Cesium.NearFarScalar(1.5e2, 2.0, 1.5e5, 0),
font: '45px 楷体',
fillColor: Cesium.Color.WHITE,
outlineColor: Cesium.Color.BLACK,
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
outlineWidth: 3,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
scale: 0.5,
pixelOffset: new Cesium.Cartesian2(0, -10),
backgroundColor: new Cesium.Color.fromCssColorString("rgba(0, 0, 0, 0.7)"),
backgroundPadding: new Cesium.Cartesian2(10, 10),
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
}
});
me.measureIds.push(H.id);
Y = viewer.entities.add({
name: 'lineY',
position: Cesium.Cartesian3.fromDegrees((trianArr[0] + trianArr[3]) / 2, (trianArr[1] + trianArr[
4]) / 2, (trianArr[2] + trianArr[5]) / 2),
label: {
text: '空间距离:' + strLine + '米',
translucencyByDistance: new Cesium.NearFarScalar(1.5e2, 2.0, 1.5e5, 0),
font: '45px 楷体',
fillColor: Cesium.Color.WHITE,
outlineColor: Cesium.Color.BLACK,
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
outlineWidth: 3,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
scale: 0.5,
pixelOffset: new Cesium.Cartesian2(0, -10),
backgroundColor: new Cesium.Color.fromCssColorString("rgba(0, 0, 0, 0.7)"),
backgroundPadding: new Cesium.Cartesian2(10, 10),
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
}
});
me.measureIds.push(Y.id);
}
}
//方位角
_measureAngle() {
var me = this;
var viewer = this.viewer;
var pArr = [];
var distanceLineNum = 0;
var Line1;
var Line2;
var angleT;
var floatingPoint; //浮动点
me.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
me.handler.setInputAction(function (movement) {
var cartesian = viewer.scene.pickPosition(movement.endPosition);
if (!Cesium.defined(cartesian)) {
var ray = viewer.camera.getPickRay(movement.endPosition);
cartesian = viewer.scene.globe.pick(ray, viewer.scene);
}
//cartesian = viewer.scene.camera.pickEllipsoid(movement.endPosition, viewer.scene.globe.ellipsoid);
if (distanceLineNum === 1) {
pArr.length = 1;
pArr.push(cartesian);
draw_Angle();
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
me.handler.setInputAction(function (movement) {
var cartesian = viewer.scene.pickPosition(movement.position);
if (!Cesium.defined(cartesian)) {
var ray = viewer.camera.getPickRay(movement.position);
cartesian = viewer.scene.globe.pick(ray, viewer.scene);
}
// var cartesian = viewer.scene.pickPosition(movement.position);
distanceLineNum++;
if (distanceLineNum === 1) {
pArr.push(cartesian);
floatingPoint = viewer.entities.add({
name: '方位角',
position: cartesian,
point: {
pixelSize: 3,
color: Cesium.Color.RED,
outlineColor: Cesium.Color.WHITE,
outlineWidth: 2,
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
}
});
me.measureIds.push(floatingPoint.id);
} else {
pArr.length = 1;
pArr.push(cartesian);
me.handler.destroy();
me.bMeasuring = false;
viewer._container.style.cursor = "";
draw_Angle();
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
me.handler.setInputAction(function (movement) {
me.handler.destroy();
me.bMeasuring = false;
viewer._container.style.cursor = "";
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
function draw_Angle() {
// 空间
var cartographic1 = Cesium.Cartographic.fromCartesian(pArr[0]);
var lon1 = Cesium.Math.toDegrees(cartographic1.longitude);
var lat1 = Cesium.Math.toDegrees(cartographic1.latitude);
var cartographic2 = Cesium.Cartographic.fromCartesian(pArr[1]);
var lon2 = Cesium.Math.toDegrees(cartographic2.longitude);
var lat2 = Cesium.Math.toDegrees(cartographic2.latitude);
var lineDistance = Cesium.Cartesian3.distance(Cesium.Cartesian3.fromDegrees(lon1, lat1),
Cesium.Cartesian3.fromDegrees(lon2, lat2));
var localToWorld_Matrix = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(lon1, lat1));
var NorthPoint = Cesium.Cartographic.fromCartesian(Cesium.Matrix4.multiplyByPoint(localToWorld_Matrix, Cesium
.Cartesian3.fromElements(0,
lineDistance,
0), new Cesium.Cartesian3()));
var npLon = Cesium.Math.toDegrees(NorthPoint.longitude);
var npLat = Cesium.Math.toDegrees(NorthPoint.latitude);
// var angle = Cesium.Cartesian3.angleBetween(Cesium.Cartesian3.fromDegrees(lon1, lat1),
// Cesium.Cartesian3.fromDegrees(lon2, lat2));
var angle = courseAngle(lon1, lat1, lon2, lat2);
var textDisance = lineDistance.toFixed(2) + "米";
if (lineDistance > 1000) {
textDisance = (lineDistance / 1000).toFixed(3) + "千米";
}
if (Cesium.defined(Line1)) {
//更新线
Line1.polyline.positions = new Cesium.Cartesian3.fromDegreesArray([lon1, lat1, npLon, npLat]);
Line2.polyline.positions = new Cesium.Cartesian3.fromDegreesArray([lon1, lat1, lon2, lat2]);
angleT.label.text = '角度:' + angle + '°\n距离:' + textDisance;
angleT.position = pArr[1];
return;
}
//北方线
Line1 = viewer.entities.add({
name: 'Angle1',
polyline: {
positions: new Cesium.Cartesian3.fromDegreesArray([lon1, lat1, npLon, npLat]),
width: 3,
material: new Cesium.PolylineDashMaterialProperty({
color: Cesium.Color.RED
}),
clampToGround: true
}
});
me.measureIds.push(Line1.id);
//线
Line2 = viewer.entities.add({
name: 'Angle2',
polyline: {
positions: new Cesium.Cartesian3.fromDegreesArray([lon1, lat1, lon2, lat2]),
width: 10,
material: new Cesium.PolylineArrowMaterialProperty(Cesium.Color.YELLOW),
clampToGround: true
}
});
me.measureIds.push(Line2.id);
//文字
angleT = viewer.entities.add({
name: 'AngleT',
position: pArr[1],
label: {
text: '角度:' + angle + '°\n距离:' + textDisance,
translucencyByDistance: new Cesium.NearFarScalar(1.5e2, 2.0, 1.5e5, 0),
font: '45px 楷体',
fillColor: Cesium.Color.WHITE,
outlineColor: Cesium.Color.BLACK,
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
outlineWidth: 4,
scale: 0.5,
pixelOffset: new Cesium.Cartesian2(0, -40),
disableDepthTestDistance: Number.POSITIVE_INFINITY,
backgroundColor: new Cesium.Color.fromCssColorString("rgba(0, 0, 0, 1)"),
backgroundPadding: new Cesium.Cartesian2(10, 10),
verticalOrigin: Cesium.VerticalOrigin.BASELINE
}
});
me.measureIds.push(angleT.id);
}
function courseAngle(lng_a, lat_a, lng_b, lat_b) {
/////////////方法
var dRotateAngle = Math.atan2(Math.abs(lng_a - lng_b), Math.abs(lat_a - lat_b));
if (lng_b >= lng_a) {
if (lat_b >= lat_a) {} else {
dRotateAngle = Math.PI - dRotateAngle;
}
} else {
if (lat_b >= lat_a) {
dRotateAngle = 2 * Math.PI - dRotateAngle;
} else {
dRotateAngle = Math.PI + dRotateAngle;
}
}
dRotateAngle = dRotateAngle * 180 / Math.PI;
return parseInt(dRotateAngle * 100) / 100;
/////方法
// //以a点为原点建立局部坐标系东方向为x轴,北方向为y轴,垂直于地面为z轴得到一个局部坐标到世界坐标转换的变换矩阵
// var localToWorld_Matrix = Cesium.Transforms.eastNorthUpToFixedFrame(new Cesium.Cartesian3.fromDegrees(lng_a, lat_a));
// //求世界坐标到局部坐标的变换矩阵
// var worldToLocal_Matrix = Cesium.Matrix4.inverse(localToWorld_Matrix, new Cesium.Matrix4());
// //a点在局部坐标的位置其实就是局部坐标原点
// var localPosition_A = Cesium.Matrix4.multiplyByPoint(worldToLocal_Matrix, new Cesium.Cartesian3.fromDegrees(lng_a, lat_a), new Cesium.Cartesian3());
// //B点在以A点为原点的局部的坐标位置
// var localPosition_B = Cesium.Matrix4.multiplyByPoint(worldToLocal_Matrix, new Cesium.Cartesian3.fromDegrees(lng_b, lat_b), new Cesium.Cartesian3());
// //弧度
// var angle = Math.atan2((localPosition_B.y - localPosition_A.y), (localPosition_B.x - localPosition_A.x))
// //角度
// var theta = angle * (180 / Math.PI);
// if (theta < 0) {
// theta = theta + 360;
// }
// return theta.toFixed(2);
}
}
}