人员聚集告警地图显示

pull/3/head
fangjiakai 2024-02-28 10:44:18 +08:00
parent 46f099a696
commit ab5d7f4378
7 changed files with 1665 additions and 1340 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

View File

@ -0,0 +1,84 @@
<template>
<div id="bi_container">
<div id="map" class="map_bg"></div>
</div>
</template>
<script setup>
import { onBeforeUnmount, onMounted } from "vue";
import { initMap, handleViewAlarm, handleMouseClick } from "./map";
import { useUserStore } from "@/pinia/user.js";
import { getEnterpriseInfo } from "@/request/enterprise_management.js";
const props = defineProps({
alarm: {
type: Object,
required: true,
default: null,
},
userList: {
type: Array,
required: true,
default: () => [],
},
});
const userStore = useUserStore();
const CORPINFO_ID = userStore.getUserInfo.CORPINFO_ID;
onMounted(async () => {
const corp = await getEnterpriseInfo({ CORPINFO_ID });
initMap(corp.pd);
handleMouseClick();
handleViewAlarm(props.alarm, props.userList);
});
onBeforeUnmount(() => {
window.$scene = null;
window.$icy = null;
window.$carmer = null;
});
</script>
<style scoped lang="scss">
#bi_container {
width: 100%;
height: 600px;
color: #ffffff;
position: relative;
font-size: 14px;
.map_bg {
width: 100%;
height: 540px;
}
.options {
margin-top: 10px;
display: flex;
align-items: center;
padding: 10px;
.option {
margin-right: 20px;
cursor: pointer;
text-align: center;
img {
width: 46px;
height: 46px;
}
.label {
margin-top: 10px;
font-size: 12px;
}
}
.id {
background-color: #1b284a;
padding: 10px;
border-radius: 4px;
height: 37px;
}
}
}
</style>

View File

@ -138,7 +138,7 @@ export const handleMouseClick = (model_id) => {
// 隐藏逻辑 // 隐藏逻辑
$mouse.mouseLeft((model) => { $mouse.mouseLeft((model) => {
if (model._name === "建筑") { if (model._name === "建筑") {
model_id.value = model._id; if (model_id) model_id.value = model._id;
clickBuilding(model); clickBuilding(model);
} }
}); });
@ -333,3 +333,68 @@ const addEntity = (id, name, lon, lat, height) => {
}; };
entities.add(obj); entities.add(obj);
}; };
export const handleViewAlarm = (alarm, userList) => {
const canvas = document.createElement("canvas");
canvas.width = 100;
canvas.height = 30;
const ctx = canvas.getContext("2d");
ctx.fillStyle = "#000000";
ctx.fillRect(0, 0, 100, 50);
ctx.fillStyle = "#ff0000";
ctx.font = "normal bold 20px Arial";
ctx.fillText("聚集告警", 5, 15);
// 聚集圆锥特效
const Cone = new window.CustomCesium.Cone(window.$icy);
Cone.add(
[alarm.lon, alarm.lat, alarm.alt], // 坐标
alarm.color, // 圆锥颜色
{ width: 20, height: 40 }, // 圆锥的宽高
canvas, // 圆锥铭牌
"100201", // 圆锥实体id
"10020101" // 铭牌实体id
);
const labelPixelOffset = new window.Cesium.Cartesian2(0, -55);
userList.forEach((user) => {
const obj = {};
obj.entity = window.$icy.viewer.entities.add(
new window.Cesium.Entity({
id: "user_" + user.card,
name: user.psnName,
position: window.Cesium.Cartesian3.fromDegrees(
user.lon,
user.lat,
user.alt
),
billboard: {
image: "src/assets/images/map/peoIcon_blueImg.png",
height: 36,
width: 30,
verticalOrigin: window.Cesium.VerticalOrigin.BOTTOM,
horizontalOrigin: window.Cesium.HorizontalOrigin.CENTER,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
},
label: {
text: user.psnName,
font: "13px sans-serif",
pixelOffset: labelPixelOffset,
showBackground: true,
// 地图上扎点的名字背景色
// eslint-disable-next-line new-cap
backgroundColor: new window.Cesium.Color.fromCssColorString(
"rgba(20, 58, 142, 1)"
),
backgroundPadding: new window.Cesium.Cartesian2(7, 5),
disableDepthTestDistance: Number.POSITIVE_INFINITY,
},
})
);
obj.show = (e) => {
obj.entity.show = e;
};
obj.destroy = () => {
window.$icy.viewer.entities.remove(obj.entity);
};
});
};

View File

@ -10,3 +10,5 @@ export const getAggregatedDataStatistics = (params) =>
post("/positAlarm/aggregateDataStatistics", params); // 聚集区域统计 post("/positAlarm/aggregateDataStatistics", params); // 聚集区域统计
export const getAggregationAreaStatistics = (params) => export const getAggregationAreaStatistics = (params) =>
post("/positAlarm/aggregateDataStatisticsByGroup", params); // 聚集数据统计 post("/positAlarm/aggregateDataStatisticsByGroup", params); // 聚集数据统计
export const getAlarmGatherPsnInfo = (params) =>
post("/positAlarm/getAlarmGatherPsnInfo", params); // 聚集告警内人员列表

View File

@ -0,0 +1,42 @@
<template>
<el-dialog v-model="visible" title="告警信息" :on-close="fnClose">
<alarmView
v-if="visible"
:alarm="props.alarm"
:user-list="props.userList"
/>
<template #footer>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModels } from "@vueuse/core";
import alarmView from "@/components/map_tools/alarm_view";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
alarm: {
type: Object,
required: true,
default: null,
},
userList: {
type: Array,
required: true,
default: () => [],
},
});
const emits = defineEmits(["update:visible", "get-data"]);
const { visible } = useVModels(props, emits);
const fnClose = () => {
visible.value = false;
};
</script>
<style scoped lang="scss"></style>

View File

@ -61,6 +61,13 @@
<el-button type="primary" @click="fnSubmit"></el-button> <el-button type="primary" @click="fnSubmit"></el-button>
</template> </template>
</el-dialog> </el-dialog>
<alarm_dialog
v-model:visible="data.alarmDialogDialog.visible"
:alarm="data.alarmDialogDialog.alarm"
:user-list="data.alarmDialogDialog.userList"
@get-data="fnResetPagination"
/>
</template> </template>
<script setup> <script setup>
@ -69,7 +76,12 @@ import { debounce } from "throttle-debounce";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import { serialNumber } from "@/assets/js/utils.js"; import { serialNumber } from "@/assets/js/utils.js";
import useListData from "@/assets/js/useListData.js"; import useListData from "@/assets/js/useListData.js";
import { getGatheringAlarmRecordViewList } from "@/request/aggregation_management.js"; import {
getAlarmGatherPsnInfo,
getGatheringAlarmRecordViewList,
} from "@/request/aggregation_management.js";
import alarm_dialog from "./alarmDialog.vue";
import { reactive } from "vue";
const props = defineProps({ const props = defineProps({
visible: { visible: {
@ -83,6 +95,14 @@ const props = defineProps({
default: () => ({}), default: () => ({}),
}, },
}); });
const data = reactive({
alarmDialogDialog: {
alarm: null,
userList: null,
visible: false,
},
});
const emits = defineEmits(["update:visible", "update:form", "get-data"]); const emits = defineEmits(["update:visible", "update:form", "get-data"]);
const { visible } = useVModels(props, emits); const { visible } = useVModels(props, emits);
const { list, searchForm, pagination, fnGetData, fnResetPagination } = const { list, searchForm, pagination, fnGetData, fnResetPagination } =
@ -108,9 +128,12 @@ const fnGetDataTransfer = () => {
gatherId: props.form.id, gatherId: props.form.id,
}); });
}; };
const fnViewLocation = (row) => { const fnViewLocation = async (row) => {
console.log(row); const res = await getAlarmGatherPsnInfo({ id: row.id });
// positAlarm/getAlarmGatherPsnInfo
data.alarmDialogDialog.alarm = row;
data.alarmDialogDialog.userList = res.data;
data.alarmDialogDialog.visible = true;
}; };
const fnResetPaginationTransfer = () => { const fnResetPaginationTransfer = () => {
fnResetPagination({ fnResetPagination({