冲刺记录10

今日任务:继续实现定位信息的添加

遇到困难:无

<template>
  <div class="container">
    <!-- Title -->
    <div class="title">可视化平台</div>
    <!-- Map container -->
    <div ref="mapContainer" class="map-container"></div>
  </div>
</template>

<script>
import * as echarts from 'echarts/core';
import { MapChart } from 'echarts/charts';
import { TooltipComponent, VisualMapComponent } from 'echarts/components';
import { registerMap } from 'echarts/core';

import chinaMapData from '@/static/china.json';

echarts.use([MapChart, TooltipComponent, VisualMapComponent]);

export default {
  data() {
    return {
      records: [], // 保存记录的数组
      map: null // 地图对象
    };
  },
  computed: {
    // 获取所有唯一的地点列表
    uniquePlaces() {
      const places = this.records.map(record => this.normalizePlaceName(record.place));
      return [...new Set(places)];
    }
  },
  methods: {
    // 标准化地点名称,如将“河北省衡水市”转换为“河北省”
   normalizePlaceName(place) {
     const provinceList = [
       '北京市', '天津市', '上海市', '重庆市', '河北省', '山西省', '辽宁省', '吉林省', '黑龙江省', '江苏省',
       '浙江省', '安徽省', '福建省', '江西省', '山东省', '河南省', '湖北省', '湖南省', '广东省', '海南省',
       '四川省', '贵州省', '云南省', '陕西省', '甘肃省', '青海省', '台湾省', '内蒙古自治区', '广西壮族自治区',
       '西藏自治区', '宁夏回族自治区', '新疆维吾尔自治区', '香港特别行政区', '澳门特别行政区'
     ];
   
     for (const province of provinceList) {
       if (place.includes(province)) {
         return province;
       }
     }
   
     // 如果没有匹配到省或直辖市,则返回原始地点名称
     return place;
   },

    // 统计特定地点在记录中出现的次数
    countOccurrences(place) {
      return this.records.filter(record => this.normalizePlaceName(record.place) === place).length;
    },
    // 加载记录数据
    loadRecords() {
      this.records = uni.getStorageSync('records') || [];
    },
    // 初始化地图
    async initMap() {
      // 注册中国地图
      registerMap('china', chinaMapData);

      // 使用 ECharts 绘制中国地图
      const myChart = echarts.init(this.$refs.mapContainer);

      // 配置项
      const option = {
        tooltip: {
          trigger: 'item',
          formatter: '{b}'
        },
        visualMap: {
    show:false,
          min: 0,
          max: 10,
          text: ['High', 'Low'],
          realtime: false,
          calculable: true,
          inRange: {
            color: ['#e0ffff', '#006edd']
          }
        },
        series: [{
          name: '中国',
          type: 'map',
          map: 'china', // 指定使用的地图类型
          selectedMode: 'single',
          label: {
            show: true
          },
          roam: true, // 启用地图的自由缩放和拖动功能
          itemStyle: {
            normal: {
              areaColor: '#f4f4f4',
              borderColor: '#999'
            },
            emphasis: {
              areaColor: '#f4f4f4'
            }
          },
          data: this.uniquePlaces.map(place => ({
            name: place,
            value: this.countOccurrences(place)
          }))
        }]
      };

      // 使用刚指定的配置项和数据显示图表
      myChart.setOption(option);

      // 添加鼠标悬停事件监听器
   myChart.on('click', params => {
     if (params.componentType === 'series') {
       const placeName = params.name;
       const occurrences = this.countOccurrences(placeName);
       const placesVisited = this.records
         .filter(record => this.normalizePlaceName(record.place) === placeName)
         .map(record => `${record.place} ${record.date}`)
         .join('\n');
   
       let content = `${placeName}: 共 ${occurrences} 次\n`; // 地点次数单独一行
       if (placesVisited.length > 0) {
         content += placesVisited; // 其余地点和日期各占一行
       }
       uni.showModal({
         title: '地点详情',
         content: content,
         showCancel: false,
         confirmText: '关闭',
         success(res) {
           if (res.confirm) {
             console.log('用户点击确定');
           }
         }
       });
     }
   });
}
  },
  mounted() {
    // 加载记录数据
    this.loadRecords();
    // 初始化地图
    this.initMap();
  }
};
</script>

<style scoped>
.container {
   padding: 20px;
   background-image: url('/static/OIP.jpg');
   background-size: cover;
   background-position: center;
   min-height: 100vh; /* 确保容器至少填满整个视口高度 */
   background-attachment: fixed; /* 背景图像固定在视口 */
   overflow-y: auto; /* 允许垂直滚动 */
 }
 

.title {
  font-size: 24px;
  margin-bottom: 20px;
}

.map-container {
  width: 100%;
  height: 600px; /* 设置地图容器的高度 */
}
</style>
posted @ 2024-04-29 20:52  徐星凯  阅读(22)  评论(0编辑  收藏  举报