ly-front/src/components/myMars.vue

343 lines
9.5 KiB
Vue
Raw Normal View History

2025-03-31 15:26:29 +00:00
<template>
<div class="ditu">
<div class="main">
<div
id="marsContainer-mymap"
ref="marsMaps1"
class="mars3d-container"
></div>
</div>
</div>
</template>
<script>
"use script";
export default {
name: "myMars",
props: {
historyList: {
type: Array,
default: () => []
}
},
data() {
return {
inputs: "",
checkInterval: null,
time: null
};
},
components: {},
watch: {
historyList: {
handler(val) {
let value = JSON.parse(JSON.stringify(val));
if (value) {
this.startCheckTimer(value);
}
},
deep: true,
immediate: true
}
},
mounted() {
this.getMapJson();
},
methods: {
getMapJson() {
// eslint-disable-next-line no-undef
mars3d.Util.fetchJson({
url: "/configJson/mapMars.json"
}).then((res) => {
this.initMarsMap({
// 合并配置项
...res.map3d
});
});
},
initMarsMap(options) {
// eslint-disable-next-line no-undef
this.mapMars = new mars3d.Map(this.$refs.marsMaps1, options);
this.mapMars.unbindContextMenu(); //map上解绑默认菜单
const layerId = `marsContainer-warningMap`;
this.graphicLayer = this.mapMars.getLayerById(layerId);
if (!this.graphicLayer) {
// eslint-disable-next-line no-undef
this.graphicLayer = new mars3d.layer.GraphicLayer({ id: layerId });
this.mapMars.addLayer(this.graphicLayer);
}
// eslint-disable-next-line no-undef
this.clockAnimate = new mars3d.control.ClockAnimate({});
this.mapMars.addControl(this.clockAnimate);
// map构造完成后的一些处理
this.onMapLoad();
// map.on(mars3d.EventType.dblClick, map_dblClickHandler, graphicLayer);
// map.on(mars3d.EventType.click, map_clickHandler, graphicLayer)
},
onMapLoad() {
// 设置鼠标操作习惯,更换中键和右键
this.mapMars.changeMouseModel(true);
// eslint-disable-next-line no-undef
this.mapMars.scene.mode = Cesium.SceneMode.SCENE3D;
// 时间轴
// const timeline = new mars3d.control.Timeline();
// this.mapMars.addControl(timeline);
},
// 计时器
startCheckTimer(value) {
if (this.checkInterval) {
clearInterval(this.checkInterval);
}
this.checkInterval = setInterval(() => {
if (this.mapMars !== undefined) {
clearInterval(this.checkInterval);
this.onProcessTraceability(value);
}
}, 100);
},
onProcessTraceability(mapList) {
// eslint-disable-next-line no-undef
const property = new Cesium.SampledPositionProperty();
// eslint-disable-next-line no-undef
property.forwardExtrapolationType = Cesium.ExtrapolationType.HOLD;
2025-04-01 16:12:21 +00:00
const app_property = new Cesium.SampledPositionProperty();
// eslint-disable-next-line no-undef
app_property.forwardExtrapolationType = Cesium.ExtrapolationType.HOLD;
2025-03-31 15:26:29 +00:00
let start;
let stop;
for (let i = 0, len = mapList.length; i < len; i++) {
const item = mapList[i];
const lng = Number(item.lon); // 经度
const lat = Number(item.lat); // 纬度
2025-04-01 16:12:21 +00:00
const app_lng = Number(item.app_lon); // 经度
const app_lat = Number(item.app_lat); // 纬度
2025-03-31 15:26:29 +00:00
const height = item.alt || 5; // 高度5 是避免与geojson高度冲突
const outputDate = item.createTime.replace(" ", "T");
const time = outputDate; // 时间
let position = null;
2025-04-01 16:12:21 +00:00
let app_position = null;
2025-03-31 15:26:29 +00:00
if (lng !== 0 && lat !== 0) {
if (lng && lat) {
// eslint-disable-next-line no-undef
position = Cesium.Cartesian3.fromDegrees(lng, lat, height);
2025-04-01 16:12:21 +00:00
app_position = Cesium.Cartesian3.fromDegrees(app_lng, app_lat, 0);
2025-03-31 15:26:29 +00:00
}
let juliaDate = null;
if (time) {
// eslint-disable-next-line no-undef
juliaDate = Cesium.JulianDate.fromIso8601(time);
}
if (position && juliaDate) {
property.addSample(juliaDate, position);
}
2025-04-01 16:12:21 +00:00
if (app_position && juliaDate) {
app_property.addSample(juliaDate, app_position);
}
2025-03-31 15:26:29 +00:00
if (i === 0) {
start = juliaDate;
} else if (i === len - 1) {
stop = juliaDate;
}
} else {
console.log("经纬度为0忽略该数据");
}
}
// 设置时钟属性
if (stop === undefined) {
stop = start;
}
this.mapMars.clock.startTime = start.clone();
this.mapMars.clock.stopTime = stop.clone();
this.mapMars.clock.currentTime = start.clone();
// eslint-disable-next-line no-undef
this.mapMars.clock.clockRange = Cesium.ClockRange.UNBOUNDED;
this.mapMars.clock.multiplier = 1;
if (this.mapMars.controls.timeline) {
this.mapMars.controls.timeline.zoomTo(start, stop);
}
//根据当前时间改变左侧绿灯颜色
// this.mapMars.on("clockTick", function (clock) {
// // const time = Cesium.JulianDate.toIso8601(clock.currentTime)
// // let times = moment(time).format('HH:mm:ss')
// console.log(clock);
// });
this.clearDraw();
// 创建无人机对象
let pathEntity = this.graphicLayer.getGraphicById("pathIdsss");
if (!pathEntity) {
pathEntity = new mars3d.graphic.ModelEntity({
id: "pathIdsss",
position: property,
orientation: new Cesium.VelocityOrientationProperty(property),
billboard: {
2025-04-01 16:12:21 +00:00
image: require("@/assets/img/uav.svg"),
2025-03-31 15:26:29 +00:00
scale: 0.5,
minimumPixelSize: 30,
distanceDisplayCondition_far: 1000000,
distanceDisplayCondition_near: 1000
},
path: {
width: 2,
color: "#FF0000"
},
flyTo: true,
flyToOptions: {
duration: 2,
minHeight: 5000,
maxHeight: 8000
}
});
this.graphicLayer.addGraphic(pathEntity);
}
2025-04-01 16:12:21 +00:00
// 飞手位置
let app_pathEntity = this.graphicLayer.getGraphicById(
"pathIdsss" + "_app"
);
if (!app_pathEntity) {
app_pathEntity = new mars3d.graphic.ModelEntity({
id: "pathIdsss" + "_app",
position: app_property,
orientation: new Cesium.VelocityOrientationProperty(app_property),
point: {
color: "#00ffff",
pixelSize: 8,
outlineColor: "#ffffff",
outlineWidth: 2
},
path: {
width: 2,
color: "#FF0000"
},
style: {
label: {
text: "飞手位置",
font_size: 14,
font_family: "微软雅黑"
}
}
});
this.graphicLayer.addGraphic(app_pathEntity);
}
2025-03-31 15:26:29 +00:00
},
clearDraw() {
if (this.graphics) {
this.mapMars.removeLayer(this.graphics);
}
if (this.graphicLayer) {
this.graphicLayer.clear();
}
},
clearInterval() {
clearInterval(this.time);
}
},
beforeDestroy() {
if (this.mapMars) {
this.mapMars.destroy();
this.mapMars = null;
}
}
};
</script>
<style lang="scss" scoped>
.ditu {
width: 100%;
height: 100%;
position: relative;
.main {
width: 100%;
height: 100%;
display: flex;
position: relative;
justify-content: flex-start;
#marsContainer-mymap {
width: 100%;
height: 50vh;
// margin-left: 8%;
}
//历史轨迹气泡
#trajectoryPopup {
padding: 10px 10px 0px 10px;
.popTitle {
margin-bottom: 5px;
}
.mars3d-popup-background {
background: rgba(13, 40, 64, 0.9);
}
.popLonLat {
display: flex;
align-items: center;
justify-content: space-around;
}
#copyBtn {
width: max-content;
border: 0.5px solid #fff;
border-radius: 2px;
padding: 3px 9px;
color: #fff;
background: linear-gradient(
90deg,
rgba(77, 154, 247, 1) 0%,
rgba(8, 98, 205, 1) 100%
);
cursor: pointer;
font-size: 12px;
font-weight: 500;
margin-right: 5px;
}
}
#marsContainer-map {
width: 35vh;
height: 35vh;
margin-left: 8%;
.mars3d-divlayer {
.mars3d-divGraphic {
.lbPopup {
.mars3d-popup-background {
background: rgba(13, 40, 64, 0.9);
}
.mars3d-popup-content-wrapper {
width: 300px;
.mars3d-popup-content {
.popLonLat {
display: flex;
align-items: center;
justify-content: space-around;
.popTitle {
font-size: 12px;
}
#copyBtn {
border: 0.5px solid #fff;
border-radius: 2px;
padding: 3px 9px;
color: #fff;
background: linear-gradient(
90deg,
rgba(77, 154, 247, 1) 0%,
rgba(8, 98, 205, 1) 100%
);
cursor: pointer;
font-size: 12px;
font-weight: 500;
margin-right: 5px;
}
}
}
}
}
}
}
}
}
}
</style>