riku
2025-09-03 b2392458ebf42594b9fc5390fda40d7a0a12f923
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import * as echarts from 'echarts';
// import * as shanghaiMap from 'echarts-china-cities-js/echarts-china-cities-js/shanghai.js'; // 修正地图数据文件路径
// import 'echarts-china-cities-js/echarts-china-cities-js/shanghai.js'; // 修正地图数据文件路径
import { shanghai, jingan } from '@/utils/chart/shanghai.js'; // 确保路径正确
 
/**
 * 计算地图中心点和缩放比例
 * @param {*} gridData 网格数据
 * @returns
 */
function calCenterPointAndZoom(gridData) {
  let centerLng = 0;
  let centerLat = 0;
  let maxLng = -180;
  let minLng = 180;
  let maxLat = -90;
  let minLat = 90;
  let zoom = 100;
  gridData.forEach((g) => {
    centerLng += g.centerLng;
    centerLat += g.centerLat;
    maxLng = Math.max(maxLng, g.centerLng);
    minLng = Math.min(minLng, g.centerLng);
    maxLat = Math.max(maxLat, g.centerLat);
    minLat = Math.min(minLat, g.centerLat);
  });
  if (gridData.length > 0) {
    centerLng /= gridData.length;
    centerLat /= gridData.length;
  }
 
  console.log((maxLng - centerLng) / zoom);
 
  return {
    centerLng,
    centerLat,
    zoom
  };
}
 
function generateGridMap(gridData) {
  // 1. 创建临时DOM元素
  const div = document.createElement('div');
  div.style.width = '800px';
  div.style.height = '400px';
  document.body.appendChild(div);
  // 注册上海市地图数据
  // console.log(shanghaiMap);
 
  // shanghaiMap(echarts);
  echarts.registerMap('shanghai', { geoJSON: shanghai });
  const chart = echarts.init(div);
 
  // 1. 准备网格数据(转换为ECharts多边形格式)
  const gridPolygons = gridData.map((grid, index) => ({
    name: `grid_${index}`,
    value: [grid.centerLng, grid.centerLat, grid.value], // 中心点经纬度和数值
    coords: grid.coordinates // 网格四角经纬度坐标数组 [[lng1,lat1], [lng2,lat2], ...]
  }));
  const { centerLng, centerLat, zoom } = calCenterPointAndZoom(gridData);
 
  // 2. 配置项
  const option = {
    // title: {
    //   text: 'Travel Routes'
    // },
    geo: {
      map: 'shanghai', // 基础地图
      center: [centerLng, centerLat],
      roam: true, // 禁止缩放平移
      zoom: zoom, // 地图缩放比例
      label: { show: true }, // 显示地名标签
      itemStyle: { areaColor: '#ddddddff', borderColor: '#999' }
    },
    // series: [
    //   {
    //     type: 'scatter',
    //     coordinateSystem: 'geo',
    //     data: [
    //       {
    //         name: '黄浦区',
    //         value: [121.490317, 31.222771, 100] // 中心点坐标+数值
    //       }
    //     ]
    //   }
    // ]
    series: [
      {
        type: 'custom',
        coordinateSystem: 'geo',
        renderItem: (params, api) => {
          // 将经纬度转换为屏幕坐标
          const grid = gridPolygons[params.dataIndex];
          // const v = api.value(0);
          const points = grid.coords.map((coord) => api.coord(coord));
          // const points = grid.coords;
          return {
            type: 'polygon',
            transition: ['shape'],
            shape: { points },
            style: api.style({
              fill: grid.value[2],
              stroke: 'white',
              lineWidth: 1
            })
          };
        },
        data: gridPolygons,
        label: { show: false }
      }
    ]
  };
 
  chart.setOption(option);
  // 3. 导出为图片(返回base64)
  return chart.getDataURL({
    type: 'png',
    pixelRatio: 1,
    backgroundColor: '#ddddddff'
  });
}
 
export default { generateGridMap };