| | |
| | | <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"> |
| | | <BorderBox13> |
| | | <!-- <div class="quanguo" @click="getData('china')" >--> |
| | | <!-- 中国--> |
| | | <!-- </div>--> |
| | | <CityMap @mapItemClick="mapItemClick" @cancleClick="cancleClick"></CityMap> |
| | | |
| | | <chartgd @changeDt="handlechan" v-if="dtFig ==0"></chartgd> |
| | | <chart2 v-else></chart2> |
| | | <!-- <v-chart--> |
| | | <!-- class="chart"--> |
| | | <!-- :option="option"--> |
| | | <!-- ref="centerMapRef"--> |
| | | <!-- @click="mapClick"--> |
| | | <!-- v-if="JSON.stringify(option) != '{}'"--> |
| | | <!-- />--> |
| | | </BorderBox13> |
| | | <!-- <DialogType1></DialogType1> |
| | | <DialogType2></DialogType2> |
| | | <DialogType3></DialogType3> |
| | | <DialogType4></DialogType4> |
| | | <DialogType5></DialogType5> |
| | | <DialogType6></DialogType6> |
| | | <DialogType7></DialogType7> |
| | | <DialogType8></DialogType8> |
| | | <DialogType9></DialogType9> --> |
| | | </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; |
| | |
| | | .quanguo { |
| | | position: absolute; |
| | | right: 20px; |
| | | top: -46px; |
| | | top: -46px; |
| | | width: 80px; |
| | | height: 28px; |
| | | border: 1px solid #00eded; |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | .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> |