123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- import { defineComponent, watch, shallowReactive, nextTick, ref, onUnmounted } from 'vue';
- // 声明类型
- const PropsType = {
- cdata: {
- type: Array,
- require: true
- }
- } 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>
- }
- }
- })
|