123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390 |
- <template>
- <div ref="containerRef" class="map-container">
- <div
- ref="mapRef"
- id="YztMap"
- class="map-container"
- :class="{ 'custom-cursor': mapStore.isMapSelect }"
- :style="{
- width: width,
- height: height,
- transform: 'scale(' + inverseScale.inverseScaleX + ', ' + inverseScale.inverseScaleY + ')',
- transformOrigin: '0 0'
- }"
- />
- </div>
- </template>
- <script setup lang="ts">
- import 'ol/ol.css';
- import mmJson from '@/assets/json/mm2.json';
- import { olMap } from '@/utils/olMap/olMap';
- import { getPointInfoList2 } from '@/api/globalMap';
- import { getDictLabel } from '@/utils/dict';
- import { methodList, titleList } from '../data';
- import { pointDetailTemplate } from '@/views/globalMap/data/mapData';
- import useAppStore from '@/store/modules/app';
- import useMapStore from '@/store/modules/map';
- const containerScale = inject('containerScale');
- const { proxy } = getCurrentInstance() as ComponentInternalInstance;
- const { point_type } = toRefs<any>(proxy?.useDict('point_type'));
- const appStore = useAppStore();
- const mapStore = useMapStore();
- const emits = defineEmits(['handleShowWarehouse', 'handleShowVideo', 'handleShowPeople', 'closeDetailDialog', 'resize']);
- const mapRef = ref(null);
- const containerRef = ref();
- const width = ref('100%');
- const height = ref('100%');
- let map, mapUtils;
- watch(
- () => appStore.showLeftSection,
- () => {
- nextTick(() => {
- handleResize();
- });
- }
- );
- watch(
- () => appStore.showRightSection,
- () => {
- nextTick(() => {
- handleResize();
- });
- }
- );
- const mapList = reactive({
- satellite2: [
- { layer: 'map', layerType: 'WMTS', code: 'YZT1708679726700', zIndex: '-100', visible: true },
- { layer: 'map', layerType: 'WFS', code: 'YZT1712111943104', zIndex: '-99', visible: true },
- { layer: 'annotation', layerType: 'WMTS', code: 'YZT1695608158269', zIndex: '-98', visible: true }
- ],
- satellite3: [
- { layer: 'map', layerType: 'WMTS', code: 'YZT1708679726700', zIndex: '-99', visible: true },
- { layer: 'annotation', layerType: 'WMTS', code: 'YZT1695608158269', zIndex: '-98', visible: true }
- ],
- imageMap: [
- { layer: 'map', layerType: 'WMTS', code: 'YZT1640925052482', zIndex: '-99' },
- { layer: 'annotation', layerType: 'WMTS', code: 'YZT1695608158269', zIndex: '-98', visible: true }
- ],
- imageMap2: [
- { layer: 'map', layerType: 'JSON', code: 'gd', zIndex: '-99', visible: true },
- { layer: 'annotation', layerType: 'WMTS', code: 'YZT1695608158269', zIndex: '-98', visible: true }
- ]
- });
- // 监听地图类型变化
- watch(
- () => mapStore.activeMap,
- () => {
- if (!mapUtils) return;
- mapUtils.replaceLayers(mapList[mapStore.activeMap]);
- }
- );
- watch(
- () => mapStore.showMask,
- () => {
- if (mapStore.showMask) {
- mapUtils.createVecByJson2(mmJson, { strokeWeight: 2 });
- } else {
- mapUtils.removeMask3(true);
- }
- }
- );
- const init = () => {
- mapStore.setMapLoaded(false);
- mapUtils = new olMap({
- dom: mapRef.value,
- id: mapList[mapStore.activeMap],
- center: mapStore.mapState.center,
- zoom: mapStore.mapState.zoom,
- minZoom: mapStore.mapState.minZoom,
- maxZoom: mapStore.mapState.maxZoom,
- showScale: true,
- drawTool: {
- use: true
- },
- // 加载完成事件
- onLoadCompleted: (YztMap) => {
- map = YztMap;
- mapStore.setMapLoaded(true);
- map.getView().on('change:resolution', () => {
- mapStore.setZoom(map.getView().getZoom().toFixed(2));
- });
- if (mapStore.showMask) {
- mapUtils.createVecByJson2(mmJson, { strokeWeight: 2 });
- }
- // let drawTool = new DrawTool({ mapUtils, map });
- handleResize();
- },
- onMarkerClick: (data, flag) => {
- let title = titleList[data.dataType];
- if (flag && !!title) {
- data.title = title;
- emits('closeDetailDialog', data);
- }
- // 多点位
- if (data.type === '1') {
- getPointInfoList2({
- option: mapStore.pointParams.option,
- dict_value: mapStore.pointParams.dict_value.toString(),
- zoom_level: mapStore.mapState.zoom,
- longitude: data.longitude.toString(),
- latitude: data.latitude.toString()
- }).then((res) => {
- const data2 = res.data;
- let content = document.createElement('div');
- // content.style.cssText = 'transform: scale(' + containerScale().scaleX + ');';
- content.className = 'point-info';
- let content2 = '';
- content2 += '<div class="title-box"><div class="gradient-text">多点位信息</div></div>';
- content2 += '<div class="icon1"></div>';
- content2 += '<div class="icon2"></div>';
- content2 += '<div class="icon3"></div>';
- content2 += '<div class="icon4"></div>';
- content.innerHTML = content2;
- let tableBox = document.createElement('div');
- tableBox.className = 'table-box';
- let table = document.createElement('div');
- table.className = 'table';
- table.innerHTML = '<div class="point-item"><div class="td3">主题</div><div class="td3">名称</div></div>';
- data2.forEach((item) => {
- item.image = data.image;
- item.imageHover = data.imageHover;
- item.size = data.size;
- item.scale = data.scale;
- const div = document.createElement('div');
- div.className = 'point-item point-item-hover';
- div.innerHTML =
- '<div class="td4">' + getDictLabel(point_type.value, item.dataType.toString()) + '</div><div class="td4">' + item.name + '</div>';
- div.addEventListener('click', () => {
- handlePointDetails(item);
- });
- table.appendChild(div);
- });
- tableBox.appendChild(table);
- content.appendChild(tableBox);
- let closeBtn = document.createElement('div');
- closeBtn.className = 'close';
- closeBtn.onclick = () => {
- mapUtils.hideInfo(true);
- emits('closeDetailDialog', data);
- };
- content.appendChild(closeBtn);
- mapUtils.showInfo(content, [data.longitude, data.latitude], -data.scale * data.size[1], true);
- });
- } else {
- handlePointDetails(data);
- }
- }
- });
- };
- const handlePointDetails = (data) => {
- let method = methodList[data.dataType];
- let title = !!titleList[data.dataType] ? titleList[data.dataType] : '信息';
- if (!method) return;
- method(data.id).then((res) => {
- if (!!pointDetailTemplate[data.dataType]) {
- let div = document.createElement('div');
- // div.style.cssText = 'transform: scale(' + containerScale().scaleX + ');';
- div.className = 'point-info';
- let titleDom = document.createElement('div');
- titleDom.className = 'title-box';
- titleDom.innerHTML = '<div class="gradient-text">' + title + '</div></div>';
- div.appendChild(titleDom);
- const objs = {
- '2': {
- title: '物资详情',
- method: 'handleShowWarehouse'
- },
- '41': {
- title: '人员列表',
- method: 'handleShowPeople'
- },
- '43': {
- title: '历史轨迹',
- method: 'handleShowTrack'
- }
- };
- let obj = objs[data.dataType];
- if ([4, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58].includes(data.dataType)) {
- obj = {
- title: '附近视频',
- method: 'handleShowVideo'
- };
- }
- if (!!obj) {
- let btnBox = document.createElement('div');
- let btn = document.createElement('div');
- btnBox.className = 'flex';
- btn.className = 'btn';
- btn.innerHTML = '<div class="video-icon"></div>' + obj.title + '<div></div>';
- btn.onclick = () => {
- emits(obj.method, data);
- };
- btnBox.appendChild(btn);
- div.appendChild(btnBox);
- }
- let icon1 = document.createElement('div');
- icon1.className = 'icon1';
- let icon2 = document.createElement('div');
- icon2.className = 'icon2';
- let icon3 = document.createElement('div');
- icon3.className = 'icon3';
- let icon4 = document.createElement('div');
- icon4.className = 'icon4';
- div.appendChild(icon1);
- div.appendChild(icon2);
- div.appendChild(icon3);
- div.appendChild(icon4);
- let table = document.createElement('div');
- table.className = 'table-box';
- let content = '';
- content += '<div class="table">';
- const newData = filterTd(res.rows[0], data.dataType);
- newData.forEach((item) => {
- if (item.type === 'shortText') {
- content += '<div class="tr">';
- item.data.forEach((item2) => {
- content += '<div class="point-item">';
- content += '<div class="td1">' + item2.label + '</div><div class="td2">' + item2.value + '</div>';
- content += '</div>';
- });
- content += '</div>';
- } else {
- content += '<div class="point-item2">';
- content += '<div class="td1">' + item.data[0].label + '</div><div class="td2">' + item.data[0].value + '</div>';
- content += '</div>';
- }
- });
- content += '</div>';
- table.innerHTML = content;
- div.appendChild(table);
- let closeBtn = document.createElement('div');
- closeBtn.className = 'close';
- closeBtn.onclick = () => {
- mapUtils.hideInfo(true);
- emits('closeDetailDialog', data);
- };
- div.appendChild(closeBtn);
- mapUtils.showInfo(div, [data.longitude, data.latitude], -data.scale * data.size[1], true);
- } else if (data.dataType === 'video') {
- emits('handleShowVideoDetail', res.data, true);
- }
- });
- };
- const filterTd = (obj, dataType) => {
- let data = [];
- let tempData = {};
- let i = 0;
- const pointDetailTemplateObj = pointDetailTemplate[dataType];
- Object.keys(pointDetailTemplateObj).forEach((key) => {
- let keyLabel = pointDetailTemplateObj[key];
- if (!!keyLabel) {
- if (i === 2) {
- i = 0;
- }
- const value = !!obj && !!obj[key] ? obj[key] : '';
- if (value && value.length > 8) {
- if (i === 0) {
- data.push({ type: 'longText', data: [{ label: keyLabel, value: value }] });
- i = 0;
- } else {
- tempData = { type: 'longText', data: [{ label: keyLabel, value: value }] };
- }
- } else {
- if (i === 0) {
- data.push({ type: 'shortText', data: [{ label: keyLabel, value: value }] });
- } else {
- data[data.length - 1].data.push({ label: keyLabel, value: value });
- }
- i++;
- if (!!tempData && JSON.stringify(tempData) !== '{}') {
- data.push(tempData);
- tempData = {};
- i = 0;
- }
- }
- }
- });
- if (!!tempData && JSON.stringify(tempData) !== '{}') {
- data.push(tempData);
- }
- if (data[data.length - 1].data && data[data.length - 1].data.length === 1 && data[data.length - 1].type === 'shortText') {
- data[data.length - 1].type = 'longText';
- }
- return data;
- };
- const addMarker = (points) => {
- mapUtils.addMarker(points);
- };
- const clearMarker = () => {
- mapUtils.clearMarker();
- };
- let inverseScale = ref({
- inverseScaleX: 1,
- inverseScaleY: 1
- });
- const handleResize = () => {
- if (!containerRef.value) return;
- inverseScale.value.inverseScaleX = 1 / containerScale().scaleX;
- inverseScale.value.inverseScaleY = 1 / containerScale().scaleY;
- const containerWidth = containerRef.value.clientWidth * containerScale().scaleX;
- const containerHeight = containerRef.value.clientHeight * containerScale().scaleY;
- width.value = containerWidth + 'px';
- height.value = containerHeight + 'px';
- map.updateSize();
- nextTick(() => {
- emits('resize');
- });
- };
- const getMap = () => {
- return map;
- };
- const getMapUtils = () => {
- return mapUtils;
- };
- const getDrawTool = () => {
- return mapUtils.getDrawTool();
- };
- const addSearchMarker = (item) => {
- return mapUtils.addSearchMarker(item);
- };
- // 加载事件
- onMounted(() => {
- init();
- window.addEventListener('resize', handleResize);
- });
- // 卸载事件
- onUnmounted(() => {
- window.removeEventListener('resize', handleResize);
- });
- defineExpose({ getMap, getMapUtils, addSearchMarker, getDrawTool, addMarker, clearMarker });
- </script>
- <style scoped>
- @import '../map.scss';
- .map-container {
- width: 100%;
- height: 100%;
- position: relative;
- :deep(.ol-scale-line) {
- left: unset;
- bottom: 16px;
- right: 48px;
- background-color: transparent;
- }
- :deep(.ol-scale-line-inner) {
- color: #ffffff;
- border: 1px solid #fff;
- border-top: none;
- }
- }
- .custom-cursor {
- cursor:
- url('@/assets/images/map/mark.png') 13 31,
- auto !important;
- }
- </style>
|