import * as turf from "@turf/turf";
|
import WKT from 'terraformer-wkt-parser'
|
import rightServer from "./rightServer";
|
import config from "./config";
|
import CryptoJS from 'crypto-js';
|
|
const menuTool = {
|
toolMenu: null,
|
toolFlag: null,
|
oldLeftMenuId: null,
|
|
squareOjb: [],
|
localPoint: null,
|
colorAll: {
|
point: SmartEarth.Cesium.Color.fromCssColorString("#ff0000"),
|
polyline: SmartEarth.Cesium.Color.fromCssColorString("#ffff0050"),
|
polygon: SmartEarth.Cesium.Color.fromCssColorString("#ffff0050"),
|
},
|
topTools(res) {
|
this.toolFlag = res.id;
|
switch (res.id) {
|
case "a2": //点漫游
|
this.pointRoam();
|
break;
|
case "a3": //线漫游
|
this.lineRoam();
|
break;
|
case "b2": //表面距离
|
this.surfaceDistance();
|
break;
|
case "b3": //平面面积
|
this.planeDistance();
|
break;
|
case "b4": //高程测量
|
this.heightMeasure();
|
break;
|
case "b5": //垂直高度
|
this.verticalHeight();
|
break;
|
case "c2": //点
|
this.createSimpleGraphic("point");
|
break;
|
case "c3": //文字
|
this.createSimpleGraphic("label");
|
break;
|
case "c4": //线
|
this.createSimpleGraphic("polyline");
|
break;
|
case "c5": //矩形
|
this.createSimpleGraphic("rectangle");
|
break;
|
case "c6": //多边形
|
this.createSimpleGraphic("polygon");
|
break;
|
case "d2"://等高线分析
|
this.setcontour();
|
break
|
case "d3"://坡度分析
|
this.setSlopeMap();
|
break
|
case "d4": //土方量计算
|
this.Volumetric();
|
break;
|
case "d5": //影像对比
|
this.CurtainContrast();
|
break;
|
case "e1"://快照
|
this.snapshot();
|
break;
|
case "f1"://空间查询
|
this.spatialQuery();
|
break;
|
case "g1": //坐标定位
|
this.Coordposition();
|
break;
|
}
|
},
|
setLocalPosition(res) {
|
if (this.localPoint) {
|
this.setLocalPositionClose();
|
}
|
var position = { X: parseFloat(res.lon), Y: parseFloat(res.lat), Altitude: parseFloat(res.alt) };
|
this.localPoint = window.sgworld.Creator.CreateImageLabel(
|
position,
|
config.StaticFileBaseUrl + "/Workers/image/mark.png",
|
{},
|
0,
|
"标签点"
|
);
|
var id = this.localPoint.item.id;
|
window.sgworld.Navigate.flyToObj(this.localPoint.item);
|
},
|
setLocalPositionClose() {
|
this.localPoint.deleteObject();
|
this.localPoint = null;
|
},
|
//坡度分析
|
setSlopeMap() {
|
const globe = Viewer.scene.globe;
|
if (window.material) {
|
window.material = null;
|
globe.material = null;
|
Viewer.scene.globe.enableLighting = false;
|
return
|
}
|
Viewer.scene.globe.enableLighting = true;
|
let shadingUniforms = {};
|
window.material = Cesium.Material.fromType("ElevationRamp");
|
shadingUniforms = material.uniforms;
|
shadingUniforms.minimumHeight = -10000;
|
shadingUniforms.maximumHeight = 10000;
|
|
shadingUniforms.image = this.getColorRamp();
|
|
globe.material = material;
|
},
|
getColorRamp() {
|
const ramp = document.createElement("canvas");
|
ramp.width = 100;
|
ramp.height = 1;
|
const ctx = ramp.getContext("2d");
|
let values = [0, 0.083, 0.166, 0.25, 0.333, 0.416, 0.5, 0.583, 0.666, 0.75, 0.833, 0.916, 0.999, 1];
|
const grd = ctx.createLinearGradient(0, 0, 100, 0);
|
grd.addColorStop(values[0], "rgb(56,168,0)"); //black
|
grd.addColorStop(values[1], "rgb(77,179,0)"); //blue
|
grd.addColorStop(values[2], "rgb(102,191,0)"); //pink
|
grd.addColorStop(values[3], "rgb(126,204,0)"); //red
|
grd.addColorStop(values[4], "rgb(155,217,0)"); //orange
|
grd.addColorStop(values[5], "rgb(187,230,0)"); //yellow
|
grd.addColorStop(values[6], "rgb(222,242,0)"); //white
|
grd.addColorStop(values[7], "rgb(255,255,0)"); //white
|
grd.addColorStop(values[8], "rgb(255,221,0)"); //white
|
grd.addColorStop(values[9], "rgb(255,183,0)"); //white
|
grd.addColorStop(values[10], "rgb(255,145,0)"); //white
|
grd.addColorStop(values[11], "rgb(255,111,0)"); //white
|
grd.addColorStop(values[12], "rgb(255,72,0)"); //white
|
grd.addColorStop(values[13], "rgb(255,38,0)"); //white
|
|
ctx.fillStyle = grd;
|
ctx.fillRect(0, 0, 100, 1);
|
|
return ramp;
|
},
|
|
//等高线
|
setcontour() {
|
var globe = window.Viewer.scene.globe;
|
if (window.material) {
|
window.material = null;
|
globe.material = null
|
return
|
}
|
|
var contourColor = new SmartEarth.Cesium.Color(117 / 255, 71 / 255, 18 / 255, 255 / 255);
|
var contourUniforms = {};
|
window.material = Cesium.Material.fromType('ElevationContour');
|
contourUniforms = material.uniforms;
|
contourUniforms.width = 1.0;
|
contourUniforms.spacing = 100.0;
|
contourUniforms.color = contourColor;
|
globe.material = window.material;
|
|
},
|
//空间查询
|
spatialQuery() {
|
|
sgworld.Creator.createSimpleGraphic('rectangle', { showSize: false }, (entity) => {
|
var west = Cesium.Math.toDegrees(
|
entity.rectangle._coordinates.getValue().west
|
); // 根据弧度获取到经度
|
var east = Cesium.Math.toDegrees(
|
entity.rectangle._coordinates.getValue().east
|
); // 根据弧度获取到纬度
|
var north = Cesium.Math.toDegrees(
|
entity.rectangle._coordinates.getValue().north
|
); // 根据弧度获取到经度
|
var south = Cesium.Math.toDegrees(
|
entity.rectangle._coordinates.getValue().south
|
); // 根据弧度获取到纬度
|
sgworld.Creator.SimpleGraphic.clear();
|
|
var polygon = turf.polygon([
|
[
|
[east, north],
|
[west, north],
|
[west, south],
|
[east, south],
|
[east, north],
|
],
|
]);
|
var wkt = WKT.convert(polygon.geometry)
|
|
window.functionForJs({
|
type: 'spatialQuery',
|
value: this.encr(wkt)
|
})
|
});
|
},
|
//加密
|
encr(word) {
|
return CryptoJS.AES.encrypt(
|
CryptoJS.enc.Utf8.parse(word),
|
CryptoJS.enc.Utf8.parse(base64Decode('QSNzX2xGX3NFcnZlX2sueQ==')),
|
{ mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }
|
).toString();
|
},
|
//解密
|
decr(word) {
|
return CryptoJS.enc.Utf8.stringify(
|
CryptoJS.AES.decrypt(
|
word,
|
CryptoJS.enc.Utf8.parse(base64Decode('QSNzX2xGX3NFcnZlX2sueQ==')),
|
{ mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }
|
)
|
).toString();
|
},
|
//快照
|
snapshot() {
|
let canvas = window.Viewer.scene.canvas;
|
let image = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream");
|
let link = document.createElement("a");
|
let blob = this.dataURLtoBlob(image);
|
let objurl = URL.createObjectURL(blob);
|
link.download = "scene.png";
|
link.href = objurl;
|
link.click();
|
|
},
|
dataURLtoBlob(dataurl) {
|
let arr = dataurl.split(','),
|
mime = arr[0].match(/:(.*?);/)[1],
|
bstr = atob(arr[1]),
|
n = bstr.length,
|
u8arr = new Uint8Array(n);
|
while (n--) {
|
u8arr[n] = bstr.charCodeAt(n);
|
}
|
return new Blob([u8arr], { type: mime });
|
|
},
|
leftTools(res) {
|
this.clearLeftTools(res);
|
|
if (this.oldLeftMenuId == "l3") {
|
earthCtrl.coreMap.scene.mode = SmartEarth.Cesium.SceneMode.SCENE3D;
|
}
|
this.oldLeftMenuId = res.id;
|
|
switch (res.id) {
|
case "l1":
|
break;
|
case "l2":
|
break;
|
case "l3": //在线制图
|
this.setThematicMap();
|
break;
|
case "l4":
|
break;
|
case "l5":
|
break;
|
case "l6":
|
break;
|
}
|
},
|
thematicTools(res) {
|
switch (res.id) {
|
case "t2":
|
this.createSimpleGraphic("rectangle", "square");
|
break;
|
case "t3":
|
this.delRectangle();
|
break;
|
}
|
},
|
//删除正方形
|
delRectangle() {
|
this.squareOjb.forEach((e) => {
|
Viewer.entities.remove(e);
|
});
|
},
|
// 矩形正方形
|
createRectangle(entity) {
|
this.delRectangle();
|
var west = Cesium.Math.toDegrees(
|
entity.rectangle._coordinates.getValue().west
|
); // 根据弧度获取到经度
|
var east = Cesium.Math.toDegrees(
|
entity.rectangle._coordinates.getValue().east
|
); // 根据弧度获取到纬度
|
var north = Cesium.Math.toDegrees(
|
entity.rectangle._coordinates.getValue().north
|
); // 根据弧度获取到经度
|
var south = Cesium.Math.toDegrees(
|
entity.rectangle._coordinates.getValue().south
|
); // 根据弧度获取到纬度
|
|
var ss = turf.square([west, south, east, north]);
|
var west1 = ss[0];
|
var east1 = ss[2];
|
var north1 = ss[3];
|
var south1 = ss[1];
|
var geometry = Cesium.Rectangle.fromDegrees(west1, south1, east1, north1);
|
|
// var e = Viewer.entities.add({
|
// name: "正方",
|
// polygon: {
|
// hierarchy: geometry1,
|
// //height : 100000,
|
// material: Cesium.Color.RED,
|
// outline: true,
|
// outlineColor: Cesium.Color.RED,
|
// },
|
// });
|
const stripeMaterial = new Cesium.StripeMaterialProperty({
|
evenColor: Cesium.Color.WHITE.withAlpha(0.5),
|
oddColor: Cesium.Color.BLUE.withAlpha(0.5),
|
repeat: 5.0,
|
});
|
var e = Viewer.entities.add({
|
rectangle: {
|
coordinates: geometry,
|
outline: true,
|
outlineColor: Cesium.Color.WHITE,
|
outlineWidth: 4,
|
stRotation: Cesium.Math.toRadians(45),
|
material: stripeMaterial,
|
},
|
});
|
this.squareOjb.push(e);
|
// earthCtrl.Creator.SimpleGraphic.clear();
|
Viewer.entities.remove(entity);
|
|
window.functionForJs({
|
type: 'exportMap',
|
value: true
|
})
|
},
|
// 创建图形
|
createSimpleGraphic(type, scene) {
|
|
sgworld.Creator.createSimpleGraphic(type, {}, (entity) => {
|
if (scene === "square") {
|
this.createRectangle(entity);
|
}
|
});
|
},
|
//在线制图
|
setThematicMap() {
|
earthCtrl.coreMap.scene.mode = SmartEarth.Cesium.SceneMode.SCENE2D;
|
// var handle = new SmartEarth.Cesium.ScreenSpaceEventHandler(
|
// earthCtrl.viewer.scene.canvas
|
// );
|
},
|
|
//坐标定位
|
Coordposition() {
|
window.functionForJs({
|
type: 'coordLocation',
|
value: true
|
})
|
},
|
//影像对比
|
CurtainContrast() {
|
if (window.DoubleScreen) {
|
window.DoubleScreen && window.DoubleScreen.destroy();
|
window.DoubleScreen = null;
|
const compass = document.getElementsByClassName("bottom_btn")[0];
|
compass.style.right = "70px";
|
return
|
}
|
window.DoubleScreen = new SmartEarth.DoubleScreen(window.sgworld, {}, SmartEarth);
|
DoubleScreen.right._Viewer.imageryLayers.removeAll()
|
var terrain = new Cesium.CesiumTerrainProvider({
|
url: config.moonTerrain,
|
tilingScheme: new Cesium.GeographicTilingScheme({
|
ellipsoid: Cesium.Ellipsoid.MOON,
|
}),
|
|
});
|
DoubleScreen.right._Viewer.terrainProvider = terrain;
|
rightServer.AddWmtesLayer(config.moonWmts)
|
|
const compass = document.getElementsByClassName("bottom_btn")[0];
|
compass.style.right = "calc(50% + 70px)";
|
|
|
},
|
//土方量计算
|
Volumetric() {
|
const Volumetric = earthCtrl.analysis.createVolumetricMeasure({});
|
Volumetric.startDrawing();
|
},
|
//垂直高度
|
verticalHeight() {
|
|
sgworld.Analysis.verticalHeight(this.colorAll, () => {
|
});
|
},
|
//高程测量
|
heightMeasure() {
|
|
earthCtrl.Analysis.altitude(this.colorAll, () => { });
|
},
|
//平面面积
|
planeDistance() {
|
// earthCtrl.analysis.getPlaneArea(function (e) { });
|
|
sgworld.Analysis.planeArea(this.colorAll, () => {
|
});
|
|
},
|
//表面距离
|
surfaceDistance() {
|
sgworld.Analysis.horizontalDistance(this.colorAll, () => {
|
});
|
},
|
//点漫游
|
pointRoam() {
|
earthCtrl.Analysis.setPointFly();
|
},
|
//线漫游
|
lineRoam() {
|
earthCtrl.Command.execute(2, 3, "", (data) => {
|
data.showPoint = false;
|
data.showLine = true;
|
data.mode = 1;
|
// 弹窗数据
|
window.PathAnimationData = {
|
flyData: data,
|
};
|
window.PathAnimationData.winIndex = layer.open({
|
type: 2,
|
title: "路径动画",
|
shade: false,
|
area: ["352px", "690px"],
|
offset: "r",
|
skin: "other-class",
|
content: SmartEarthRootUrl + "Workers/path/Path.html",
|
end: function () {
|
PathAnimationData.fly && PathAnimationData.fly.exit();
|
},
|
});
|
});
|
},
|
//清除按钮
|
clearALL(id) {
|
|
this.clearTopTools()
|
// id.value.forEach((e) => {
|
|
// });
|
},
|
//清除方法
|
clearTopTools(id) {
|
// if (id) {
|
// switch (id) {
|
// case "a2":
|
// break;
|
// case "a3":
|
// break;
|
// case "b2"://距离测量
|
// case "b3"://面积测量
|
// case "b4"://高程测量
|
// case "b5"://高度测量
|
|
// break;
|
// case "c2": //点
|
// case "c3": //文字
|
// case "c4": //线
|
// case "c5": //矩形
|
// case "c6": //多边形
|
|
// break;
|
// case "d5":
|
|
// break;
|
// case 'f1':
|
|
// break;
|
// }
|
if (this.localPoint) {
|
|
this.localPoint.deleteObject();
|
this.localPoint = null;
|
}
|
const globe = Viewer.scene.globe;
|
if (window.material) {
|
window.material = null;
|
globe.material = null;
|
Viewer.scene.globe.enableLighting = false;
|
return
|
}
|
if (window.DoubleScreen) {
|
window.DoubleScreen && window.DoubleScreen.destroy();
|
window.DoubleScreen = null;
|
const compass = document.getElementsByClassName("bottom_btn")[0];
|
compass.style.right = "70px";
|
}
|
sgworld.Analysis.clearMeasure()
|
sgworld.Creator.SimpleGraphic.clear();
|
this.toolMenu.removeFromMap();
|
sgworld.Creator.SimpleGraphic.clear();
|
// this.toolFlag = null;
|
this.toolMenu = null;
|
// }
|
},
|
clearLeftTools(res) { },
|
};
|
export default menuTool;
|