From aec00ecc093be803860c8675cbe1c4c776a7cb4e Mon Sep 17 00:00:00 2001
From: GuLiMmo <2820890765@qq.com>
Date: Tue, 19 Mar 2024 17:49:21 +0800
Subject: [PATCH] update: 新建航线、事件编辑、kmz文件问题修改
---
src/pages/page-web/projects/routeLine.vue | 262 +++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 217 insertions(+), 45 deletions(-)
diff --git a/src/pages/page-web/projects/routeLine.vue b/src/pages/page-web/projects/routeLine.vue
index d4d852f..52d812a 100644
--- a/src/pages/page-web/projects/routeLine.vue
+++ b/src/pages/page-web/projects/routeLine.vue
@@ -1,16 +1,16 @@
<template>
- <div class="project-wayline-wrapper height-100">
- <a-spin :spinning="loading" :delay="300" tip="加载中" size="large">
- <div style="height: 50px; line-height: 50px; border-bottom: 1px solid #4f4f4f; font-weight: 450;">
+ <div class="project-wayline-wrapper height-100">
+ <a-spin :spinning="loading" :delay="300" tip="加载中" size="large">
+ <div style="height: 50px; line-height: 50px; border-bottom: 1px solid #4f4f4f; font-weight: 450">
<a-row>
<a-col :span="1"></a-col>
<a-col :span="15">历史航线</a-col>
</a-row>
</div>
- <div :style="{ height : height + 'px'}" class="scrollbar">
+ <div :style="{ height: height + 'px' }" class="scrollbar">
<div id="data" class="height-100 uranus-scrollbar" v-if="routeLine.length !== 0" @scroll="onScroll">
<div v-for="wayline in routeLine" :key="wayline.id">
- <div class="wayline-panel" style="padding-top: 5px;" @click="selectRoute(wayline)">
+ <div class="wayline-panel" style="padding-top: 5px" @click="selectRoute(wayline)">
<div class="title">
<a-tooltip :title="wayline.title">
<div class="pr10">{{ wayline.title }}</div>
@@ -21,12 +21,11 @@
</a-tooltip>
<div class="fz20"></div>
</div>
- <div class="ml10 mt5" style="color: hsla(0,0%,100%,0.65);">
- </div>
- <div class="mt5 ml10" style="color: hsla(0,0%,100%,0.35);">
+ <div class="ml10 mt5" style="color: hsla(0, 0%, 100%, 0.65)"></div>
+ <div class="mt5 ml10" style="color: hsla(0, 0%, 100%, 0.35)">
<span class="mr10">开始时间: {{ convertTimestampToDate(wayline.start_time) }}</span>
</div>
- <div class="mt5 ml10" style="color: hsla(0,0%,100%,0.35);">
+ <div class="mt5 ml10" style="color: hsla(0, 0%, 100%, 0.35)">
<span class="mr10">结束时间: {{ convertTimestampToDate(wayline.end_time) }}</span>
</div>
</div>
@@ -36,9 +35,25 @@
<a-empty :image-style="{ height: '60px', marginTop: '60px' }" />
</div>
</div>
- </a-spin>
+ </a-spin>
+
+ <!-- 地图内弹窗 -->
+ <div class="popup-box" ref="popup">
+ <div class="popup-title">
+ <span @click="closePopUp">×</span>
+ </div>
+ <div class="PopUp">
+ <img :src="currentWayline.photo_url" alt="photo" />
+ <div>
+ <div>云台偏航角:{{ currentWayline.gimbal_yaw_degree }}</div>
+ <div>拍摄绝对高度:{{ currentWayline.absolute_altitude }}</div>
+ <div>拍摄相对高度:{{ currentWayline.relative_altitude }}</div>
+ <div>媒体拍摄时间:{{ currentWayline.created_time }}</div>
+ </div>
+ </div>
</div>
- </template>
+ </div>
+</template>
<script lang="ts" setup>
import { reactive } from '@vue/reactivity'
@@ -52,19 +67,42 @@
import { convertTimestampToDate } from '/@/utils/time'
import { cesiumOperation } from '/@/hooks/use-cesium-tsa'
+const getResource = (name: string) => {
+ return new URL(`/src/assets/icons/${name}`, import.meta.url).href
+}
+
const loading = ref(false)
const { appContext } = getCurrentInstance()
const store = useMyStore()
-const pagination :IPage = {
+const pagination: IPage = {
page: 1,
total: -1,
- page_size: 10
+ page_size: 10,
}
const routeLine = ref([])
const workspaceId = computed(() => store.state.common.projectId || localStorage.getItem(ELocalStorageKey.WorkspaceId))
const canRefresh = ref(true)
const height = ref()
-const { removeById, addPolyline, getEntityById, flyTo, removeAllPoint } = cesiumOperation()
+const {
+ addPoint,
+ addClickEvent,
+ removeClickEvent,
+ removeById,
+ addPolyline,
+ getEntityById,
+ flyTo,
+ removeAllPoint,
+ removeAllDataSource,
+} = cesiumOperation()
+const isShowPopUp = ref<boolean>(false)
+const popup = ref(null)
+const currentWayline = ref({
+ photo_url: '',
+ gimbal_yaw_degree: '',
+ absolute_altitude: '',
+ relative_altitude: '',
+ created_time: '',
+})
onMounted(() => {
const parent = document.getElementsByClassName('scrollbar').item(0)?.parentNode as HTMLDivElement
@@ -91,77 +129,211 @@
pagination.page = res.data.pagination.page
}
-async function selectRoute (wayline) {
+async function selectRoute (wayline: { start_time: string; id: string }) {
+ currentWayline.value = {
+ photo_url:
+ 'https://dev.jxpskj.com:8026/cloud-bucket/5abb3b6e-cb42-40e4-b086-9c24db0e8765/DJI_202311171122_004_5abb3b6e-cb42-40e4-b086-9c24db0e8765/DJI_20231117112319_0001_W_%E8%88%AA%E7%82%B91.jpeg',
+ gimbal_yaw_degree: '81°',
+ absolute_altitude: '120m',
+ relative_altitude: '120m',
+ created_time: new Date(wayline.start_time).toLocaleString(),
+ }
+ // currentWayline.value = wayline
// 判断是否有历史航线的id实体
const entity = getEntityById('drone_route_history')
+ const billboard = getEntityById('start_point_billboard')
+ billboard && removeById('start_point_billboard')
+ const element: HTMLDivElement | any = document.querySelector('.popup-box') || popup.value
if (entity) {
removeById('drone_route_history')
+ removeClickEvent()
+ element.style.display = 'none'
}
// 航线经纬度存储数组
- let routeLine = []
+ let routeLine: Cesium.Cartesian3[] | any = []
const res = await getHistoryDetail(wayline.id)
if (res.code !== 0) return
- res.data.forEach(v => {
+ res.data.forEach((v: { longitude: number; latitude: number }) => {
routeLine.push(v.longitude)
routeLine.push(v.latitude)
})
const pointOption = {
longitude: routeLine[0],
- latitude: routeLine[1]
+ latitude: routeLine[1],
}
routeLine = Cesium.Cartesian3.fromDegreesArray(routeLine)
+ // 添加起飞点图片
+ const billboardSetting = {
+ ...pointOption,
+ billboard: {
+ image:
+ 'https://dev.jxpskj.com:8026/cloud-bucket/5abb3b6e-cb42-40e4-b086-9c24db0e8765/DJI_202311171122_004_5abb3b6e-cb42-40e4-b086-9c24db0e8765/DJI_20231117112319_0001_W_%E8%88%AA%E7%82%B91.jpeg',
+ width: 40,
+ height: 40,
+ pixelOffset: new Cesium.Cartesian2(0, -10),
+ horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
+ verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+ // scaleByDistance: new Cesium.NearFarScalar(1.5e2, 1.5, 8.0e6, 0.0),
+ },
+ point: {
+ pixelSize: 5,
+ color: Cesium.Color.RED,
+ outlineColor: Cesium.Color.WHITE,
+ outlineWidth: 2,
+ },
+ label: {
+ text: '起飞点',
+ font: '12pt monospace',
+ style: Cesium.LabelStyle.FILL_AND_OUTLINE,
+ outlineWidth: 1,
+ verticalOrigin: Cesium.VerticalOrigin.TOP,
+ pixelOffset: new Cesium.Cartesian2(0, 10),
+ },
+ id: 'start_point_billboard',
+ }
+ addPoint(billboardSetting)
+ // 添加广告牌点击事件
+ addClickEvent('start_point_billboard', addBillboard)
+ function addBillboard (
+ _click: any,
+ _pick: any,
+ viewer: { container: { append: (arg0: any) => void }; scene: Cesium.Scene },
+ ) {
+ viewer.scene.postRender.removeEventListener(addBillboard)
+ viewer.container.append(element)
+ if (isShowPopUp.value) {
+ element.style.display = 'none'
+ } else {
+ element.style.display = 'block'
+ }
+ isShowPopUp.value = !isShowPopUp.value
+ const { longitude, latitude } = pointOption
+ viewer.scene.postRender.addEventListener(() => {
+ const windowCoord = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
+ viewer.scene,
+ Cesium.Cartesian3.fromDegrees(longitude, latitude, 0),
+ )
+ const x = windowCoord.x + 40
+ const y = windowCoord.y - element.offsetHeight / 2 - 40
+ element.style.transform = `
+ translate3d(${Math.round(x)}px,${Math.round(y)}px, 0)
+ `
+ })
+ }
// 无人机历史路线轨迹
const routeTrajectory = {
longitude: 115.85666327144976,
latitude: 28.62452712442823,
id: 'drone_route_history',
polyline: {
- width: 5,
+ width: 10,
positions: routeLine,
- material: Cesium.Color.BLUE
+ material: Cesium.Color.BLUE,
+ clampToGround: false, // 关闭贴地效果,保留高度
},
}
addPolyline(routeTrajectory)
// 飞向第一个坐标点
flyTo(pointOption, 4, 1000)
}
+
+const closePopUp = () => {
+ const element: HTMLDivElement | any = document.querySelector('.popup-box') || popup.value
+ element.style.display = 'none'
+}
+
function onScroll (e: any) {
const element = e.srcElement
- if (element.scrollTop + element.clientHeight >= element.scrollHeight - 5 && Math.ceil(pagination.total / pagination.page_size) > pagination.page && canRefresh.value) {
+ if (
+ element.scrollTop + element.clientHeight >= element.scrollHeight - 5 &&
+ Math.ceil(pagination.total / pagination.page_size) > pagination.page &&
+ canRefresh.value
+ ) {
pagination.page++
getHistoryWay()
}
}
+
+onMounted(() => {
+ removeAllPoint()
+})
onUnmounted(() => {
// removeById('drone_route_history')
removeAllPoint()
})
-
</script>
- <style lang="scss" scoped>
- .wayline-panel {
- background: #3c3c3c;
- margin-left: auto;
- margin-right: auto;
- margin-top: 10px;
- height: 90px;
- width: 95%;
- font-size: 13px;
- border-radius: 2px;
- cursor: pointer;
- .title {
- display: flex;
- flex-direction: row;
- align-items: center;
- height: 30px;
- font-weight: bold;
- margin: 0px 10px 0 10px;
+<style lang="scss" scoped>
+.wayline-panel {
+ background: #3c3c3c;
+ margin-left: auto;
+ margin-right: auto;
+ margin-top: 10px;
+ height: 90px;
+ width: 95%;
+ font-size: 13px;
+ border-radius: 2px;
+
+ .title {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ height: 30px;
+ font-weight: bold;
+ margin: 0px 10px 0 10px;
+ }
+}
+
+.popup-box {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: none;
+ background-color: #fff;
+ padding-top: 0;
+ border-radius: 5px;
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+ .popup-title {
+ display: flex;
+ justify-content: flex-end;
+ padding: 0 10px;
+ span {
+ text-align: right;
+ cursor: pointer;
+ font-weight: bolder;
+ display: block;
+ width: 25px;
}
}
- .uranus-scrollbar {
- overflow: auto;
- scrollbar-width: thin;
- scrollbar-color: #c5c8cc transparent;
+
+ .PopUp {
+ width: 250px;
+ padding: 10px;
+ padding-top: 0px;
+ position: relative;
+
+ &::after {
+ content: '';
+ position: absolute;
+ top: calc(50% - 6px);
+ left: -12px;
+ width: 0px;
+ height: 0px;
+ border-style: solid;
+ border-width: 12px;
+ border-color: #fff #fff transparent transparent;
+ transform: rotate(225deg);
+ }
+
+ img {
+ width: 100%;
+ }
}
- </style>
+}
+
+.uranus-scrollbar {
+ overflow: auto;
+ scrollbar-width: thin;
+ scrollbar-color: #c5c8cc transparent;
+}
+</style>
--
Gitblit v1.9.3