| | |
| | | <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 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> |
| | |
| | | <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> |
| | |
| | | </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> |
| | |
| | | <span @click="closePopUp">×</span> |
| | | </div> |
| | | <div class="PopUp"> |
| | | <img :src="currentWayline.photo_url" alt="photo"> |
| | | <img :src="currentWayline.photo_url" alt="photo" /> |
| | | <div> |
| | | <div>云台偏航角:{{ currentWayline.gimbal_yaw_degree }}</div> |
| | | <div>拍摄绝对高度:{{ currentWayline.absolute_altitude }}</div> |
| | |
| | | import * as Cesium from 'cesium' |
| | | import { convertTimestampToDate } from '/@/utils/time' |
| | | import { cesiumOperation } from '/@/hooks/use-cesium-tsa' |
| | | import { NONAME } from 'dns' |
| | | import CustomerSportLine from '/@/utils/cesium/customerSportLine' |
| | | |
| | | const getResource = (name: string) => { |
| | | return new URL(`/src/assets/icons/${name}`, import.meta.url).href |
| | | } |
| | | |
| | | const loading = ref(false) |
| | | const { appContext } = getCurrentInstance() |
| | |
| | | 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 { addPoint, addClickEvent, removeClickEvent, removeById, addPolyline, getEntityById, flyTo, removeAllPoint, removeAllDataSource } = cesiumOperation() |
| | | const { |
| | | addPoint, |
| | | addClickEvent, |
| | | removeClickEvent, |
| | | removeById, |
| | | addPolyline, |
| | | getEntityById, |
| | | flyTo, |
| | | removeAllPoint, |
| | | removeAllDataSource, |
| | | } = cesiumOperation() |
| | | const isShowPopUp = ref<boolean>(false) |
| | | const popup = ref(null) |
| | | const currentWayline = ref({ |
| | |
| | | gimbal_yaw_degree: '', |
| | | absolute_altitude: '', |
| | | relative_altitude: '', |
| | | created_time: '' |
| | | created_time: '', |
| | | }) |
| | | |
| | | onMounted(() => { |
| | |
| | | |
| | | 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', |
| | | 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() |
| | | created_time: new Date(wayline.start_time).toLocaleString(), |
| | | } |
| | | // currentWayline.value = wayline |
| | | // 判断是否有历史航线的id实体 |
| | |
| | | }) |
| | | 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', |
| | | 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), |
| | |
| | | pixelSize: 5, |
| | | color: Cesium.Color.RED, |
| | | outlineColor: Cesium.Color.WHITE, |
| | | outlineWidth: 2 |
| | | outlineWidth: 2, |
| | | }, |
| | | label: { |
| | | text: '起飞点', |
| | |
| | | style: Cesium.LabelStyle.FILL_AND_OUTLINE, |
| | | outlineWidth: 1, |
| | | verticalOrigin: Cesium.VerticalOrigin.TOP, |
| | | pixelOffset: new Cesium.Cartesian2(0, 10) |
| | | pixelOffset: new Cesium.Cartesian2(0, 10), |
| | | }, |
| | | id: 'start_point_billboard' |
| | | 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 }) { |
| | | 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) { |
| | |
| | | viewer.scene.postRender.addEventListener(() => { |
| | | const windowCoord = Cesium.SceneTransforms.wgs84ToWindowCoordinates( |
| | | viewer.scene, |
| | | Cesium.Cartesian3.fromDegrees(longitude, latitude, 0) |
| | | Cesium.Cartesian3.fromDegrees(longitude, latitude, 0), |
| | | ) |
| | | const x = windowCoord.x + 40 |
| | | const y = windowCoord.y - (element.offsetHeight / 2) - 40 |
| | | const y = windowCoord.y - element.offsetHeight / 2 - 40 |
| | | element.style.transform = ` |
| | | translate3d(${Math.round(x)}px,${Math.round(y)}px, 0) |
| | | ` |
| | |
| | | latitude: 28.62452712442823, |
| | | id: 'drone_route_history', |
| | | polyline: { |
| | | width: 5, |
| | | width: 10, |
| | | positions: routeLine, |
| | | material: Cesium.Color.BLUE |
| | | // material: Cesium.Color.BLUE |
| | | material: new CustomerSportLine({ |
| | | color: Cesium.Color.WHITE, |
| | | speed: 20, |
| | | image: getResource('arrow.png'), |
| | | repeat: { x: 15, y: 0 }, |
| | | }), |
| | | clampToGround: false, // 关闭贴地效果,保留高度 |
| | | }, |
| | | } |
| | | addPolyline(routeTrajectory) |
| | |
| | | |
| | | 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() |
| | | } |
| | |
| | | // removeById('drone_route_history') |
| | | removeAllPoint() |
| | | }) |
| | | |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | |
| | | background-color: #fff; |
| | | padding-top: 0; |
| | | border-radius: 5px; |
| | | box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); |
| | | box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); |
| | | .popup-title { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | |
| | | cursor: pointer; |
| | | font-weight: bolder; |
| | | display: block; |
| | | width: 25px |
| | | width: 25px; |
| | | } |
| | | } |
| | | |
| | |
| | | overflow: auto; |
| | | scrollbar-width: thin; |
| | | scrollbar-color: #c5c8cc transparent; |
| | | }</style> |
| | | } |
| | | </style> |