|
@@ -28,7 +28,7 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="video-box">
|
|
|
- <HKVideo :dot_data="detailData" autoplay style="height: 100%" />
|
|
|
+ <HKVideo ref="videoRef" :dot_data="detailData" autoplay style="height: 100%" />
|
|
|
</div>
|
|
|
<div class="control-container">
|
|
|
<div class="common-title-box">操作台</div>
|
|
@@ -65,7 +65,7 @@
|
|
|
</div>
|
|
|
<div class="operate-box">
|
|
|
<div class="common-btn-primary5">开始巡航</div>
|
|
|
- <div class="common-btn-primary5">截图</div>
|
|
|
+ <div class="common-btn-primary5" @click="handleScreenshot">截图</div>
|
|
|
<div class="common-btn-primary5">录像</div>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -86,6 +86,7 @@ import videoImg from '@/assets/images/dotIcon/33_forest_defense_video.png';
|
|
|
import VectorLayer from 'ol/layer/Vector';
|
|
|
import VectorSource from 'ol/source/Vector';
|
|
|
import Polygon from 'ol/geom/Polygon';
|
|
|
+import { getPtzInfo } from '@/api/globalMap/forestDefenseVideo';
|
|
|
|
|
|
const props = defineProps({
|
|
|
id: String,
|
|
@@ -113,24 +114,26 @@ let detailData = ref({
|
|
|
lat: 0,
|
|
|
type: '',
|
|
|
speed: 0,
|
|
|
- video_code: '',
|
|
|
- radius: 0,
|
|
|
- startAngle: 0,
|
|
|
- endAngle: 0
|
|
|
+ video_code: ''
|
|
|
+});
|
|
|
+let ptzInfo = ref({
|
|
|
+ Distance: 0,
|
|
|
+ AngelH: 0,
|
|
|
+ AzimuthH: 0
|
|
|
});
|
|
|
|
|
|
const getData = () => {
|
|
|
+ getPtzInfo({ code: props.id }).then((res) => {
|
|
|
+ ptzInfo.value = res.data;
|
|
|
+ });
|
|
|
detailData.value = {
|
|
|
- title: '高州市根子镇上炕村委会23211312',
|
|
|
+ title: '高州市根子镇上炕村委会',
|
|
|
address: '茂名市高州市坡心东南约400米',
|
|
|
lng: 110.819207,
|
|
|
lat: 21.711887,
|
|
|
type: '云台',
|
|
|
speed: 246,
|
|
|
- video_code: '44092251001320000009',
|
|
|
- radius: 10000,
|
|
|
- startAngle: 0,
|
|
|
- endAngle: 30
|
|
|
+ video_code: '44090000001321000033',
|
|
|
};
|
|
|
initDot();
|
|
|
};
|
|
@@ -205,11 +208,9 @@ const handleFocusControl = (type) => {
|
|
|
// 控制视角移动
|
|
|
const handleControl = (type) => {
|
|
|
if (type === 'left') {
|
|
|
- detailData.value.startAngle -= 1;
|
|
|
- detailData.value.endAngle -= 1;
|
|
|
+ ptzInfo.value.AzimuthH -= 10;
|
|
|
} else if (type === 'right') {
|
|
|
- detailData.value.startAngle += 1;
|
|
|
- detailData.value.endAngle += 1;
|
|
|
+ ptzInfo.value.AzimuthH += 10;
|
|
|
}
|
|
|
if (visibleRange.value) {
|
|
|
createSector();
|
|
@@ -218,8 +219,9 @@ const handleControl = (type) => {
|
|
|
// 新增扇形
|
|
|
const createSector = () => {
|
|
|
removeSector();
|
|
|
+ const { startAngle, endAngle } = calculateAngle(ptzInfo.value.AzimuthH, ptzInfo.value.AngelH);
|
|
|
const center = turf.point([detailData.value.lng, detailData.value.lat]);
|
|
|
- const sectorData = turf.sector(center, detailData.value.radius / 1000, detailData.value.startAngle, detailData.value.endAngle);
|
|
|
+ const sectorData = turf.sector(center, ptzInfo.value.Distance / 1000, startAngle, endAngle);
|
|
|
if (AMapType.includes(props.activeMap)) {
|
|
|
sector = new AMap.Polyline({
|
|
|
path: sectorData.geometry.coordinates,
|
|
@@ -282,7 +284,7 @@ const addVisibleRange = () => {
|
|
|
// 圆形范围
|
|
|
circle = new AMap.Circle({
|
|
|
center: new AMap.LngLat(detailData.value.lng, detailData.value.lat),
|
|
|
- radius: detailData.value.radius,
|
|
|
+ radius: ptzInfo.value.Distance,
|
|
|
strokeColor: '#ff0000', // 线颜色
|
|
|
strokeOpacity: 0.35, // 线透明度
|
|
|
strokeWeight: 1, // 线宽
|
|
@@ -292,7 +294,7 @@ const addVisibleRange = () => {
|
|
|
map.add(circle);
|
|
|
} else if (YMapType.includes(props.activeMap)) {
|
|
|
const center = turf.point([detailData.value.lng, detailData.value.lat]);
|
|
|
- const sectorData = turf.sector(center, detailData.value.radius / 1000, 0, 360);
|
|
|
+ const sectorData = turf.sector(center, ptzInfo.value.Distance / 1000, 0, 360);
|
|
|
|
|
|
circle = new Feature({
|
|
|
geometry: new Polygon(sectorData.geometry.coordinates)
|
|
@@ -312,7 +314,7 @@ const addVisibleRange = () => {
|
|
|
// const center = [detailData.value.lng, detailData.value.lat];
|
|
|
// circle = new Feature({
|
|
|
// geometry: new Circle(center, 100)
|
|
|
- // // geometry: new Circle(center, detailData.value.radius)
|
|
|
+ // // geometry: new Circle(center, ptzInfo.value.Distance)
|
|
|
// });
|
|
|
// circle.setStyle(
|
|
|
// new Style({
|
|
@@ -354,6 +356,46 @@ const removeSector = () => {
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
+const calculateAngle = (azimuthH, angelH) => {
|
|
|
+ // Normalize the azimuthH to be within [0, 360) degrees in deci-degrees
|
|
|
+ azimuthH = azimuthH % 3600; // 360 degrees * 10 = 3600 deci-degrees
|
|
|
+
|
|
|
+ // Convert deci-degrees to degrees for calculations (but we'll still use azimuthH_deci for clarity)
|
|
|
+ const azimuthH_deci = azimuthH;
|
|
|
+ const azimuthH_deg = azimuthH / 10;
|
|
|
+
|
|
|
+ // Calculate the start angle in deci-degrees
|
|
|
+ let startAngle_deci = azimuthH_deci - angelH / 2;
|
|
|
+
|
|
|
+ // Ensure the start angle is within [0, 3600) deci-degrees
|
|
|
+ if (startAngle_deci < 0) {
|
|
|
+ startAngle_deci += 3600;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Convert start angle back to degrees
|
|
|
+ const startAngle_deg = startAngle_deci / 10;
|
|
|
+
|
|
|
+ // Calculate the end angle in deci-degrees
|
|
|
+ let endAngle_deci = azimuthH_deci + angelH / 2;
|
|
|
+
|
|
|
+ // Ensure the end angle is within [0, 3600) deci-degrees
|
|
|
+ if (endAngle_deci >= 3600) {
|
|
|
+ endAngle_deci -= 3600;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Convert end angle back to degrees
|
|
|
+ const endAngle_deg = endAngle_deci / 10;
|
|
|
+
|
|
|
+ return {
|
|
|
+ startAngle: startAngle_deg,
|
|
|
+ endAngle: endAngle_deg
|
|
|
+ };
|
|
|
+};
|
|
|
+// 截图
|
|
|
+let videoRef = ref(null);
|
|
|
+const handleScreenshot = () => {
|
|
|
+ videoRef.value.handleScreenshot(detailData.value.title);
|
|
|
+};
|
|
|
watch(
|
|
|
() => props.id,
|
|
|
() => {
|