ZhangXianQiang
2024-03-07 b50dfd566774dea66153f97fe300b46de0baed1c
src/views/daoAnOffice/center-map.vue
@@ -1,149 +1,164 @@
<script setup lang="ts">
import { ref, reactive, nextTick } from "vue";
import { currentGET, GETNOBASE } from "@/api";
import { registerMap, getMap } from "echarts/core";
import { optionHandle, regionCodes } from "./center.map";
import BorderBox13 from "@/components/datav/border-box-13";
import type { MapdataType } from "./center.map";
import  chart2 from "./chart2.vue"
import  chartgd from "./chartgd.vue"
const option = ref({});
const code = ref("china"); //china 代表中国 其他地市是行政编码
withDefaults(
  defineProps<{
    // 结束数值
    title: number | string;
  }>(),
  {
    title: "地图",
  }
);
const dataSetHandle = async (regionCode: string, list: object[]) => {
  const geojson: any = await getGeojson(regionCode);
  let cityCenter: any = {};
  let mapData: MapdataType[] = [];
  //获取当前地图每块行政区中心点
  geojson.features.forEach((element: any) => {
    cityCenter[element.properties.name] =
      element.properties.centroid || element.properties.center;
  });
  //当前中心点如果有此条数据中心点则赋值x,y当然这个x,y也可以后端返回进行大点,前端省去多行代码
  list.forEach((item: any) => {
    if (cityCenter[item.name]) {
      mapData.push({
        name: item.name,
        value: cityCenter[item.name].concat(item.value),
      });
    }
  });
  await nextTick();
  console.log(mapData)
  option.value = optionHandle(regionCode, list, mapData);
};
const getData = async (regionCode: string) => {
  currentGET("centerMap", { regionCode: regionCode }).then((res) => {
    console.log("设备分布", res);
    if (res.success) {
      dataSetHandle(res.data.regionCode, res.data.dataList);
    }
  });
};
const getGeojson = (regionCode: string) => {
  return new Promise<boolean>(async (resolve) => {
    let mapjson = getMap(regionCode);
    if (mapjson) {
      mapjson = mapjson.geoJSON;
      resolve(mapjson);
    } else {
      mapjson = await GETNOBASE(`./map-geojson/${regionCode}.json`).then(
        (data) => data
      );
      code.value = regionCode;
      registerMap(regionCode, {
        geoJSON: mapjson as any,
        specialAreas: {},
      });
      resolve(mapjson);
    }
  });
};
getData(code.value);
const mapClick = (params: any) => {
  console.log(params);
  let xzqData = regionCodes[params.name];
  if (xzqData) {
    getData(xzqData.adcode);
  } else {
    window["$message"].warning("暂无下级地市");
  }
};
const dtFig =ref(0)
const handlechan =()=>{
  console.log(dtFig.value)
    dtFig.value = 1
}
</script>
<template>
  <div class="centermap">
    <div class="maptitle" style="display:none;">
      <div class="zuo"></div>
      <span class="titletext">{{ title }}</span>
      <div class="you"></div>
    <div class="maptitle">
      <img src="@/assets/img/icon/map_title.png" alt="">
    </div>
    <div class="mapwrap" style="display:none;">
<!--        <chartgd @changeDt="handlechan"  v-if="dtFig ==0"></chartgd>-->
        <chart2 ></chart2>
    <div class="mapwrap">
      <CityMap @mapItemClick="mapItemClick" @cancleClick="cancleClick"></CityMap>
    </div>
    <div class="map-info-container">
      <div class="info-title-container">
        <div class="img-bg">
          <img src="@/assets/img/icon/map_info_title.png" alt="">
        </div>
        <div class="info-title">
          <div class="icon">
            <img src="@/assets/img/icon/arrow_right.png" alt="">
          </div>
          <span class="title">{{ activeData.name ? activeData.name : '都江堰市' }}</span>
        </div>
      </div>
      <div class="info-content-container">
        <div class="info-item">
          <div class="info-lable">事故易发多发路段:</div>
          <div class="info-text">{{ activeData.data.type1 ? activeData.data.type1 : 0 }}</div>
        </div>
        <div class="info-item">
          <div class="info-lable">重点旅游通道:</div>
          <div class="info-text">{{ activeData.data.type2 ? activeData.data.type2 : 0 }}</div>
        </div>
        <div class="info-item">
          <div class="info-lable">都江堰景区:</div>
          <div class="info-text">{{ activeData.data.type3 ? activeData.data.type3 : 0 }}</div>
        </div>
        <div class="info-item">
          <div class="info-lable">警力配备:</div>
          <div class="info-text">{{ activeData.data.type4 ? activeData.data.type4 : 0 }}</div>
        </div>
        <div class="info-item">
          <div class="info-lable">打围施工:</div>
          <div class="info-text">{{ activeData.data.type5 ? activeData.data.type5 : 0 }}</div>
        </div>
        <div class="info-item">
          <div class="info-lable">交通事故易发点:</div>
          <div class="info-text">{{ activeData.data.type6 ? activeData.data.type6 : 0 }}</div>
        </div>
        <div class="info-item">
          <div class="info-lable">重点运输企业:</div>
          <div class="info-text">{{ activeData.data.type7 ? activeData.data.type7 : 0 }}</div>
        </div>
        <div class="info-item">
          <div class="info-lable">公交线路:</div>
          <div class="info-text">{{ activeData.data.type8 ? activeData.data.type8 : 0 }}</div>
        </div>
        <div class="info-item">
          <div class="info-lable">安全隐患:</div>
          <div class="info-text">{{ activeData.data.type9 ? activeData.data.type9 : 0 }}</div>
        </div>
      </div>
    </div>
  </div>
</template>
<script setup>
import CityMap from './center/city-map.vue';
import { ref,onMounted } from "vue";
const mapData = ref([
  {
    id: 1,
    name: '龙池镇',
    data: { type1: 1, type2: 2, type3: 4, type4: 5, type5: 12, type6: 31, type7: 19, type8: 10, type9: 20 },
  },
  {
    id: 2,
    name: '玉堂街道',
    data: { type1: 5, type2: 12, type3: 5, type4: 13, type5: 12, type6: 31, type7: 19, type8: 26, type9: 3 },
  },
  {
    id: 3,
    name: '青城山镇',
    data: { type1: 12, type2: 12, type3: 52, type4: 3, type5: 12, type6: 31, type7: 19, type8: 13, type9: 3 },
  },
  {
    id: 4,
    name: '石羊镇',
    data: { type1: 21, type2: 12, type3: 24, type4: 12, type5: 12, type6: 31, type7: 19, type8: 13, type9: 31 },
  },
  {
    id: 5,
    name: '幸福街道',
    data: { type1: 10, type2: 12, type3: 5, type4: 52, type5: 12, type6: 31, type7: 19, type8: 13, type9: 3 },
  },
  {
    id: 6,
    name: '银杏街道',
    data: { type1: 31, type2: 13, type3: 5, type4: 265, type5: 12, type6: 31, type7: 19, type8: 21, type9: 3 },
  },
  {
    id: 7,
    name: '灌口街道',
    data: { type1: 52, type2: 12, type3: 5, type4: 265, type5: 12, type6: 31, type7: 19, type8: 13, type9: 3 },
  },
  {
    id: 8,
    name: '奎光塔街道',
    data: { type1: 53, type2: 35, type3: 5, type4: 15, type5: 12, type6: 31, type7: 19, type8: 13, type9: 3 },
  },
  {
    id: 9,
    name: '天马镇',
    data: { type1: 13, type2: 2, type3: 5, type4: 51, type5: 12, type6: 31, type7: 19, type8: 12, type9: 15 },
  },
  {
    id: 10,
    name: '聚源镇',
    data: { type1: 13, type2: 35, type3: 65, type4: 24, type5: 12, type6: 35, type7: 3, type8: 42, type9: 24 },
  },
  {
    id: 11,
    name: '蒲阳街道',
    data: { type1: 6, type2: 6, type3: 63, type4: 42, type5: 12, type6: 31, type7: 19, type8: 89, type9: 3 },
  },
]);
const activeData = ref({
  name: '都江堰市',
  data: {},
});
const mapItemClick = (id) => {
  activeData.value = mapData.value.find((item) => item.id === id);
}
const cancleClick = () => {
  activeData.value = {
    name: '都江堰市',
    data: totalNum(),
  };
}
const totalNum = () => {
  let data = {};
  mapData.value.forEach((item) => {
    Object.keys(item.data).forEach((key) => {
      data[key] = data[key] ? data[key] + item.data[key] : item.data[key];
    });
  });
  return data;
}
onMounted(() => {
  cancleClick();
});
</script>
<style scoped lang="scss">
.centermap {
  margin-bottom: 30px;
  .maptitle {
    height: 60px;
    display: flex;
    justify-content: center;
    padding-top: 10px;
    box-sizing: border-box;
    .titletext {
      font-size: 28px;
      font-weight: 900;
      letter-spacing: 6px;
      background: linear-gradient(
        92deg,
        #0072ff 0%,
        #00eaff 48.8525390625%,
        #01aaff 100%
      );
      -webkit-background-clip: text;
      -webkit-text-fill-color: transparent;
      margin: 0 10px;
    }
    .zuo,
    .you {
      background-size: 100% 100%;
      width: 29px;
      height: 20px;
      margin-top: 8px;
    }
    .zuo {
      background: url("@/assets/img/xiezuo.png") no-repeat;
    }
    .you {
      background: url("@/assets/img/xieyou.png") no-repeat;
    }
  }
  position: relative;
  .mapwrap {
    //height: 580px;
@@ -156,7 +171,7 @@
    .quanguo {
      position: absolute;
      right: 20px;
        top: -46px;
      top: -46px;
      width: 80px;
      height: 28px;
      border: 1px solid #00eded;
@@ -172,4 +187,92 @@
    }
  }
}
.map-style {
  width: 100%;
  height: 100%;
}
.maptitle {
  width: 308px;
  position: absolute;
  left: 0;
  top: 30px;
}
.map-info-container {
  width: 225px;
  position: absolute;
  right: 0;
  bottom: 120px;
  background: rgba(17, 34, 58, 0.6);
  border: 1px solid #29466A;
  z-index: 5;
  .info-title-container {
    width: 100%;
    position: relative;
    .img-bg {
      width: 100%;
    }
    .info-title {
      width: 100%;
      position: absolute;
      top: 5px;
      left: 0;
      display: flex;
      align-items: center;
      .icon {
        width: 15px;
        margin: 0 5px 0 12px;
      }
      .title {
        font-weight: 400;
        font-size: 20px;
        color: #FFFFFF;
        text-shadow: 0px 2px 10px rgba(0, 0, 0, 0.5);
        font-style: italic;
        background: linear-gradient(180deg, #FFFFFF 0%, #70B2F4 100%);
        -webkit-background-clip: text;
        // -webkit-text-fill-color: transparent;
      }
    }
  }
  .info-content-container {
    position: relative;
    padding: 10px 20px;
    margin-top: -40px;
    font-size: 14px;
    z-index: 2;
    .info-item {
      width: 100%;
      display: flex;
      align-items: center;
      justify-content: space-between;
      color: #4481DD;
      line-height: 28px;
      .info-text {
        color: #fff;
      }
    }
  }
}
.info-lable {
  font-family: 'PingFang SC' !important;
}
.test {
  position: absolute;
  top: 0;
}
</style>