import * as echarts from 'echarts'; import 'echarts-extension-amap'; /** * 计算地图中心点和缩放比例 * @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 = 10; 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; } 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); const chart = echarts.init(div); chart.on('amaproam', function (e) { console.log(e); }); // // get AMap extension component // var amapComponent = chart.getModel().getComponent('amap'); // // get the instance of AMap // var amap = amapComponent.getAMap(); // // add some controls provided by AMap. // amap.addControl(new AMap.Scale()); // amap.addControl(new AMap.ToolBar()); // // add SatelliteLayer and RoadNetLayer to map // // var satelliteLayer = new AMap.TileLayer.Satellite(); // // var roadNetLayer = new AMap.TileLayer.RoadNet(); // // amap.add([satelliteLayer, roadNetLayer]); // // Add a marker to map // amap.add( // new AMap.Marker({ // position: [110, 35] // }) // ); // 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' }, // amap component option amap: { // enable 3D mode viewMode: '3D', // initial options of AMap // See https://lbs.amap.com/api/javascript-api/reference/map#MapOption for details // initial map center [lng, lat] center: [centerLng, centerLat], // initial map zoom zoom: zoom, // whether the map and echarts automatically handles browser window resize to update itself. resizeEnable: true, // customized map style, see https://lbs.amap.com/dev/mapstyle/index for details mapStyle: 'amap://styles/dark', // whether echarts layer should be rendered when the map is moving. Default is true. // if false, it will only be re-rendered after the map `moveend`. // It's better to set this option to false if data is large. renderOnMoving: false, // the zIndex of echarts layer for AMap, default value is 2000. // deprecated since v1.9.0, use `echartsLayerInteractive` instead. // echartsLayerZIndex: 2019, // whether echarts layer is interactive. Default value is true // supported since v1.9.0 echartsLayerInteractive: true, // whether to enable large mode. Default value is false // supported since v1.9.0 largeMode: false, // whether to return map camera state in `amaproam` event. // supported since v1.10.0 returnMapCameraState: true // Note: Please DO NOT use the initial option `layers` to add Satellite/RoadNet/Other layers now. // There are some bugs about it, we can use `amap.add` instead. // Refer to the codes at the bottom. // More initial options... }, 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: grid.value[2], lineWidth: 2 }) }; }, data: gridPolygons, label: { show: false } } ] }; chart.setOption(option); // 3. 导出为图片(返回base64) return new Promise((resolve, reject) => { setTimeout(() => { const url = chart.getDataURL({ type: 'png', pixelRatio: 1, backgroundColor: '#fff' }); resolve(url); }, 3000); }); } export default { generateGridMap };