wujingjing
2025-02-10 e50196bff10f0196307b2567ed6c0829eadd8ff6
src/components/chat/chatComponents/summaryCom/components/recordSetTable/map/BasicMap.vue
@@ -34,7 +34,7 @@
            </div>
         </div>
      </div>
      <LayerControl v-if="olMap" :olMap="olMap" class="absolute top-3 left-3 z-10" />
      <!-- <LayerControl v-if="olMap" :olMap="olMap" class="absolute top-3 left-3 z-10" /> -->
      <!-- <PropertyPanel class="absolute top-14 left-10 z-14"></PropertyPanel> -->
      <PanelTool
@@ -42,8 +42,10 @@
         ref="panelToolRef"
         :propertyMap="propertyMap"
         :propertyConfigMap="propertyConfigMap"
         class="absolute top-12 right-2 z-14"
         class="absolute top-0 right-2 z-14 h-full"
         :olMap="olMap"
         :isFullscreen="isFullscreen"
         @toggleFullScreen="toggleFullScreen"
      ></PanelTool>
      <!-- <el-button class="absolute top-3 right-4" @click="changeTheme" type="primary">切换主题</el-button> -->
   </div>
@@ -69,6 +71,7 @@
import LayerControl from './LayerControl.vue';
import PanelTool from './panelTool/index.vue';
import {
   getMapDrawStyles,
   getMapLayerGroupList,
   getMapLayersByPost,
   getMapThemeList,
@@ -81,53 +84,33 @@
import { MarkerOverlay } from '/@/model/map/overlay/marker';
import { useCompRef } from '/@/utils/types';
import { formatDate } from '/@/utils/formatTime';
import { MapPanelTool } from './types';
const panelToolRef = useCompRef(PanelTool);
const props = withDefaults(
   defineProps<{
      data: any;
      config?: {
         sourceType: GaoDeSourceType;
         markerIsVisible: boolean;
      };
      isFullscreen: boolean;
   }>(),
   {
      config: () => ({
         sourceType: GaoDeSourceType.Vector,
         markerIsVisible: true,
      }),
   }
);
const changeTheme = async (themeId: string) => {
   const res = await switchMapTheme({
      theme_id: themeId,
      time: formatDate(new Date()),
   });
   const styles = (res?.styles ?? []).map((item) =>
      item.PSIZE
         ? new Style({
               image: new Circle({
                  radius: item.PSIZE,
                  fill: new Fill({ color: `#${item.PCOLOR}` }),
               }),
           })
         : null
   );
   const junctionsStyle = res?.['O_WDM_JUNCTIONS'] ?? {};
   junctionLayer?.setStyle((feature) => {
      const oname = feature.get('oname');
      if (!oname) return null;
      const styleIndex = junctionsStyle[oname]?.style_id;
      if (styleIndex == null) return null;
      const style = styles[styleIndex];
      return style;
   });
};
const colsArray = computed(() => {
   return props.data.cols ?? [];
});
const emit = defineEmits(['markerClick', 'closeInfoWindow']);
const emit = defineEmits(['markerClick', 'closeInfoWindow','toggleFullScreen']);
const toggleFullScreen = () => {
   emit('toggleFullScreen');
};
const containerRef = ref<HTMLDivElement>(null);
const infoWindowRef = ref<HTMLDivElement>(null);
@@ -282,6 +265,7 @@
const handleVectorTileClick = (feature, layer) => {
   panelToolRef.value.featureClick(feature);
   feature &&  panelToolRef.value.setActivePanel(MapPanelTool.Property);
   // setActiveStyle(feature,layer);
};
const propertyMap = ref({});
@@ -297,9 +281,8 @@
const maxResolution = 1;
const getText = function (feature, resolution) {
   const oname = feature.get('oname');
   let text = `first-${oname[0]}`;
const getText = function (textContent, resolution) {
   let text = `${textContent}`;
   if (resolution > maxResolution) {
      text = '';
   }
@@ -314,10 +297,10 @@
   return text;
};
const createTextStyle = (feature, resolution) => {
const createTextStyle = (textContent, resolution) => {
   return new Style({
      text: new Text({
         text: getText(feature, resolution),
         text: getText(textContent, resolution),
         font: '14px Arial',
         fill: new Fill({ color: '#000' }),
         stroke: new Stroke({ color: '#fff', width: 2 }),
@@ -326,65 +309,99 @@
      }),
   });
};
const getLayerStyles = (layerId: string) => {
   switch (layerId) {
      case 'junction':
         const styleMap: Record<string, Style> = {};
         return function (feature, resolution) {
            const size = feature.get('psize');
            const pcolor = feature.get('pcolor');
            const otype = feature.get('otype');
            if (!size) return null;
            const key = `${size}_${pcolor}`;
            if (!styleMap[key]) {
               styleMap[key] = new Style({
                  image: new Circle({
                     radius: size,
                     fill: new Fill({ color: `#${pcolor}` }),
                  }),
               });
            }
            const textStyle = createTextStyle(feature, resolution);
            return [styleMap[key], textStyle];
         };
      case 'pipes':
         const styleMap2 = {};
         return function (feature, resolution) {
            const size = feature.get('lsize');
            const lcolor = feature.get('lcolor');
            const otype = feature.get('otype');
            if (!size) return null;
            const key = `${size}_${lcolor}`;
            if (!styleMap2[key]) {
               styleMap2[key] = new Style({
                  // image: new Circle({
                  //    radius: size,
                  //    fill: new Fill({ color: `#${color}` }),
                  // }),
                  stroke: new Stroke({
                     color: `#${lcolor}`,
                     width: size,
                  }),
               });
            }
            return styleMap2[key];
         };
      default:
         return undefined;
   }
const styleMap: Record<string, Record<string, Style>> = {
   point: {},
   line: {},
   polygon: {},
};
let junctionLayer: VectorTileLayer = null;
const unsupportedLayers = ['dma1', 'dma2', 'dma3'];
const layerStyleFunc = function (feature, resolution) {
   const shape = feature.getGeometry().getType();
   const styles = [];
   switch (shape) {
      case 'Point':
         const pSize = feature.get('psize');
         const pcolor = feature.get('pcolor');
         const pstyle = feature.get('pstyle');
         const pointStyle = olMap.value.getPointStyles({
            size: pSize,
            color: pcolor,
            style: pstyle,
         });
         styles.push(pointStyle);
         break;
      case 'LineString':
         const lSize = feature.get('lsize');
         const lColor = feature.get('lcolor');
         const lstyle = feature.get('lstyle');
         const pSize1 = feature.get('psize');
         const pcolor1 = feature.get('pcolor');
         const pStyle1 = feature.get('pstyle');
         const lineStyle = olMap.value.getLineStyles({
            lsize: lSize,
            lcolor: lColor,
            lstyle: lstyle,
            psize: pSize1,
            pcolor: pcolor1,
            pstyle: pStyle1,
         });
         styles.push(...lineStyle);
         break;
      case 'Polygon':
         const pColor = feature.get('pcolor');
         const lSize1 = feature.get('lsize');
         const lColor1 = feature.get('lcolor');
         const lstyle1 = feature.get('lstyle');
         const polygonStyle = olMap.value.getPolygonStyles({
            pcolor: pColor,
            lsize: lSize1,
            lcolor: lColor1,
            lstyle: lstyle1,
         });
         styles.push(...polygonStyle);
         break;
      default:
         break;
   }
   // switch (otype) {
   //    case 'WDM_JUNCTIONS':
   //       const textStyle = createTextStyle(feature, resolution);
   //       styles.push(textStyle);
   //    case 'WDM_PIPES':
   //       break;
   // }
   //#region ====================== 添加标注 ======================
   const tString = feature.get('tstring');
   const tStringStyle = olMap.value.getLabelStyles({
      textContent: tString,
      resolution,
   });
   if (tStringStyle) {
      styles.push(tStringStyle);
   }
   //#endregion
   return styles;
};
const getGroupList = async () => {
   const res = await getMapLayerGroupList();
   const groupList = res?.values ?? [];
   return groupList;
};
const getDrawStyles = async () => {
   const res = await getMapDrawStyles();
   const styleList = res?.values ?? [];
   // console.log("🚀 ~ styleList:", styleList)
   olMap.value.setDrawStyles(styleList);
};
const getThemeList = async () => {
@@ -406,45 +423,26 @@
         id,
         title: curVal.title,
         type: 'theme',
         _isSet: false,
         get isSet() {
            return this._isSet;
         },
         set isSet(val) {
            this._isSet = val;
            if(val){
               const style = junctionLayer.getStyleFunction();
               junctionLayer.set('originStyle',style);
               changeTheme(this.id)
            }else{
               const originStyle = junctionLayer.get('originStyle');
               console.log("🚀 ~ originStyle:", originStyle)
               junctionLayer.setStyle(originStyle);
            }
         },
         activeTheme: null,
         legends: null,
      };
      mapGroupItem.children.push(data);
      return preVal;
   }, []);
   olMap.value.setAllThemes(themeTreeData);
   console.log('🚀 ~ themeTreeData:', themeTreeData);
};
const initVectorTileLayer = async () => {
   await getDrawStyles();
   const res = await getMapLayersByPost();
   const layers = reverse(res?.layers ?? []);
   if (layers.length === 0) return;
   const layerModels = [];
   for (const item of layers) {
      const layer = olMap.value.addCustomLayer(
         `${MAIN_URL}map/get_vector_tile?x={x}&y={y}&z={z}&layer_id=${item.id}`,
         getLayerStyles(item.id)
      );
      const styleFunc = olMap.value.unsupportedLayers.includes(item.id) ? undefined : layerStyleFunc;
      const layer = olMap.value.addCustomLayer(`${MAIN_URL}map/get_vector_tile?x={x}&y={y}&z={z}&layer_id=${item.id}`, styleFunc);
      layer.set('originStyle', styleFunc);
      layerModels.push(layer);
      if (item.id === 'junction') {
         junctionLayer = layer;
      }
   }
   getGroupList().then((groupList) => {
      olMap.value.setAllLayers(layerModels, layers, groupList);
@@ -457,7 +455,6 @@
   olMap.value = new OLMap({
      container: containerRef.value,
      sourceType: props.config?.sourceType,
      markerIsVisible: props.config?.markerIsVisible,
   });
   addMarkerLayer();