vue+echarts ----中国地图 下拉选择省份地图中的省份区域高亮显示以及飞线图的效果
1、父组件核心代码:【@/utils/area的详细数据】、【@/utils/china详细数据】
<template>
<div class="center">
<div class="digital">
<el-select
popper-class="selectz"
v-model="areaValue"
placeholder="请选择"
:popper-append-to-body="false"
>
<el-option
v-for="item in areaListOptions"
:key="item.value"
:label="item.label"
:value="item.label"
>
</el-option>
</el-select>
</div>
<!-- 中国地图 -->
<ChinaMapAnimation :chartData="chartData" :provinceName="areaValue"></ChinaMapAnimation>
</div>
</template>
<script>
import "@/utils/china"; //在[https://datav.aliyun.com/portal/school/atlas/area_selector]中下载全国的json数据
import areaList from '@/utils/area'; //下拉框的数据
import ChinaMapAnimation from "./components/chinaMapAnimation.vue";
export default {
components: {
ChinaMapAnimation,
},
data() {
return {
areaListOptions: areaList, //中国区域数据
areaValue: "全国",
}
},
mounted() {
this.areaListOptions.unshift({ value: "all", label: "全国" });
},
}
</script>
<style scoped lang="scss">
.digital {
// width: 350px;
width: 100%;
height: auto;
position: absolute;
// left: 28%;
top: 2%;
z-index: 99;
text-align: center;
::v-deep .el-input__inner {
background-color: transparent;
border: none;
font-size: 36px;
line-height: 50px;
height: 50px;
caret-color: transparent;
letter-spacing: 6px;
text-align: center;
// font-weight: bold;
color: #6690ff;
text-shadow: 2px 2px #eee;
padding: 0;
}
::v-deep .el-select .el-input .el-select__caret {
font-size: 24px;
color: #6690ff;
text-shadow: 1px 1px #eee;
}
::v-deep .el-cascader {
.el-input__icon:before {
content: "\e78f";
}
}
::v-deep .el-select {
.el-select__caret:before {
content: "\e78f";
}
}
::v-deep .el-input__suffix {
left: 0;
top: 30px;
}
::v-deep .el-select-dropdown__item {
color: #eee;
}
::v-deep .el-select-dropdown__item.hover {
background-color: #5483d3;
color: #eee;
}
::v-deep .el-scrollbar__wrap {
margin-bottom: -8px !important;
margin-right: -6px !important;
}
::v-deep .el-popper[x-placement^="bottom"] .popper__arrow::after {
border-bottom-color: #5483d3;
display: none;
}
::v-deep .el-popper[x-placement^=bottom] .popper__arrow{
display: none;
}
//
::v-deep .el-select-dropdown {
background-color: transparent;
border-color: #5483d3;
}
</style>
2.地图子组件的全部代码
<template>
<div
class="centerMap"
id="echartsMap"
style="width: 100%; height: 600px"
></div>
</template>
<script>
// 引入echarts
import * as echarts from "echarts";
export default {
props: {
provinceName: {
//父组件传入地图名称
type: String,
default: "北京市",
},
},
components: {},
data() {
// 这里存放数据
return {
myChart: null,
};
},
watch: {
provinceName(newvalue, oldValue) {
if (newvalue != oldValue) {
this.init();
}
},
immediate: false
},
mounted() {
this.init();
},
beforeDestroy() {
if (this.myChart) {
this.myChart.dispose();
}
},
// 方法集合
methods: {
init() {
let chartDom = document.getElementById("echartsMap");
const myChart = echarts.init(chartDom);
this.myChart = myChart;
const chinaGeoCoordMap = {
黑龙江: [127.9688, 45.368],
内蒙古: [110.3467, 41.4899],
吉林: [125.8154, 44.2584],
宜宾市: [104.630825, 28.760189],
辽宁: [123.1238, 42.1216],
河北: [114.4995, 38.1006],
北京: [116.405285, 39.904989],
天津: [117.4219, 39.4189],
山西: [112.3352, 37.9413],
陕西: [109.1162, 34.2004],
甘肃: [103.5901, 36.3043],
宁夏: [106.3586, 38.1775],
青海: [101.4038, 36.8207],
新疆: [87.9236, 43.5883],
西藏: [91.11, 29.97],
四川: [103.9526, 30.7617],
重庆: [108.384366, 30.439702],
山东: [117.1582, 36.8701],
河南: [113.4668, 34.6234],
江苏: [118.8062, 31.9208],
安徽: [117.29, 32.0581],
湖北: [114.3896, 30.6628],
浙江: [119.5313, 29.8773],
福建: [119.4543, 25.9222],
江西: [116.0046, 28.6633],
湖南: [113.0823, 28.2568],
贵州: [106.6992, 26.7682],
云南: [102.9199, 25.4663],
广东: [113.12244, 23.009505],
广西: [108.479, 23.1152],
海南: [110.3893, 19.8516],
上海: [121.4648, 31.2891],
};
// 散点
const chinaDatas = [];
const mapObject = { name: "", value: null };
// 飞线
const lineObject = { coords: [[117.4219, 39.4189]] };
const linesCoord = [];
for (const key in chinaGeoCoordMap) {
mapObject.name = key;
mapObject.value = chinaGeoCoordMap[key];
chinaDatas.push(JSON.parse(JSON.stringify(mapObject)));
if (key !== "天津") {
lineObject.coords[1] = chinaGeoCoordMap[key];
linesCoord.push(JSON.parse(JSON.stringify(lineObject)));
}
}
const option = {
geo: {
map: "china",
show: true,
roam: false,
layoutCenter: ["50%", "68%"], //地图位置
layoutSize: "128%",
label: {
emphasis: {
show: false,
},
},
// 选中的地区域高亮颜色**********重点
regions: [
{
name: this.provinceName,
itemStyle: {
areaColor: "#FFB800",
},
},
],
// 地图的背景色
itemStyle: {
normal: {
areaColor: "#09184F",
borderColor: "#00ffff",
shadowColor: "#6690FF",
shadowBlur: 10,
},
emphasis: {
areaColor: "#477BFF",
},
},
},
series: [
{
type: "effectScatter",
coordinateSystem: "geo",
// 要有对应的经纬度才显示,先经度再维度
data: chinaDatas,
showEffectOn: "render",
rippleEffect: {
scale: 4, // 波纹的最大缩放比例
brushType: "stroke",
},
hoverAnimation: true,
label: {
normal: {
show: true,
formatter: "{b}",
position: "right",
fontWeight: 500,
fontSize: 14,
},
},
itemStyle: {
normal: {
color: "#00e3ff",
shadowBlur: 10,
shadowColor: "#333",
},
},
emphasis: {
itemStyle: {
color: "#FFB800", // 高亮颜色
},
},
zlevel: 1,
},
{
type: "lines",
coordinateSystem: "geo",
zlevel: 1,
effect: {
show: true,
period: 5,
trailLength: 0,
symbol: "arrow",
color: "#01AAED",
symbolSize: 8,
},
lineStyle: {
normal: {
width: 1.2,
opacity: 0.6,
curveness: 0.2,
color: "#FFB800",
},
},
data: linesCoord,
},
],
};
myChart.setOption(option);
// 省份高亮函数
// if (this.provinceName) {
// myChart.dispatchAction({
// type: "downplay",
// seriesIndex: 0,
// name: this.provinceName,
// });
// myChart.dispatchAction({
// type: "highlight",
// seriesIndex: 0,
// dataIndex: myChart
// .getOption()
// .series[0].data.findIndex((item) => item.name === this.provinceName),
// name: this.provinceName,
// });
// }
},
},
};
</script>
<style lang="scss" scoped>
.centerMap {
width: 100%;
height: 600px;
// position: absolute !important;
margin: 0 auto;
margin-top:-10px;
::v-deep canvas {
width: 100% !important;
}
}
</style>
效果图展示: