update
parent
45aee04d6f
commit
92d1c07554
@ -1,544 +0,0 @@
|
||||
<template>
|
||||
<div :style="styleObj">
|
||||
<v-chart :options="options" autoresize/>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import echarts from 'echarts';
|
||||
|
||||
let geoMap = {
|
||||
'上海': '/assets/map/上海市.json',
|
||||
'云南': '/assets/map/云南省.json',
|
||||
'内蒙古': '/assets/map/内蒙古自治区.json',
|
||||
'北京': '/assets/map/北京市.json',
|
||||
'台湾': '/assets/map/台湾省.json',
|
||||
'吉林': '/assets/map/吉林省.json',
|
||||
'天津': '/assets/map/天津市.json',
|
||||
'宁夏': '/assets/map/宁夏回族自治区.json',
|
||||
'安徽': '/assets/map/安徽省.json',
|
||||
'山东': '/assets/map/山东省.json',
|
||||
'山西': '/assets/map/山西省.json',
|
||||
'广东': '/assets/map/广东省.json',
|
||||
'广西': '/assets/map/广西壮族自治区.json',
|
||||
'新疆': '/assets/map/新疆维吾尔自治区.json',
|
||||
'江苏': '/assets/map/江苏省.json',
|
||||
'江西': '/assets/map/江西省.json',
|
||||
'河北': '/assets/map/河北省.json',
|
||||
'河南': '/assets/map/河南省.json',
|
||||
'海南': '/assets/map/海南省.json',
|
||||
'湖北': '/assets/map/湖北省.json',
|
||||
'湖南': '/assets/map/湖南省.json',
|
||||
'澳门': '/assets/map/澳门特别行政区.json',
|
||||
'甘肃': '/assets/map/甘肃省.json',
|
||||
'福建': '/assets/map/福建省.json',
|
||||
'西藏': '/assets/map/西藏自治区.json',
|
||||
'贵州': '/assets/map/贵州省.json',
|
||||
'辽宁': '/assets/map/辽宁省.json',
|
||||
'重庆': '/assets/map/重庆市.json',
|
||||
'陕西': '/assets/map/陕西省.json',
|
||||
'青海': '/assets/map/青海省.json',
|
||||
'香港': '/assets/map/香港特别行政区.json',
|
||||
'黑龙江': '/assets/map/黑龙江省.json',
|
||||
};
|
||||
export default {
|
||||
name: 'allMap',
|
||||
data() {
|
||||
return {
|
||||
myCharts: null,
|
||||
geo: {
|
||||
map: "china",
|
||||
show: true,
|
||||
roam: false,
|
||||
label: {
|
||||
emphasis: {
|
||||
show: false
|
||||
}
|
||||
},
|
||||
layoutSize: "80%",
|
||||
itemStyle: {
|
||||
normal: {
|
||||
borderColor: new echarts.graphic.LinearGradient(
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
[
|
||||
{
|
||||
offset: 0,
|
||||
color: "#00F6FF"
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: "#53D9FF"
|
||||
}
|
||||
],
|
||||
false
|
||||
),
|
||||
borderWidth: 3,
|
||||
shadowColor: "rgba(10,76,139,1)",
|
||||
shadowOffsetY: 0,
|
||||
shadowBlur: 60
|
||||
}
|
||||
}
|
||||
},
|
||||
series:[],
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.getGeoJson(100000)
|
||||
},
|
||||
methods: {
|
||||
getGeoJson(adcode) {
|
||||
let that = this;
|
||||
AMapUI.loadUI(["geo/DistrictExplorer"], DistrictExplorer => {
|
||||
var districtExplorer = new DistrictExplorer();
|
||||
districtExplorer.loadAreaNode(adcode, function (error, areaNode) {
|
||||
if (error) {
|
||||
console.error(error);
|
||||
return;
|
||||
}
|
||||
let Json = areaNode.getSubFeatures();
|
||||
if (Json.length > 0) {
|
||||
that.geoJson.features = Json;
|
||||
} else if (Json.length === 0) {
|
||||
that.geoJson.features = that.geoJson.features.filter(
|
||||
item => item.properties.adcode == adcode
|
||||
);
|
||||
if (that.geoJson.features.length === 0) return;
|
||||
}
|
||||
that.getMapData();
|
||||
});
|
||||
});
|
||||
},
|
||||
//获取数据
|
||||
getMapData() {
|
||||
let mapData = {},
|
||||
pointData = {},
|
||||
sum = {}
|
||||
this.timeTitle.forEach(item => {
|
||||
mapData[item] = []
|
||||
pointData[item] = []
|
||||
sum[item] = 0
|
||||
this.geoJson.features.forEach(j => {
|
||||
let value = Math.random() * 3000
|
||||
mapData[item].push({
|
||||
name: j.properties.name,
|
||||
value: value,
|
||||
cityCode: j.properties.adcode
|
||||
})
|
||||
pointData[item].push({
|
||||
name: j.properties.name,
|
||||
value: [j.properties.center[0], j.properties.center[1], value],
|
||||
cityCode: j.properties.adcode
|
||||
})
|
||||
sum[item] += value
|
||||
})
|
||||
mapData[item] = mapData[item].sort(function (a, b) {
|
||||
return b.value - a.value
|
||||
});
|
||||
})
|
||||
this.initEcharts(mapData, pointData, sum)
|
||||
},
|
||||
initEcharts(mapData, pointData, sum) {
|
||||
this.myChart = echarts.init(this.$refs.allMap)
|
||||
if (this.parentInfo.length === 1) {
|
||||
echarts.registerMap('china', this.geoJson); //注册
|
||||
} else {
|
||||
echarts.registerMap('map', this.geoJson); //注册
|
||||
}
|
||||
var option = {
|
||||
timeline: {
|
||||
data: this.timeTitle,
|
||||
axisType: 'category',
|
||||
autoPlay: true,
|
||||
playInterval: 3000,
|
||||
left: '10%',
|
||||
right: '10%',
|
||||
bottom: '2%',
|
||||
width: '80%',
|
||||
label: {
|
||||
normal: {
|
||||
textStyle: {
|
||||
color: 'rgb(179, 239, 255)'
|
||||
}
|
||||
},
|
||||
emphasis: {
|
||||
textStyle: {
|
||||
color: '#fff'
|
||||
}
|
||||
}
|
||||
},
|
||||
symbolSize: 10,
|
||||
lineStyle: {
|
||||
color: '#8df4f4'
|
||||
},
|
||||
checkpointStyle: {
|
||||
borderColor: '#8df4f4',
|
||||
color: '#53D9FF',
|
||||
borderWidth: 2,
|
||||
},
|
||||
controlStyle: {
|
||||
showNextBtn: true,
|
||||
showPrevBtn: true,
|
||||
normal: {
|
||||
color: '#53D9FF',
|
||||
borderColor: '#53D9FF'
|
||||
},
|
||||
emphasis: {
|
||||
color: 'rgb(58,115,192)',
|
||||
borderColor: 'rgb(58,115,192)'
|
||||
}
|
||||
},
|
||||
},
|
||||
baseOption: {
|
||||
animation: true,
|
||||
animationDuration: 900,
|
||||
animationEasing: 'cubicInOut',
|
||||
animationDurationUpdate: 900,
|
||||
animationEasingUpdate: 'cubicInOut',
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
axisPointer: {
|
||||
type: 'shadow'
|
||||
},
|
||||
},
|
||||
grid: {
|
||||
right: '2%',
|
||||
top: '12%',
|
||||
bottom: '8%',
|
||||
width: '20%'
|
||||
},
|
||||
toolbox: {
|
||||
feature: {
|
||||
restore: {
|
||||
show: false
|
||||
},
|
||||
dataView: {
|
||||
optionToContent: function (opt) {
|
||||
let series = opt.series[0].data //折线图数据
|
||||
let tdHeads =
|
||||
'<th style="padding: 0 20px">所在地区</th><th style="padding: 0 20px">销售额</th>' //表头
|
||||
let tdBodys = '' //数据
|
||||
let table =
|
||||
`<table border="1" style="margin-left:20px;border-collapse:collapse;font-size:14px;text-align:left;"><tbody><tr>${tdHeads} </tr>`
|
||||
for (let i = 0; i < series.length; i++) {
|
||||
table += `<tr>
|
||||
<td style="padding: 0 50px">${series[i].name}</td>
|
||||
<td style="padding: 0 50px">${series[i].value.toFixed(2)}万</td>
|
||||
</tr>`
|
||||
}
|
||||
table += '</tbody></table>'
|
||||
return table
|
||||
}
|
||||
},
|
||||
saveAsImage: {
|
||||
name: this.parentInfo[this.parentInfo.length - 1].cityName + '销售额统计图'
|
||||
},
|
||||
dataZoom: {
|
||||
show: false
|
||||
},
|
||||
magicType: {
|
||||
show: false
|
||||
}
|
||||
},
|
||||
iconStyle: {
|
||||
normal: {
|
||||
borderColor: '#1990DA'
|
||||
}
|
||||
},
|
||||
top: 15,
|
||||
right: 35
|
||||
},
|
||||
geo: {
|
||||
map: this.parentInfo.length === 1 ? 'china' : 'map',
|
||||
zoom: 1.1,
|
||||
roam: true,
|
||||
center: this.parentInfo.length === 1 ? ['118.83531246', '32.0267395887'] : false,
|
||||
tooltip: {
|
||||
trigger: 'item',
|
||||
formatter: (p) => {
|
||||
let val = p.value[2];
|
||||
if (window.isNaN(val)) {
|
||||
val = 0;
|
||||
}
|
||||
let txtCon =
|
||||
"<div style='text-align:left'>" + p.name + ":<br />销售额:" + val.toFixed(
|
||||
2) + '万</div>';
|
||||
return txtCon;
|
||||
}
|
||||
},
|
||||
label: {
|
||||
normal: {
|
||||
show: true,
|
||||
color: "rgb(249, 249, 249)", //省份标签字体颜色
|
||||
formatter: p => {
|
||||
switch (p.name) {
|
||||
case '内蒙古自治区':
|
||||
p.name = "内蒙古"
|
||||
break;
|
||||
case '西藏自治区':
|
||||
p.name = "西藏"
|
||||
break;
|
||||
case '新疆维吾尔自治区':
|
||||
p.name = "新疆"
|
||||
break;
|
||||
case '宁夏回族自治区':
|
||||
p.name = "宁夏"
|
||||
break;
|
||||
case '广西壮族自治区':
|
||||
p.name = "广西"
|
||||
break;
|
||||
case '香港特别行政区':
|
||||
p.name = "香港"
|
||||
break;
|
||||
case '澳门特别行政区':
|
||||
p.name = "澳门"
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return p.name;
|
||||
}
|
||||
},
|
||||
emphasis: {
|
||||
show: true,
|
||||
color: '#f75a00',
|
||||
}
|
||||
},
|
||||
itemStyle: {
|
||||
normal: {
|
||||
areaColor: '#24CFF4',
|
||||
borderColor: '#53D9FF',
|
||||
borderWidth: 1.3,
|
||||
shadowBlur: 15,
|
||||
shadowColor: 'rgb(58,115,192)',
|
||||
shadowOffsetX: 7,
|
||||
shadowOffsetY: 6,
|
||||
},
|
||||
emphasis: {
|
||||
areaColor: '#8dd7fc',
|
||||
borderWidth: 1.6,
|
||||
shadowBlur: 25,
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
options: []
|
||||
}
|
||||
this.timeTitle.forEach(item => {
|
||||
var xData = [],
|
||||
yData = []
|
||||
var min = mapData[item][mapData[item].length - 1].value
|
||||
var max = mapData[item][0].value
|
||||
if (mapData[item].length === 1) {
|
||||
min = 0
|
||||
}
|
||||
mapData[item].forEach(c => {
|
||||
xData.unshift(c.name)
|
||||
yData.unshift(c.value)
|
||||
})
|
||||
option.options.push({
|
||||
title: [{
|
||||
left: 'center',
|
||||
top: 10,
|
||||
text: item + this.parentInfo[this.parentInfo.length - 1].cityName +
|
||||
'年' +
|
||||
'销售额统计图(可点击下钻到县)',
|
||||
textStyle: {
|
||||
color: 'rgb(179, 239, 255)',
|
||||
fontSize: 16
|
||||
},
|
||||
},
|
||||
{
|
||||
text: "销售总额:" + sum[item].toFixed(2) + '万',
|
||||
left: 'center',
|
||||
top: '6.5%',
|
||||
textStyle: {
|
||||
color: '#FFAC50',
|
||||
fontSize: 26
|
||||
}
|
||||
}
|
||||
],
|
||||
visualMap: {
|
||||
min: min,
|
||||
max: max,
|
||||
left: '3%',
|
||||
bottom: '5%',
|
||||
calculable: true,
|
||||
seriesIndex: [0],
|
||||
inRange: {
|
||||
color: ['#24CFF4', '#2E98CA', '#1E62AC']
|
||||
},
|
||||
textStyle: {
|
||||
color: '#24CFF4'
|
||||
}
|
||||
},
|
||||
xAxis: {
|
||||
type: 'value',
|
||||
scale: true,
|
||||
position: 'top',
|
||||
boundaryGap: false,
|
||||
splitLine: {
|
||||
show: false
|
||||
},
|
||||
axisLine: {
|
||||
show: true,
|
||||
lineStyle: {
|
||||
color: '#455B77'
|
||||
}
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
},
|
||||
axisLabel: {
|
||||
margin: 2,
|
||||
textStyle: {
|
||||
fontSize: 12,
|
||||
color: '#c0e6f9'
|
||||
}
|
||||
},
|
||||
},
|
||||
yAxis: {
|
||||
type: 'category',
|
||||
nameGap: 16,
|
||||
axisLine: {
|
||||
show: true,
|
||||
lineStyle: {
|
||||
color: '#455B77'
|
||||
}
|
||||
},
|
||||
axisTick: {
|
||||
show: false,
|
||||
},
|
||||
axisLabel: {
|
||||
interval: 0,
|
||||
textStyle: {
|
||||
color: '#c0e6f9'
|
||||
}
|
||||
},
|
||||
data: xData
|
||||
},
|
||||
series: [{
|
||||
name: item + '销售额度',
|
||||
type: 'map',
|
||||
geoIndex: 0,
|
||||
map: this.parentInfo.length === 1 ? 'china' : 'map',
|
||||
roam: true,
|
||||
zoom: 1.3,
|
||||
tooltip: {
|
||||
trigger: "item",
|
||||
formatter: p => {
|
||||
let val = p.value;
|
||||
if (p.name == '南海诸岛') return
|
||||
if (window.isNaN(val)) {
|
||||
val = 0;
|
||||
}
|
||||
let txtCon =
|
||||
"<div style='text-align:left'>" + p.name +
|
||||
":<br />销售额:" + val.toFixed(2) + '万</div>';
|
||||
return txtCon;
|
||||
}
|
||||
},
|
||||
label: {
|
||||
normal: {
|
||||
show: false,
|
||||
},
|
||||
emphasis: {
|
||||
show: false,
|
||||
}
|
||||
},
|
||||
data: mapData[item],
|
||||
}, {
|
||||
name: '散点',
|
||||
type: 'effectScatter',
|
||||
coordinateSystem: 'geo',
|
||||
rippleEffect: {
|
||||
brushType: 'fill'
|
||||
},
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: '#F4E925',
|
||||
shadowBlur: 10,
|
||||
shadowColor: '#333'
|
||||
}
|
||||
},
|
||||
data: pointData[item],
|
||||
// symbolSize: 8,
|
||||
symbolSize: function (val) {
|
||||
let value = val[2]
|
||||
if (value == max) {
|
||||
return 27
|
||||
}
|
||||
return 10
|
||||
},
|
||||
showEffectOn: 'render', //加载完毕显示特效
|
||||
},
|
||||
{
|
||||
type: 'bar',
|
||||
barGap: '-100%',
|
||||
barCategoryGap: '55%',
|
||||
itemStyle: {
|
||||
normal: {
|
||||
barBorderRadius: 30,
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [{
|
||||
offset: 0,
|
||||
color: 'rgb(57,89,255,1)'
|
||||
}, {
|
||||
offset: 1,
|
||||
color: 'rgb(46,200,207,1)'
|
||||
}]),
|
||||
},
|
||||
emphasis: {
|
||||
show: false
|
||||
}
|
||||
},
|
||||
data: yData
|
||||
}
|
||||
]
|
||||
})
|
||||
})
|
||||
this.myChart.setOption(option, true)
|
||||
this.myChart.off('click');
|
||||
this.myChart.on('click', this.echartsMapClick);
|
||||
},
|
||||
//点击下钻
|
||||
echartsMapClick(params) {
|
||||
if (!params.data) {
|
||||
return
|
||||
}
|
||||
if (
|
||||
this.parentInfo[this.parentInfo.length - 1].code ==
|
||||
params.data.cityCode
|
||||
) {
|
||||
return;
|
||||
}
|
||||
let data = params.data;
|
||||
this.parentInfo.push({
|
||||
cityName: data.name,
|
||||
code: data.cityCode
|
||||
});
|
||||
this.getGeoJson(data.cityCode);
|
||||
},
|
||||
//选择切换市县
|
||||
chooseArea(val, index) {
|
||||
if (this.parentInfo.length === index + 1) {
|
||||
return
|
||||
}
|
||||
this.parentInfo.splice(index + 1)
|
||||
this.getGeoJson(this.parentInfo[this.parentInfo.length - 1].code);
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.echartMap {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.echarts {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
</style>
|
Loading…
Reference in New Issue