|
@@ -2,39 +2,34 @@
|
|
<div class="spatiotemporal-distribution">
|
|
<div class="spatiotemporal-distribution">
|
|
<!-- 筛选条件 -->
|
|
<!-- 筛选条件 -->
|
|
<el-card class="filter-card">
|
|
<el-card class="filter-card">
|
|
- <el-form :inline="true" :model="filters" size="small">
|
|
|
|
- <el-form-item label="疾病名称">
|
|
|
|
- <el-select
|
|
|
|
- v-model="filters.disease"
|
|
|
|
- filterable
|
|
|
|
- remote
|
|
|
|
- reserve-keyword
|
|
|
|
- placeholder="请输入疾病名称"
|
|
|
|
- :remote-method="searchDisease"
|
|
|
|
- :loading="diseaseLoading"
|
|
|
|
|
|
+ <el-form :inline="true" :model="form" size="small">
|
|
|
|
+ <el-form-item label="病原体名称">
|
|
|
|
+ <el-input
|
|
|
|
+ v-model="form.bytName"
|
|
|
|
+ placeholder="请输入病原体名称"
|
|
style="width: 180px"
|
|
style="width: 180px"
|
|
- >
|
|
|
|
- <el-option
|
|
|
|
- v-for="item in diseaseOptions"
|
|
|
|
- :key="item"
|
|
|
|
- :label="item"
|
|
|
|
- :value="item"
|
|
|
|
- />
|
|
|
|
- </el-select>
|
|
|
|
|
|
+ @keyup.enter="fetchAllData"
|
|
|
|
+ />
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item label="亚型">
|
|
<el-form-item label="亚型">
|
|
- <el-select v-model="filters.subtype" placeholder="请选择亚型" style="width: 120px">
|
|
|
|
- <el-option v-for="item in subtypeOptions" :key="item" :label="item" :value="item" />
|
|
|
|
- </el-select>
|
|
|
|
|
|
+ <el-input
|
|
|
|
+ v-model="form.batch"
|
|
|
|
+ placeholder="请输入亚型"
|
|
|
|
+ style="width: 180px"
|
|
|
|
+ @keyup.enter="fetchAllData"
|
|
|
|
+ />
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item label="分支">
|
|
<el-form-item label="分支">
|
|
- <el-select v-model="filters.branch" placeholder="请选择分支" style="width: 120px">
|
|
|
|
- <el-option v-for="item in branchOptions" :key="item" :label="item" :value="item" />
|
|
|
|
- </el-select>
|
|
|
|
|
|
+ <el-input
|
|
|
|
+ v-model="form.model"
|
|
|
|
+ placeholder="请输入分支"
|
|
|
|
+ style="width: 180px"
|
|
|
|
+ @keyup.enter="fetchAllData"
|
|
|
|
+ />
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item label="时间">
|
|
<el-form-item label="时间">
|
|
<el-date-picker
|
|
<el-date-picker
|
|
- v-model="filters.dateRange"
|
|
|
|
|
|
+ v-model="form.dateRange"
|
|
type="daterange"
|
|
type="daterange"
|
|
range-separator="至"
|
|
range-separator="至"
|
|
start-placeholder="开始日期"
|
|
start-placeholder="开始日期"
|
|
@@ -44,17 +39,39 @@
|
|
/>
|
|
/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item label="地区">
|
|
<el-form-item label="地区">
|
|
- <el-cascader
|
|
|
|
|
|
+ <el-input
|
|
|
|
+ v-model="form.country"
|
|
|
|
+ placeholder="请输入地区"
|
|
|
|
+ style="width: 180px"
|
|
|
|
+ @keyup.enter="fetchAllData"
|
|
|
|
+ />
|
|
|
|
+ <!-- <el-cascader
|
|
v-model="filters.region"
|
|
v-model="filters.region"
|
|
:options="regionOptions"
|
|
:options="regionOptions"
|
|
:props="{ checkStrictly: true, emitPath: false }"
|
|
:props="{ checkStrictly: true, emitPath: false }"
|
|
placeholder="请选择地区"
|
|
placeholder="请选择地区"
|
|
style="width: 200px"
|
|
style="width: 200px"
|
|
@change="onRegionChange"
|
|
@change="onRegionChange"
|
|
|
|
+ /> -->
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <el-form-item label="省份">
|
|
|
|
+ <el-input
|
|
|
|
+ v-model="form.province"
|
|
|
|
+ placeholder="请输入省份"
|
|
|
|
+ style="width: 180px"
|
|
|
|
+ @keyup.enter="fetchAllData"
|
|
/>
|
|
/>
|
|
|
|
+ <!-- <el-cascader
|
|
|
|
+ v-model="filters.region"
|
|
|
|
+ :options="regionOptions"
|
|
|
|
+ :props="{ checkStrictly: true, emitPath: false }"
|
|
|
|
+ placeholder="请选择地区"
|
|
|
|
+ style="width: 200px"
|
|
|
|
+ @change="onRegionChange"
|
|
|
|
+ /> -->
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item>
|
|
<el-form-item>
|
|
- <el-button type="primary" @click="fetchAllData">筛选</el-button>
|
|
|
|
|
|
+ <el-button type="primary" @click="fetchAllData">查询</el-button>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
</el-form>
|
|
</el-form>
|
|
</el-card>
|
|
</el-card>
|
|
@@ -71,10 +88,10 @@
|
|
<div ref="barChart" style="height: 320px;"></div>
|
|
<div ref="barChart" style="height: 320px;"></div>
|
|
</el-card>
|
|
</el-card>
|
|
<!-- 子图三:分支饼图 -->
|
|
<!-- 子图三:分支饼图 -->
|
|
- <el-card class="chart-card">
|
|
|
|
|
|
+ <!-- <el-card class="chart-card">
|
|
<div slot="header">病原体分支分布饼图</div>
|
|
<div slot="header">病原体分支分布饼图</div>
|
|
<div ref="pieChart" style="height: 320px;"></div>
|
|
<div ref="pieChart" style="height: 320px;"></div>
|
|
- </el-card>
|
|
|
|
|
|
+ </el-card> -->
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<!-- 地图 -->
|
|
<!-- 地图 -->
|
|
@@ -89,16 +106,52 @@
|
|
|
|
|
|
<script>
|
|
<script>
|
|
import * as echarts from 'echarts';
|
|
import * as echarts from 'echarts';
|
|
-import AMapLoader from '@amap/amap-jsapi-loader';
|
|
|
|
|
|
+import chinaJson from 'echarts/map/json/china.json';
|
|
|
|
+import worldJson from 'echarts/map/json/world.json';
|
|
|
|
|
|
-// 引入中国地图
|
|
|
|
-// // 按需引入中国地图和世界地图
|
|
|
|
-// import chinaJson from 'echarts/map/json/china.json';
|
|
|
|
-// import worldJson from 'echarts/map/json/world.json';
|
|
|
|
|
|
+import {getbytzbInfo, getbytzzfbnfo, getsjbytztqkInfo,getzgbytztqkInfo} from '@/api/statistics/report';
|
|
|
|
+
|
|
|
|
+echarts.registerMap('china', chinaJson);
|
|
|
|
+echarts.registerMap('world', worldJson);
|
|
|
|
+
|
|
|
|
+// 假数据
|
|
|
|
+const worldPieData = {
|
|
|
|
+ '中国': [
|
|
|
|
+ { value: 335, name: '分支 A' },
|
|
|
|
+ { value: 310, name: '分支 B' },
|
|
|
|
+ { value: 234, name: '分支 C' }
|
|
|
|
+ ],
|
|
|
|
+ '美国': [
|
|
|
|
+ { value: 200, name: '分支 X' },
|
|
|
|
+ { value: 150, name: '分支 Y' },
|
|
|
|
+ { value: 100, name: '分支 Z' }
|
|
|
|
+ ]
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const chinaPieData = {
|
|
|
|
+ '北京市': [
|
|
|
|
+ { value: 150, name: '分支 A1' },
|
|
|
|
+ { value: 120, name: '分支 B1' },
|
|
|
|
+ { value: 80, name: '分支 C1' }
|
|
|
|
+ ],
|
|
|
|
+ '上海市': [
|
|
|
|
+ { value: 180, name: '分支 A2' },
|
|
|
|
+ { value: 130, name: '分支 B2' },
|
|
|
|
+ { value: 90, name: '分支 C2' }
|
|
|
|
+ ]
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+// 定义中国省份和世界国家的经纬度
|
|
|
|
+const chinaGeoCoordMap = {
|
|
|
|
+ '北京市': [116.46, 39.92],
|
|
|
|
+ '上海市': [121.48, 31.22]
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const worldGeoCoordMap = {
|
|
|
|
+ '中国': [104.1954, 35.8617],
|
|
|
|
+ '美国': [-95.7129, 37.0902]
|
|
|
|
+};
|
|
|
|
|
|
-// // 注册地图
|
|
|
|
-// echarts.registerMap('china', chinaJson);
|
|
|
|
-// echarts.registerMap('world', worldJson);
|
|
|
|
export default {
|
|
export default {
|
|
name: 'SpatiotemporalDistribution',
|
|
name: 'SpatiotemporalDistribution',
|
|
data() {
|
|
data() {
|
|
@@ -120,21 +173,35 @@ export default {
|
|
pieData: [],
|
|
pieData: [],
|
|
mapData: [],
|
|
mapData: [],
|
|
description: '',
|
|
description: '',
|
|
- isChinaMap: false
|
|
|
|
- }
|
|
|
|
|
|
+ isChinaMap: false,
|
|
|
|
+ growthChart: null,
|
|
|
|
+ barChart: null,
|
|
|
|
+ pieChart: null,
|
|
|
|
+ mapChart: null,
|
|
|
|
+ form:{
|
|
|
|
+ batch: "",
|
|
|
|
+ bytName: "",
|
|
|
|
+ country: "",
|
|
|
|
+ endDate: "",
|
|
|
|
+ model: "",
|
|
|
|
+ province: "",
|
|
|
|
+ startDate: "",
|
|
|
|
+ dateRange: []
|
|
|
|
+ }
|
|
|
|
+ };
|
|
},
|
|
},
|
|
mounted() {
|
|
mounted() {
|
|
- this.initRegionOptions()
|
|
|
|
- this.initCharts()
|
|
|
|
- this.initMap()
|
|
|
|
|
|
+ // this.initRegionOptions();
|
|
|
|
+ this.fetchAllData()
|
|
|
|
+ this.initCharts();
|
|
},
|
|
},
|
|
methods: {
|
|
methods: {
|
|
async searchDisease(query) {
|
|
async searchDisease(query) {
|
|
- if (!query) return
|
|
|
|
- this.diseaseLoading = true
|
|
|
|
|
|
+ if (!query) return;
|
|
|
|
+ this.diseaseLoading = true;
|
|
// 假数据
|
|
// 假数据
|
|
- this.diseaseOptions = ['疾病 A', '疾病 B', '疾病 C'].filter(item => item.includes(query))
|
|
|
|
- this.diseaseLoading = false
|
|
|
|
|
|
+ this.diseaseOptions = ['疾病 A', '疾病 B', '疾病 C'].filter(item => item.includes(query));
|
|
|
|
+ this.diseaseLoading = false;
|
|
},
|
|
},
|
|
async initRegionOptions() {
|
|
async initRegionOptions() {
|
|
// 假数据
|
|
// 假数据
|
|
@@ -154,59 +221,86 @@ export default {
|
|
{ value: '美国', label: '美国' }
|
|
{ value: '美国', label: '美国' }
|
|
]
|
|
]
|
|
}
|
|
}
|
|
- ]
|
|
|
|
|
|
+ ];
|
|
},
|
|
},
|
|
async onRegionChange(val) {
|
|
async onRegionChange(val) {
|
|
// 切换地图模式
|
|
// 切换地图模式
|
|
if (val && val.length && val[val.length - 1] === '中国') {
|
|
if (val && val.length && val[val.length - 1] === '中国') {
|
|
- this.isChinaMap = true
|
|
|
|
|
|
+ this.isChinaMap = true;
|
|
} else {
|
|
} else {
|
|
- this.isChinaMap = false
|
|
|
|
|
|
+ this.isChinaMap = false;
|
|
}
|
|
}
|
|
- // 可根据地区动态加载下一级选项
|
|
|
|
|
|
+ this.fetchAllData();
|
|
},
|
|
},
|
|
async fetchAllData() {
|
|
async fetchAllData() {
|
|
- // 联动下拉框
|
|
|
|
- if (this.filters.disease) {
|
|
|
|
- // 假数据
|
|
|
|
- this.subtypeOptions = ['亚型 1', '亚型 2', '亚型 3']
|
|
|
|
|
|
+ if (this.form.dateRange.length > 0) {
|
|
|
|
+ const [startDate, endDate] = this.form.dateRange;
|
|
|
|
+ this.form.startDate = startDate;
|
|
|
|
+ this.form.endDate = endDate;
|
|
}
|
|
}
|
|
- if (this.filters.subtype) {
|
|
|
|
- // 假数据
|
|
|
|
- this.branchOptions = ['分支 A', '分支 B', '分支 C']
|
|
|
|
|
|
+
|
|
|
|
+ // 获取数据
|
|
|
|
+ try {
|
|
|
|
+ const response = await getbytzbInfo(this.form);
|
|
|
|
+ const response2 = await getbytzzfbnfo(this.form);
|
|
|
|
+ const response3 = await getsjbytztqkInfo(this.form);
|
|
|
|
+ const response4 = await getzgbytztqkInfo(this.form);
|
|
|
|
+ this.growthData = response.data;
|
|
|
|
+ this.barData = response2.data;
|
|
|
|
+ } catch (error) {
|
|
|
|
+ console.error('获取数据失败:', error);
|
|
|
|
+ this.$message.error('获取数据失败,请稍后重试');
|
|
}
|
|
}
|
|
- // 获取假数据
|
|
|
|
- this.growthData = [
|
|
|
|
- { date: '2025-06-01', value: 10, ratio: 10, count: 5 },
|
|
|
|
- { date: '2025-06-02', value: 20, ratio: 20, count: 8 }
|
|
|
|
- ]
|
|
|
|
- this.barData = [
|
|
|
|
- { region: '中国', count: 100, percent: 60 },
|
|
|
|
- { region: '美国', count: 80, percent: 40 }
|
|
|
|
- ]
|
|
|
|
- this.pieData = [
|
|
|
|
- { value: 335, name: '分支 A' },
|
|
|
|
- { value: 310, name: '分支 B' },
|
|
|
|
- { value: 234, name: '分支 C' }
|
|
|
|
- ]
|
|
|
|
- this.mapData = [
|
|
|
|
- { name: '中国', value: 100 },
|
|
|
|
- { name: '美国', value: 80 }
|
|
|
|
- ]
|
|
|
|
- this.description = '这是一段假的数据分析文本。'
|
|
|
|
- this.renderCharts()
|
|
|
|
|
|
+
|
|
|
|
+ // // 联动下拉框
|
|
|
|
+ // if (this.filters.disease) {
|
|
|
|
+ // // 假数据
|
|
|
|
+ // this.subtypeOptions = ['亚型 1', '亚型 2', '亚型 3'];
|
|
|
|
+ // }
|
|
|
|
+ // if (this.filters.subtype) {
|
|
|
|
+ // // 假数据
|
|
|
|
+ // this.branchOptions = ['分支 A', '分支 B', '分支 C'];
|
|
|
|
+ // }
|
|
|
|
+ // // 获取假数据
|
|
|
|
+ // this.growthData = [
|
|
|
|
+ // { date: '2025-06-01', value: 10, ratio: 10, count: 5 },
|
|
|
|
+ // { date: '2025-06-02', value: 20, ratio: 20, count: 8 }
|
|
|
|
+ // ];
|
|
|
|
+ // this.barData = [
|
|
|
|
+ // { region: '中国', count: 100, percent: 60 },
|
|
|
|
+ // { region: '美国', count: 80, percent: 40 }
|
|
|
|
+ // ];
|
|
|
|
+ // this.mapData = this.isChinaMap
|
|
|
|
+ // ? Object.keys(chinaPieData).map(name => {
|
|
|
|
+ // const geoCoord = chinaGeoCoordMap[name] || [0, 0]; // 若经纬度不存在,使用默认值 [0, 0]
|
|
|
|
+ // return {
|
|
|
|
+ // name,
|
|
|
|
+ // value: [...geoCoord, chinaPieData[name].reduce((sum, item) => sum + item.value, 0)],
|
|
|
|
+ // data: chinaPieData[name]
|
|
|
|
+ // };
|
|
|
|
+ // })
|
|
|
|
+ // : Object.keys(worldPieData).map(name => {
|
|
|
|
+ // const geoCoord = worldGeoCoordMap[name] || [0, 0]; // 若经纬度不存在,使用默认值 [0, 0]
|
|
|
|
+ // return {
|
|
|
|
+ // name,
|
|
|
|
+ // value: [...geoCoord, worldPieData[name].reduce((sum, item) => sum + item.value, 0)],
|
|
|
|
+ // data: worldPieData[name]
|
|
|
|
+ // };
|
|
|
|
+ // });
|
|
|
|
+ // this.description = '这是一段假的数据分析文本。';
|
|
|
|
+ this.renderCharts();
|
|
},
|
|
},
|
|
initCharts() {
|
|
initCharts() {
|
|
- this.growthChart = echarts.init(this.$refs.growthChart)
|
|
|
|
- this.barChart = echarts.init(this.$refs.barChart)
|
|
|
|
- this.pieChart = echarts.init(this.$refs.pieChart)
|
|
|
|
- // this.mapChart = echarts.init(this.$refs.mapChart)
|
|
|
|
|
|
+ this.growthChart = echarts.init(this.$refs.growthChart);
|
|
|
|
+ this.barChart = echarts.init(this.$refs.barChart);
|
|
|
|
+ // this.pieChart = echarts.init(this.$refs.pieChart);
|
|
|
|
+ this.mapChart = echarts.init(this.$refs.mapContainer);
|
|
window.addEventListener('resize', () => {
|
|
window.addEventListener('resize', () => {
|
|
- this.growthChart.resize()
|
|
|
|
- this.barChart.resize()
|
|
|
|
- this.pieChart.resize()
|
|
|
|
- // this.mapChart.resize()
|
|
|
|
- })
|
|
|
|
|
|
+ this.growthChart.resize();
|
|
|
|
+ this.barChart.resize();
|
|
|
|
+ // this.pieChart.resize();
|
|
|
|
+ this.mapChart.resize();
|
|
|
|
+ });
|
|
},
|
|
},
|
|
renderCharts() {
|
|
renderCharts() {
|
|
// 子图一:增长率曲线
|
|
// 子图一:增长率曲线
|
|
@@ -214,114 +308,151 @@ export default {
|
|
tooltip: {
|
|
tooltip: {
|
|
trigger: 'axis',
|
|
trigger: 'axis',
|
|
formatter: params => {
|
|
formatter: params => {
|
|
- const p = params[0]
|
|
|
|
- return `时间: ${p.name}<br/>累计占比: ${p.data.ratio}%<br/>分支数: ${p.data.count}`
|
|
|
|
|
|
+ const p = params[0];
|
|
|
|
+ return `时间: ${p.name}<br/>数量: ${p.value}`;
|
|
}
|
|
}
|
|
},
|
|
},
|
|
- xAxis: { type: 'category', data: this.growthData.map(i => i.date) },
|
|
|
|
- yAxis: { type: 'value' },
|
|
|
|
|
|
+ xAxis: {
|
|
|
|
+ type: 'category',
|
|
|
|
+ data: this.growthData.map(item => item.day)
|
|
|
|
+ },
|
|
|
|
+ yAxis: {
|
|
|
|
+ type: 'value',
|
|
|
|
+ name: '增长率'
|
|
|
|
+ },
|
|
series: [{
|
|
series: [{
|
|
- data: this.growthData.map(i => ({ value: i.value, ratio: i.ratio, count: i.count })),
|
|
|
|
|
|
+ data: this.growthData.map(item => ({ value: item.per })),
|
|
type: 'line',
|
|
type: 'line',
|
|
smooth: true
|
|
smooth: true
|
|
}]
|
|
}]
|
|
- })
|
|
|
|
|
|
+ });
|
|
// 子图二:分区条形图
|
|
// 子图二:分区条形图
|
|
|
|
+ // 提取所有地区名称
|
|
|
|
+ const regions = this.barData.length > 0
|
|
|
|
+ ? Object.keys(this.barData[0]).filter(key => key!== 'day')
|
|
|
|
+ : [];
|
|
|
|
+ // 提取所有日期
|
|
|
|
+ const dates = this.barData.map(item => item.day);
|
|
|
|
+
|
|
|
|
+ // 生成每个地区对应的系列数据
|
|
|
|
+ const seriesData = regions.map(region => ({
|
|
|
|
+ name: region,
|
|
|
|
+ type: 'bar',
|
|
|
|
+ data: this.barData.map(item => item[region])
|
|
|
|
+ }));
|
|
|
|
+
|
|
this.barChart.setOption({
|
|
this.barChart.setOption({
|
|
- tooltip: { trigger: 'axis' },
|
|
|
|
- legend: { data: ['数量', '百分比'] },
|
|
|
|
- xAxis: { type: 'category', data: this.barData.map(i => i.region) },
|
|
|
|
- yAxis: [{ type: 'value', name: '数量' }, { type: 'value', name: '百分比', max: 100 }],
|
|
|
|
- series: [
|
|
|
|
- {
|
|
|
|
- name: '数量',
|
|
|
|
- type: 'bar',
|
|
|
|
- data: this.barData.map(i => i.count)
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- name: '百分比',
|
|
|
|
- type: 'bar',
|
|
|
|
- yAxisIndex: 1,
|
|
|
|
- data: this.barData.map(i => i.percent)
|
|
|
|
- }
|
|
|
|
- ]
|
|
|
|
- })
|
|
|
|
- // 子图三:分支饼图
|
|
|
|
- this.pieChart.setOption({
|
|
|
|
tooltip: {
|
|
tooltip: {
|
|
- trigger: 'item',
|
|
|
|
- formatter: '{b}: {c} ({d}%)'
|
|
|
|
|
|
+ trigger: 'axis',
|
|
|
|
+ axisPointer: {
|
|
|
|
+ type: 'cross',
|
|
|
|
+ crossStyle: {
|
|
|
|
+ color: '#999'
|
|
|
|
+ }
|
|
|
|
+ }
|
|
},
|
|
},
|
|
- series: [{
|
|
|
|
- type: 'pie',
|
|
|
|
- radius: '60%',
|
|
|
|
- data: this.pieData
|
|
|
|
- }]
|
|
|
|
- })
|
|
|
|
|
|
+ legend: {
|
|
|
|
+ data: regions
|
|
|
|
+ },
|
|
|
|
+ xAxis: {
|
|
|
|
+ type: 'category',
|
|
|
|
+ // 使用动态日期数据
|
|
|
|
+ data: dates
|
|
|
|
+ },
|
|
|
|
+ yAxis: {
|
|
|
|
+ type: 'value',
|
|
|
|
+ name: '数量'
|
|
|
|
+ },
|
|
|
|
+ // 使用动态生成的系列数据
|
|
|
|
+ series: seriesData
|
|
|
|
+ });
|
|
|
|
+ // 子图三:分支饼图
|
|
|
|
+ // this.pieChart.setOption({
|
|
|
|
+ // tooltip: {
|
|
|
|
+ // trigger: 'item',
|
|
|
|
+ // formatter: '{b}: {c} ({d}%)'
|
|
|
|
+ // },
|
|
|
|
+ // series: [{
|
|
|
|
+ // type: 'pie',
|
|
|
|
+ // radius: '60%',
|
|
|
|
+ // data: this.pieData
|
|
|
|
+ // }]
|
|
|
|
+ // })
|
|
// // 地图
|
|
// // 地图
|
|
// this.mapChart.setOption({
|
|
// this.mapChart.setOption({
|
|
// tooltip: {
|
|
// tooltip: {
|
|
// trigger: 'item',
|
|
// trigger: 'item',
|
|
- // formatter: p => `${p.name}<br/>分支数: ${p.value || 0}`
|
|
|
|
|
|
+ // formatter: p => {
|
|
|
|
+ // if (p.seriesType === 'scatter') {
|
|
|
|
+ // const total = p.data.value[2];
|
|
|
|
+ // const pieData = p.data.data;
|
|
|
|
+ // let tooltipStr = `${p.name}<br/>总分支数: ${total}<br/>`;
|
|
|
|
+ // if (pieData) {
|
|
|
|
+ // pieData.forEach(item => {
|
|
|
|
+ // const percent = ((item.value / total) * 100).toFixed(2);
|
|
|
|
+ // tooltipStr += `${item.name}: ${item.value} (${percent}%)<br/>`;
|
|
|
|
+ // });
|
|
|
|
+ // } else {
|
|
|
|
+ // tooltipStr += '暂无分支数据<br/>';
|
|
|
|
+ // }
|
|
|
|
+ // return tooltipStr;
|
|
|
|
+ // }
|
|
|
|
+ // return p.name;
|
|
|
|
+ // }
|
|
// },
|
|
// },
|
|
- // series: [{
|
|
|
|
- // type: 'map',
|
|
|
|
|
|
+ // // 添加 geo 组件,用于显示地图背景
|
|
|
|
+ // geo: {
|
|
// map: this.isChinaMap ? 'china' : 'world',
|
|
// map: this.isChinaMap ? 'china' : 'world',
|
|
// roam: true,
|
|
// roam: true,
|
|
- // data: this.mapData
|
|
|
|
- // }]
|
|
|
|
- // })
|
|
|
|
|
|
+ // // 设置中国地图和世界地图的中心位置和缩放级别
|
|
|
|
+ // center: this.isChinaMap ? [104.1954, 35.8617] : [10, 10],
|
|
|
|
+ // zoom: this.isChinaMap ? 2 : 1.2,
|
|
|
|
+ // label: {
|
|
|
|
+ // emphasis: {
|
|
|
|
+ // show: false
|
|
|
|
+ // }
|
|
|
|
+ // },
|
|
|
|
+ // itemStyle: {
|
|
|
|
+ // normal: {
|
|
|
|
+ // // 修改为浅色背景,这里使用浅灰色作为示例
|
|
|
|
+ // areaColor: '#f0f0f0',
|
|
|
|
+ // borderColor: '#999'
|
|
|
|
+ // },
|
|
|
|
+ // emphasis: {
|
|
|
|
+ // // 修改为稍深一点的浅色,用于鼠标悬停状态
|
|
|
|
+ // areaColor: '#e0e0e0'
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
|
|
+ // },
|
|
|
|
+ // series: [
|
|
|
|
+ // {
|
|
|
|
+ // type: 'scatter',
|
|
|
|
+ // coordinateSystem: 'geo',
|
|
|
|
+ // data: this.mapData,
|
|
|
|
+ // symbolSize: val => Math.sqrt(val[2]) * 2,
|
|
|
|
+ // label: {
|
|
|
|
+ // show: true,
|
|
|
|
+ // formatter: '{b}'
|
|
|
|
+ // },
|
|
|
|
+ // itemStyle: {
|
|
|
|
+ // color: 'rgba(255, 0, 0, 0.8)'
|
|
|
|
+ // },
|
|
|
|
+ // emphasis: {
|
|
|
|
+ // itemStyle: {
|
|
|
|
+ // color: 'red'
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
|
|
+ // ]
|
|
|
|
+ // });
|
|
// // 地图点击切换
|
|
// // 地图点击切换
|
|
- // this.mapChart.off('click')
|
|
|
|
|
|
+ // this.mapChart.off('click');
|
|
// this.mapChart.on('click', params => {
|
|
// this.mapChart.on('click', params => {
|
|
// if (!this.isChinaMap && params.name === '中国') {
|
|
// if (!this.isChinaMap && params.name === '中国') {
|
|
- // this.isChinaMap = true
|
|
|
|
- // this.fetchAllData()
|
|
|
|
|
|
+ // this.isChinaMap = true;
|
|
|
|
+ // this.fetchAllData();
|
|
// }
|
|
// }
|
|
- // })
|
|
|
|
- },
|
|
|
|
- async initMap() {
|
|
|
|
- try {
|
|
|
|
- // 检查 ref 是否正确获取到 DOM 元素
|
|
|
|
- if (!this.$refs.mapContainer) {
|
|
|
|
- console.error('未找到地图容器 DOM 元素');
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
- const AMap = await AMapLoader.load({
|
|
|
|
- key: 'ddcbab53e51ba9adfdcf281a32d513f0', // 替换为你的高德 Key
|
|
|
|
- version: '2.0',
|
|
|
|
- plugins: []
|
|
|
|
- });
|
|
|
|
- this.map = new AMap.Map(this.$refs.mapContainer, {
|
|
|
|
- zoom: 4, // 初始缩放级别
|
|
|
|
- center: [105.403119, 38.028658] // 初始地图中心点
|
|
|
|
- });
|
|
|
|
- } catch (error) {
|
|
|
|
- console.error('地图初始化失败:', error);
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- // async fetchAllData() {
|
|
|
|
- // // ... 已有代码 ...
|
|
|
|
- // this.updateMap();
|
|
|
|
- // },
|
|
|
|
- updateMap() {
|
|
|
|
- // 清空现有覆盖物
|
|
|
|
- this.map.clearMap();
|
|
|
|
- this.mapData.forEach(item => {
|
|
|
|
- const marker = new AMap.Marker({
|
|
|
|
- position: this.getCoordinates(item.name), // 根据地区名称获取经纬度
|
|
|
|
- title: `${item.name}: ${item.value} 分支数`
|
|
|
|
- });
|
|
|
|
- marker.setMap(this.map);
|
|
|
|
- });
|
|
|
|
- },
|
|
|
|
- getCoordinates(regionName) {
|
|
|
|
- // 简单示例,实际需要根据地区名称获取准确经纬度
|
|
|
|
- const coordinatesMap = {
|
|
|
|
- '中国': [105.403119, 38.028658],
|
|
|
|
- '美国': [-95.712891, 37.09024]
|
|
|
|
- };
|
|
|
|
- return coordinatesMap[regionName] || [0, 0];
|
|
|
|
|
|
+ // });
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
};
|