|  | @@ -0,0 +1,292 @@
 | 
	
		
			
				|  |  | +import { defineComponent, watch, shallowReactive, nextTick, ref, onUnmounted } from 'vue';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// 声明类型
 | 
	
		
			
				|  |  | +const PropsType = {
 | 
	
		
			
				|  |  | +  cdata: {
 | 
	
		
			
				|  |  | +    type: Array,
 | 
	
		
			
				|  |  | +    default: () => [],
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +} as const
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// 定义主体
 | 
	
		
			
				|  |  | +export default defineComponent({
 | 
	
		
			
				|  |  | +  props: PropsType,
 | 
	
		
			
				|  |  | +  setup(props) {
 | 
	
		
			
				|  |  | +    // 定时器
 | 
	
		
			
				|  |  | +    // let intervalId = 0
 | 
	
		
			
				|  |  | +    // 地图选择
 | 
	
		
			
				|  |  | +    // let preSelectMapIndex = 0
 | 
	
		
			
				|  |  | +    // ref
 | 
	
		
			
				|  |  | +    const chartRef = ref()
 | 
	
		
			
				|  |  | +    // 配置项
 | 
	
		
			
				|  |  | +    let options = shallowReactive({})
 | 
	
		
			
				|  |  | +    // 设置点的位置(经纬度)
 | 
	
		
			
				|  |  | +    const geoCoordMap = {
 | 
	
		
			
				|  |  | +      厦门市: [118.11022, 24.490474, 20],
 | 
	
		
			
				|  |  | +      福州市: [119.206239, 26.275302, 20],
 | 
	
		
			
				|  |  | +      泉州市: [118.589421, 24.908853, 20],
 | 
	
		
			
				|  |  | +      漳州市: [117.561801, 24.510897, 20],
 | 
	
		
			
				|  |  | +      龙岩市: [116.82978, 25.391603, 20],
 | 
	
		
			
				|  |  | +      莆田市: [119.007558, 25.591011, 20],
 | 
	
		
			
				|  |  | +      三明市: [117.435001, 26.465444, 20],
 | 
	
		
			
				|  |  | +      南平市: [118.178459, 27.535627, 20],
 | 
	
		
			
				|  |  | +      宁德市: [119.527082, 27.15924, 20],
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    const seriesData = [
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        name: '厦门市',
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        name: '福州市',
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        name: '泉州市',
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        name: '漳州市',
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        name: '龙岩市',
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        name: '莆田市',
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        name: '三明市',
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        name: '南平市',
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        name: '宁德市',
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +    ]
 | 
	
		
			
				|  |  | +    const convertData = function (data) {
 | 
	
		
			
				|  |  | +      const scatterData = [];
 | 
	
		
			
				|  |  | +      for (let i = 0; i < data.length; i++) {
 | 
	
		
			
				|  |  | +        const geoCoord = geoCoordMap[data[i].name];
 | 
	
		
			
				|  |  | +        if (geoCoord) {
 | 
	
		
			
				|  |  | +          scatterData.push({
 | 
	
		
			
				|  |  | +            name: data[i].name,
 | 
	
		
			
				|  |  | +            value: geoCoord.concat(data[i].value),
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      return scatterData;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    // 重新随机选中地图区域
 | 
	
		
			
				|  |  | +    // const reSelectMapRandomArea = () => {
 | 
	
		
			
				|  |  | +    //   const length = 9;
 | 
	
		
			
				|  |  | +    //   nextTick(() => {
 | 
	
		
			
				|  |  | +    //     const map = chartRef.value;
 | 
	
		
			
				|  |  | +    //     let index = Math.floor(Math.random() * length);
 | 
	
		
			
				|  |  | +    //     while (index === preSelectMapIndex || index >= length) {
 | 
	
		
			
				|  |  | +    //       index = Math.floor(Math.random() * length);
 | 
	
		
			
				|  |  | +    //     }
 | 
	
		
			
				|  |  | +    //     if (map.dispatchAction) {
 | 
	
		
			
				|  |  | +    //       map.dispatchAction({
 | 
	
		
			
				|  |  | +    //         type: 'mapUnSelect',
 | 
	
		
			
				|  |  | +    //         seriesIndex: 0,
 | 
	
		
			
				|  |  | +    //         dataIndex: preSelectMapIndex,
 | 
	
		
			
				|  |  | +    //       });
 | 
	
		
			
				|  |  | +    //       map.dispatchAction({
 | 
	
		
			
				|  |  | +    //         type: 'showTip',
 | 
	
		
			
				|  |  | +    //         seriesIndex: 0,
 | 
	
		
			
				|  |  | +    //         dataIndex: index,
 | 
	
		
			
				|  |  | +    //       });
 | 
	
		
			
				|  |  | +    //       map.dispatchAction({
 | 
	
		
			
				|  |  | +    //         type: 'mapSelect',
 | 
	
		
			
				|  |  | +    //         seriesIndex: 0,
 | 
	
		
			
				|  |  | +    //         dataIndex: index,
 | 
	
		
			
				|  |  | +    //       });
 | 
	
		
			
				|  |  | +    //       preSelectMapIndex = index;
 | 
	
		
			
				|  |  | +    //     }
 | 
	
		
			
				|  |  | +    //   });
 | 
	
		
			
				|  |  | +    // }
 | 
	
		
			
				|  |  | +    // const handleMapRandomSelect = () => {
 | 
	
		
			
				|  |  | +    //   nextTick(() => {
 | 
	
		
			
				|  |  | +    //     const map = chartRef.value;
 | 
	
		
			
				|  |  | +    //     setTimeout(() => {
 | 
	
		
			
				|  |  | +    //       reSelectMapRandomArea();
 | 
	
		
			
				|  |  | +    //     }, 0);
 | 
	
		
			
				|  |  | +    //     // 移入区域,清除定时器、取消之前选中并选中当前
 | 
	
		
			
				|  |  | +    //     if (map.on) {
 | 
	
		
			
				|  |  | +    //       map.on('mouseover', function (params) {
 | 
	
		
			
				|  |  | +    //         clearInterval(intervalId);
 | 
	
		
			
				|  |  | +    //         if (map.dispatchAction) {
 | 
	
		
			
				|  |  | +    //           map.dispatchAction({
 | 
	
		
			
				|  |  | +    //             type: 'mapUnSelect',
 | 
	
		
			
				|  |  | +    //             seriesIndex: 0,
 | 
	
		
			
				|  |  | +    //             dataIndex: preSelectMapIndex,
 | 
	
		
			
				|  |  | +    //           });
 | 
	
		
			
				|  |  | +    //           map.dispatchAction({
 | 
	
		
			
				|  |  | +    //             type: 'mapSelect',
 | 
	
		
			
				|  |  | +    //             seriesIndex: 0,
 | 
	
		
			
				|  |  | +    //             dataIndex: params.dataIndex,
 | 
	
		
			
				|  |  | +    //           });
 | 
	
		
			
				|  |  | +    //           preSelectMapIndex = params.dataIndex;
 | 
	
		
			
				|  |  | +    //         }
 | 
	
		
			
				|  |  | +    //       });
 | 
	
		
			
				|  |  | +    //     }
 | 
	
		
			
				|  |  | +    //     // 移出区域重新随机选中地图区域,并开启定时器
 | 
	
		
			
				|  |  | +    //     if (map.on) {
 | 
	
		
			
				|  |  | +    //       map.on('globalout', function () {
 | 
	
		
			
				|  |  | +    //         reSelectMapRandomArea();
 | 
	
		
			
				|  |  | +    //         startInterval();
 | 
	
		
			
				|  |  | +    //       });
 | 
	
		
			
				|  |  | +    //       startInterval();
 | 
	
		
			
				|  |  | +    //     }
 | 
	
		
			
				|  |  | +    //   });
 | 
	
		
			
				|  |  | +    // }
 | 
	
		
			
				|  |  | +    // 开启定时器
 | 
	
		
			
				|  |  | +    // const startInterval = () => {
 | 
	
		
			
				|  |  | +    //   // 应通过接口获取配置时间,暂时写死5s
 | 
	
		
			
				|  |  | +    //   const time = 2000;
 | 
	
		
			
				|  |  | +    //   intervalId = setInterval(() => {
 | 
	
		
			
				|  |  | +    //     reSelectMapRandomArea();
 | 
	
		
			
				|  |  | +    //   }, time);
 | 
	
		
			
				|  |  | +    // }
 | 
	
		
			
				|  |  | +    // 监听
 | 
	
		
			
				|  |  | +    watch(
 | 
	
		
			
				|  |  | +      () => props.cdata,
 | 
	
		
			
				|  |  | +      (val: any) => {
 | 
	
		
			
				|  |  | +        options = {
 | 
	
		
			
				|  |  | +          showLegendSymbol: true,
 | 
	
		
			
				|  |  | +          tooltip: {
 | 
	
		
			
				|  |  | +            trigger: 'item',
 | 
	
		
			
				|  |  | +            textStyle: {
 | 
	
		
			
				|  |  | +              fontSize: 14,
 | 
	
		
			
				|  |  | +              lineHeight: 22,
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            position: point => {
 | 
	
		
			
				|  |  | +              // 固定在顶部
 | 
	
		
			
				|  |  | +              return [point[0] + 50, point[1] - 20];
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            // 如果需要自定义 tooltip样式,需要使用formatter
 | 
	
		
			
				|  |  | +            /*
 | 
	
		
			
				|  |  | +              formatter: params => {
 | 
	
		
			
				|  |  | +                return `<div style=""> ... </div>`
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            */
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          visualMap: {
 | 
	
		
			
				|  |  | +            min: 0,
 | 
	
		
			
				|  |  | +            max: 10,
 | 
	
		
			
				|  |  | +            show: false,
 | 
	
		
			
				|  |  | +            seriesIndex: 0,
 | 
	
		
			
				|  |  | +            // 颜色
 | 
	
		
			
				|  |  | +            inRange: {
 | 
	
		
			
				|  |  | +              color: ['rgba(41,166,206, .5)', 'rgba(69,117,245, .9)'],
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          // 底部背景
 | 
	
		
			
				|  |  | +          geo: {
 | 
	
		
			
				|  |  | +            show: true,
 | 
	
		
			
				|  |  | +            aspectScale: 0.85, //长宽比
 | 
	
		
			
				|  |  | +            zoom: 1.2,
 | 
	
		
			
				|  |  | +            top: '10%',
 | 
	
		
			
				|  |  | +            left: '16%',
 | 
	
		
			
				|  |  | +            map: '福建',
 | 
	
		
			
				|  |  | +            roam: false,
 | 
	
		
			
				|  |  | +            itemStyle: {
 | 
	
		
			
				|  |  | +              normal: {
 | 
	
		
			
				|  |  | +                areaColor: 'rgba(0,0,0,0)',
 | 
	
		
			
				|  |  | +                shadowColor: 'rgba(7,114,204, .8)',
 | 
	
		
			
				|  |  | +                shadowOffsetX: 5,
 | 
	
		
			
				|  |  | +                shadowOffsetY: 5,
 | 
	
		
			
				|  |  | +              },
 | 
	
		
			
				|  |  | +              emphasis: {
 | 
	
		
			
				|  |  | +                areaColor: '#00aeef',
 | 
	
		
			
				|  |  | +              },
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          series: [
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +              name: '相关指数',
 | 
	
		
			
				|  |  | +              type: 'map',
 | 
	
		
			
				|  |  | +              aspectScale: 0.85, //长宽比
 | 
	
		
			
				|  |  | +              zoom: 1.2,
 | 
	
		
			
				|  |  | +              mapType: '福建', // 自定义扩展图表类型
 | 
	
		
			
				|  |  | +              top: '10%',
 | 
	
		
			
				|  |  | +              left: '16%',
 | 
	
		
			
				|  |  | +              itemStyle: {
 | 
	
		
			
				|  |  | +                normal: {
 | 
	
		
			
				|  |  | +                  color: 'red',
 | 
	
		
			
				|  |  | +                  areaColor: 'rgba(19,54,162, .5)',
 | 
	
		
			
				|  |  | +                  borderColor: 'rgba(0,242,252,.3)',
 | 
	
		
			
				|  |  | +                  borderWidth: 1,
 | 
	
		
			
				|  |  | +                  shadowBlur: 7,
 | 
	
		
			
				|  |  | +                  shadowColor: '#00f2fc',
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +                emphasis: {
 | 
	
		
			
				|  |  | +                  areaColor: '#4f7fff',
 | 
	
		
			
				|  |  | +                  borderColor: 'rgba(0,242,252,.6)',
 | 
	
		
			
				|  |  | +                  borderWidth: 2,
 | 
	
		
			
				|  |  | +                  shadowBlur: 10,
 | 
	
		
			
				|  |  | +                  shadowColor: '#00f2fc',
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +              },
 | 
	
		
			
				|  |  | +              label: {
 | 
	
		
			
				|  |  | +                formatter: params => `${params.name}`,
 | 
	
		
			
				|  |  | +                show: true,
 | 
	
		
			
				|  |  | +                position: 'insideRight',
 | 
	
		
			
				|  |  | +                textStyle: {
 | 
	
		
			
				|  |  | +                  fontSize: 14,
 | 
	
		
			
				|  |  | +                  color: '#efefef',
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +                emphasis: {
 | 
	
		
			
				|  |  | +                  textStyle: {
 | 
	
		
			
				|  |  | +                    color: '#fff',
 | 
	
		
			
				|  |  | +                  },
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +              },
 | 
	
		
			
				|  |  | +              data: val,
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +              type: 'effectScatter',
 | 
	
		
			
				|  |  | +              coordinateSystem: 'geo',
 | 
	
		
			
				|  |  | +              symbolSize: 7,
 | 
	
		
			
				|  |  | +              effectType: 'ripple',
 | 
	
		
			
				|  |  | +              legendHoverLink: false,
 | 
	
		
			
				|  |  | +              showEffectOn: 'render',
 | 
	
		
			
				|  |  | +              rippleEffect: {
 | 
	
		
			
				|  |  | +                period: 4,
 | 
	
		
			
				|  |  | +                scale: 2.5,
 | 
	
		
			
				|  |  | +                brushType: 'stroke',
 | 
	
		
			
				|  |  | +              },
 | 
	
		
			
				|  |  | +              zlevel: 1,
 | 
	
		
			
				|  |  | +              itemStyle: {
 | 
	
		
			
				|  |  | +                normal: {
 | 
	
		
			
				|  |  | +                  color: '#99FBFE',
 | 
	
		
			
				|  |  | +                  shadowBlur: 5,
 | 
	
		
			
				|  |  | +                  shadowColor: '#fff',
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +              },
 | 
	
		
			
				|  |  | +              data: convertData(seriesData),
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +          ],
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // 重新选择区域
 | 
	
		
			
				|  |  | +        // handleMapRandomSelect();
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        immediate: true,
 | 
	
		
			
				|  |  | +        deep: true
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    )
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 销毁
 | 
	
		
			
				|  |  | +    // onUnmounted(() => {
 | 
	
		
			
				|  |  | +    //   clearInterval(intervalId)
 | 
	
		
			
				|  |  | +    // })
 | 
	
		
			
				|  |  | +    return () => {
 | 
	
		
			
				|  |  | +      const height = "360px"
 | 
	
		
			
				|  |  | +      const width = "330px"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      return <div>
 | 
	
		
			
				|  |  | +        <echart ref={chartRef} options={options} height={height} width={width} />
 | 
	
		
			
				|  |  | +      </div>
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +})
 | 
	
		
			
				|  |  | +
 |