复制过去就能用
const deleteRangeArea = () => {
let RangeArea = viewer.entities._entities._array
for (let i = 0; i < RangeArea.length; i++) {
if (RangeArea[i]._name === "_range") {
viewer.entities.remove(RangeArea[i]);
i--;
}
}
}
// 测距
function range() {
deleteRangeArea()
// 取消双击事件-追踪该位置
viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene._imageryLayerCollection);
var positions = [];
var poly = null;
var distance = 0;
var cartesian = null;
var labelPt;
//鼠标移动事件
handler.setInputAction(function (movement) {
let ray = viewer.camera.getPickRay(movement.endPosition);
cartesian = viewer.scene.globe.pick(ray, viewer.scene);
if (!Cesium.defined(cartesian)) //跳出地球时异常
return;
if (positions.length >= 2) {
if (!Cesium.defined(poly)) {
//移动时路径绘制
poly = new PolyLinePrimitive(positions);
} else {
positions.pop();
positions.push(cartesian);
}
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
//鼠标左键点击事件
handler.setInputAction(function (movement) {
let ray = viewer.camera.getPickRay(movement.position);
cartesian = viewer.scene.globe.pick(ray, viewer.scene);
if (!Cesium.defined(cartesian)) //跳出地球时异常
return;
if (positions.length === 0) {
positions.push(cartesian.clone());
}
positions.push(cartesian);
//记录鼠标单击时的节点位置,异步计算贴地距离
labelPt = positions[positions.length - 1];
if (positions.length > 2) {
getSpaceDistance(positions);
} else if (positions.length === 2) {
//在三维场景中添加Label
viewer.entities.add({
name: '_range',
id: "range",
position: labelPt,
point: {
pixelSize: 5,
color: Cesium.Color.RED,
outlineColor: Cesium.Color.WHITE,
outlineWidth: 2,
},
label: {
text: '起 点',
font: 'normal 8px SimHei',
fillColor: Cesium.Color.BLUE,
backgroundColor: Cesium.Color.WHITE, //背景颜色
//showBackground:true,
style: Cesium.LabelStyle.FILL, //label样式 FILL、OUTLINE、FILL_AND_OUTLINE
outlineWidth: 2,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
horizontalOrigin: Cesium.HorizontalOrigin.LEFT,//水平位置
pixelOffset: new Cesium.Cartesian2(0, -10),
}
});
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
//鼠标左键双击事件
handler.setInputAction(function (movement) {
let ray = viewer.camera.getPickRay(movement.position);
cartesian = viewer.scene.globe.pick(ray, viewer.scene);
if (!Cesium.defined(cartesian)) //跳出地球时异常
return;
if (positions.length === 0) {
positions.push(cartesian.clone());
}
positions.push(cartesian);
//记录鼠标单击时的节点位置,异步计算贴地距离
labelPt = positions[positions.length - 1];
if (positions.length > 2) {
getSpaceDistance(positions);
} else if (positions.length === 2) {
//在三维场景中添加Label
viewer.entities.add({
name: '_range',
//id:"LEFT_DOUBLE_CLICK",
position: labelPt,
point: {
pixelSize: 5,
color: Cesium.Color.RED,
outlineColor: Cesium.Color.WHITE,
outlineWidth: 2,
}
});
}
handler.destroy(); //关闭事件句柄
handler = undefined;
}, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
var PolyLinePrimitive = (function () {
function _(positions) {
this.options = {
name: '_range',
polyline: {
show: true,
positions: [],
material: Cesium.Color.ORANGERED,
width: 3,
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);
viewer.entities.add(this.options);
};
return _;
})();
//空间两点距离计算函数
function getSpaceDistance(positions) {
//只计算最后一截,与前面累加
//因move和鼠标左击事件,最后两个点坐标重复
var i = positions.length - 3;
var point1cartographic = Cesium.Cartographic.fromCartesian(positions[i]);
var point2cartographic = Cesium.Cartographic.fromCartesian(positions[i + 1]);
getTerrainDistance(point1cartographic, point2cartographic);
}
//贴地距离计算函数
function getTerrainDistance(point1cartographic, point2cartographic) {
var geodesic = new Cesium.EllipsoidGeodesic();
geodesic.setEndPoints(point1cartographic, point2cartographic);
var s = geodesic.surfaceDistance;
var cartoPts = [point1cartographic];
for (var jj = 1000; jj < s; jj += 1000) { //分段采样计算距离
var cartoPt = geodesic.interpolateUsingSurfaceDistance(jj);
cartoPts.push(cartoPt);
}
cartoPts.push(point2cartographic);
//返回两点之间的距离
var promise = Cesium.sampleTerrain(viewer.terrainProvider, 2, cartoPts);
Cesium.when(promise, function (updatedPositions) {
// positions height have been updated.
// updatedPositions is just a reference to positions.
for (var jj = 0; jj < updatedPositions.length - 1; jj++) {
var geoD = new Cesium.EllipsoidGeodesic();
geoD.setEndPoints(updatedPositions[jj], updatedPositions[jj + 1]);
var innerS = geoD.surfaceDistance;
innerS = Math.sqrt(Math.pow(innerS, 2) + Math.pow(updatedPositions[jj + 1].height - updatedPositions[jj].height, 2));
distance += innerS;
}
//在三维场景中添加Label
var textDisance = distance.toFixed(2) + "里";
if (distance > 10000)
textDisance = (distance / 1000.0).toFixed(2) + "公里";
viewer.entities.add({
name: '_range',
position: labelPt,
point: {
pixelSize: 4,
color: Cesium.Color.RED,
outlineColor: Cesium.Color.WHITE,
outlineWidth: 2,
},
label: {
text: textDisance,
font: '18px sans-serif',
fillColor: Cesium.Color.WHITE,
// backgroundColor:Cesium.Color.WHITE, //背景颜色
// style: Cesium.LabelStyle.FILL,
outlineWidth: 2,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
horizontalOrigin: Cesium.HorizontalOrigin.LEFT,//水平位置
pixelOffset: new Cesium.Cartesian2(0, -10),
}
});
});
}
}