You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

226 lines
6.2 KiB
Vue

<template>
<div class="pathModal">
<!-- 左侧目录 -->
<div
class="leftMenuDiv"
:style="{
width: leftMenuShow ? '275px' : '0px',
}"
>
<PathLeftMenu
ref="pathLeftMenuRef"
:leftMenuShow="leftMenuShow"
:allWorkspaceDataList="allWorkspaceDataList"
:allAnnotationDataList="allAnnotationDataList"
:nowShowAnnotationData="nowShowAnnotationData"
@changeLeftMenuShow="changeLeftMenuShow"
@handlerLocation="handlerLocation"
@setNowShowAnnotationData="setNowShowAnnotationData"
@setAllAnnotationData="setAllAnnotationData"
@deleteAnnotation="deleteAnnotation"
/>
</div>
<!-- 地图 -->
<div class="mapDiv" :style="{ width: dynamicWidth }">
<PathMap
ref="pathMapRef"
:allAnnotationDataList="allAnnotationDataList"
:nowShowAnnotationData="nowShowAnnotationData"
@setNowShowAnnotationData="setNowShowAnnotationData"
@setAllAnnotationData="setAllAnnotationData"
/>
</div>
<!-- 地图标注 -->
<div class="annotationInfoDiv" v-if="annotationInfoShow">
<PathAnnotationInfo
:allAnnotationDataList="allAnnotationDataList"
:nowShowAnnotationData="nowShowAnnotationData"
@setNowShowAnnotationData="setNowShowAnnotationData"
@closePathAnnotationInfo="closePathAnnotationInfo"
@handlerLocation="handlerLocation"
@deleteAnnotation="deleteAnnotation"
/>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref, computed, onMounted } from 'vue';
import { PathLeftMenu, PathMap, PathAnnotationInfo } from './path';
import { cloneDeep } from 'lodash-es';
import imageJson from './json/image.json';
import { GetWorkspaceList, GetAnnotationList, DeleteAnnotation } from '@/api/demo/mediaLibrary';
import { WktToGeojson, GeojsonToWkt } from '@/components/MapboxMaps/src/WktGeojsonTransform';
import { useMessage } from '@/hooks/web/useMessage';
const { createMessage, createConfirm } = useMessage();
const props = defineProps(['pathRecord']);
// 地图宽度
const dynamicWidth = computed(() => {
let width = 0;
// 左侧目录
if (leftMenuShow.value) {
width += 275;
} else {
width += 0;
}
// 地图标注
if (annotationInfoShow.value) {
width += 320;
}
return 'calc(100% - ' + width + 'px)';
});
// 地图ref
const pathMapRef = ref();
// 左侧目录是否显示----------------------------------------------------
const pathLeftMenuRef = ref();
const leftMenuShow = ref(true);
function changeLeftMenuShow() {
leftMenuShow.value = !leftMenuShow.value;
}
// 右侧标注信息是否显示----------------------------------------------------
const annotationInfoShow = ref(false);
// 关闭右侧标注
function closePathAnnotationInfo() {
annotationInfoShow.value = false;
nowShowAnnotationData.value = {};
pathMapRef.value.annotationRestoreDefault();
}
// 当前展示的标注信息
const nowShowAnnotationData = ref();
const allAnnotationDataList: any = ref([]);
const allWorkspaceDataList: any = ref([]);
// 设置当前展示的标注信息
function setNowShowAnnotationData(value, restore = true) {
if (value.id) {
annotationInfoShow.value = true;
} else {
annotationInfoShow.value = false;
}
if (restore) {
pathMapRef.value.annotationRestoreDefault();
}
nowShowAnnotationData.value = value;
}
// 刷新区域信息
function setAllAnnotationData() {
// 查询地图工作区域
getAnnotationList();
}
// 查询地图标注
function getAnnotationList(showThis = true) {
GetWorkspaceList().then((result1) => {
GetAnnotationList({}).then((result2) => {
allWorkspaceDataList.value = result1;
allAnnotationDataList.value = result2;
if (allAnnotationDataList.value.length > 0) {
allAnnotationDataList.value.forEach((annotation, index) => {
let geomjson = WktToGeojson(annotation.geom);
annotation = {
...annotation,
properties: JSON.parse(annotation.properties),
geomtype: getGeomType(annotation),
coordinates: geomjson.coordinates,
};
allAnnotationDataList.value[index] = annotation;
});
}
if (showThis) {
setTimeout(() => {
pathLeftMenuRef.value.updateShowMenuInfoList('地图标注');
}, 50);
}
});
});
}
// 删除标注
function deleteAnnotation(value) {
if (nowShowAnnotationData.value && nowShowAnnotationData.value.id == value.id) {
annotationInfoShow.value = false;
nowShowAnnotationData.value = {};
}
DeleteAnnotation({
id: value.id,
}).then((result) => {
if (result) {
// 刷新
getAnnotationList();
createMessage.success('删除成功');
}
});
}
// 移动位置
function handlerLocation(position) {
pathMapRef.value.handlerLocation([position.lng, position.lat]);
}
// 获取WKT类型
function getGeomType(area) {
let geom = area.geom;
let radiusFlag = area.properties.indexOf('radius') > -1 ? true : false;
// 点
if (geom.indexOf('POINT') > -1 && !radiusFlag) {
return 'Point';
}
// 线
if (geom.indexOf('LINESTRING') > -1 && !radiusFlag) {
return 'Polyline';
}
// 多边形
if (geom.indexOf('POLYGON') > -1 && !radiusFlag) {
return 'Polygon';
}
// 圈
if (geom.indexOf('POLYGON') > -1 && radiusFlag) {
return 'Circle';
}
}
onMounted(() => {
getAnnotationList();
});
</script>
<style lang="less" scoped>
.pathModal {
position: relative;
display: flex;
width: 100%;
height: 100%;
.leftMenuDiv {
position: relative;
height: 100%;
}
.mapDiv {
position: relative;
height: 100%;
// width: auto;
}
.annotationInfoDiv {
position: relative;
height: 100%;
width: 320px;
}
.areaInfoDiv {
position: relative;
height: 100%;
width: 320px;
}
.imageInfoDiv {
position: relative;
height: 100%;
// width: 37%;
width: 720px;
// min-width: 720px;
}
}
</style>