中国地图下钻式echarts图表数据处理

首先加载全国路线图

findMap(){
        let _this = this,
          param = {}
          _this.chinaOpt = echarts.init(document.getElementById('chinaflag'));
          _this.chinaOpt.clear()
        _this.$store.dispatch("url", {param}).then(res=>{
          let res={
            "meta": {"msg": "success","code": 0,"success": true,"timestamp": "2020-09-03 13:45:55"
            },
            "data": {//本例数据格式
              "list": [["北京","保定","石家庄","邯郸","上海","深圳","保定","武汉"]]
            }
          }
          if(res.meta.success){
            axios.get('./china_full.json').then((data) => {
              //重置图表
              echarts.registerMap('china', data.data);
              let geoCoordName=[]//存储路线到达点
              res.data.list[0].map(item=>{
                let temp=false
                for (let index = 0; index < geoinfo.length; index++) {
                  const districts = geoinfo[index];
                  if(districts.name.indexOf(item)>=0){
                    temp=true
                    geoCoordName.push(districts.name)
                    break
                  }else{
                    for (let num = 0; num < districts.districts.length; num++) {
                      const element = districts.districts[num];
                      if(element.name.indexOf(item)>=0){
                        temp=true
                        geoCoordName.push(districts.name)
                      }
                      if(temp){
                        break
                      }
                    }
                  }
                  if(temp){
                    break
                  }
                }
              })
              let mapOptions = _this.$utils.initMapScatterOpt()
              var geoCoordMap = {
                '北京': [116.4551, 40.2539],
                '天津': [117.4219, 39.4189],
                '上海': [121.4648, 31.2891],
                '重庆': [106.557165, 29.563206],
                '河北': [114.508958, 38.066606],
                '河南': [113.673367, 34.748062],
                '云南': [102.721896, 25.047632],
                '辽宁': [123.445621, 41.806698],
                '广东': [113.5107, 23.2196],
                '湖南': [112.950888, 28.229114],
                '安徽': [117.300842, 31.887672],
                '山东': [117.029895, 36.677424],
                '江苏': [118.814345, 32.061445],
                '浙江': [120.16991, 30.272236],
                '江西': [115.904962, 28.674132],
                '湖北': [114.290138, 30.595623],
                '甘肃': [103.851217, 36.061978],
                '山西': [112.549248,37.857014],
                '陕西': [108.960062, 34.285251],
                '吉林': [126.572746, 43.86785],
                '福建': [119.319713, 26.072564],
                '贵州': [106.557165, 29.563206],
                '广东': [113.238778, 23.161621],
                '青海': [101.787147, 36.621234],
                '四川': [104.082256, 30.652565],
                '海南': [109.910757, 19.108187],
                '黑龙江': [126.655705, 45.759581],
                '西藏': [91.154492, 29.665953],
                '内蒙古': [111.670801,40.818311],
                '广西': [108.381781, 22.815042],
                '宁夏': [106.234805, 38.487468],
                '新疆': [87.616327, 43.800508],
                '香港': [114.168545, 22.36641],
                '澳门': [113.549978, 22.1943],
                '台湾': [121.098613, 23.778734]
              }
              
              var convertData = function (data) {
                var res = [];
                for (var i = 0; i < data.length; i++) {
                  var dataItem = data[i];
                  var fromCoord = geoCoordMap[dataItem[0].name];
                  var toCoord = geoCoordMap[dataItem[1].name];
                  if (fromCoord && toCoord) {
                    res.push({
                      fromName: dataItem[0].name,
                      toName: dataItem[1].name,
                      coords: [fromCoord, toCoord],
                      value: 1
                    });
                  }
                }
                return res;
              };
              mapOptions.series[0].data = convertData(geoCoordName)
              
              var KMData = [];
              geoCoordName.map(item=>{
                if(item!='北京'){
                  KMData.push(
                    //替换名称不符规则系列
                    [{name:'北京'}, {name:item.replace(/省|市|自治区|壮族自治区|维吾尔自治区|回族自治区|特别行政区/g, ''),value:1}]
                  )
                }
              })
              var planePath = 'path://M1705.06,1318.313v-89.254l-319.9-221.799l0.073-208.063c0.521-84.662-26.629-121.796-63.961-121.491c-37.332-0.305-64.482,36.829-63.961,121.491l0.073,208.063l-319.9,221.799v89.254l330.343-157.288l12.238,241.308l-134.449,92.931l0.531,42.034l175.125-42.917l175.125,42.917l0.531-42.034l-134.449-92.931l12.238-241.308L1705.06,1318.313z';

              var color = ['#a6c84c', '#ffa022', '#46bee9'];
              var series = [];
              [['北京', KMData]].forEach(function (item, i) {
                  series.push(
                  {
                    name: item[0],
                    type: 'lines',//路线
                    zlevel: 2,
                    effect: {
                      show: true,
                      period: 10,
                      trailLength: 0,
                      symbol: planePath,
                      symbolSize: 15
                    },
                    lineStyle: {
                      normal: {
                        color: color[i],
                        width: 1,
                        opacity: 0.6,
                        curveness: 0.2
                      }
                    },
                    data: convertData(item[1])
                  },
                  {
                    name: item[0],
                    type: 'effectScatter',//散点图 到达城市
                    coordinateSystem: 'geo',
                    zlevel: 2,
                    rippleEffect: {
                      brushType: 'stroke'
                    },
                    label: {
                      normal: {
                        show: true,
                        position: 'right',
                        formatter: '{b}'
                      }
                    },
                    symbolSize: function (val) {
                      return val[2]>0?(val[2]/9):0.1;
                    },
                    itemStyle: {
                      normal: {
                        color: color[i]
                      }
                    },
                    data: item[1].map(function (dataItem) {
                      return {
                        name: dataItem[1].name,
                        value: geoCoordMap[dataItem[1].name].concat([dataItem[1].value])
                      };
                    })
                  });
              });
              mapOptions.geo.zoom=1
              mapOptions.series=series
              _this.chinaOpt.setOption(mapOptions)
              _this.chinaOpt.on('click', function (param) {
                _this.chinaMapClick(param)//地图点击事件
              })
            })
          }
        })
      }

初始化地图路线图后点击某一区域查看当前省份地图数据

chinaMapClick(v){
        let _this=this;
        var name = v.name; //地区name
        var mapCode = _this.provinces[name]; //地区的json数据  城市代号
        let center=[]
        let nameList=[]
        let valList=[]
        if (!mapCode) {
          return;
        }
        let temp=false
        for (let index = 0; index < geoinfo.length; index++) {
          const districts = geoinfo[index];
          if(districts.name.indexOf(name)==0){
            center=districts.center.split(',')//省份中心
            for (let num = 0; num < districts.districts.length; num++) {
              const element = districts.districts[num];
              nameList.push({//市区信息
                name:element.name,
                value:element.center.split(','),
              })
              if(Math.random()>0.5){
                valList.push({
                  name:element.name,
                  value:element.center.split(','),
                })
              }
            }
            temp=true
          }
          if(temp){
            break
          }
        }
        _this.loadMap(mapCode, name,center,nameList,valList);
      }

然后调用地图重新渲染点击的省份

loadMap(mapCode, name,center,nameList,valList) {
        let _this=this
        _this.chinaOpt = echarts.init(document.getElementById('chinaflag'));
        _this.chinaOpt.clear()
        axios.get('../../../../../static/json/'+mapCode+'_full.json').then((data) => {
          if (data) {         
            echarts.registerMap(name, data.data);
            var opt={
              geo: {
                map: name,
                zoom: 1, //当前视角缩放比例      
              },
              series: [
                {
                  data: nameList,
                  type: 'map',//渲染地图
                  mapType: name,
                  selectedMode: 'false',
                  label: {
                    normal: {
                      show: true,
                      color:'#fff'
                    },
                    emphasis: {
                      show: true,
                      color:'#fff'
                    }
                  },
                  itemStyle: {
                    normal: {
                      areaColor: '#03035a',
                      borderColor: '#00f9ff',
                      shadowColor: '#092f8f', //外发光
                      shadowBlur: 20
                    },
                    emphasis: {
                      areaColor: '#03035a', //悬浮区背景
                    }
                  }
                },
                {
                  name: 'Top',//地图上标记点信息
                  type: 'scatter',
                  coordinateSystem: 'geo',
                  symbol: 'pin',
                  symbolSize: [20, 20],
                  itemStyle: {
                    normal: {
                      color: '#D8BC37', //标志颜色
                    }
                  },
                  data: valList,
                },
              ]
            };
            _this.chinaOpt.setOption(opt)
          } else {
            alert('无法加载该地图');
          }
        })
      }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ECharts3D 是百度开发的一个基于 WebGL 技术的数据可视化库,支持 3D 数据展示。在 ECharts3D 中,地图是一个内置的组件,可以通过配置数据来展示不同区域的数据分布。下钻功能指的是点击地图上的区域,可以进入该区域的更详细的数据展示页面。 实现 ECharts3D 地图下钻的关键在于对数据的处理和配置。具体实现步骤如下: 1. 准备地图数据:ECharts3D 内置了一些地图数据,也可以从外部加载地图数据。可以通过 GeoJSON 格式的数据来描述地图边界和区域信息。 2. 准备下钻数据:点击地图上的区域后,需要进入该区域的更详细数据展示页面。因此需要准备好该区域的详细数据,并在点击事件中进行处理。 3. 配置 ECharts3D 地图组件:通过 ECharts3D 的配置项,设置地图的样式、坐标系、区域颜色等属性。并将准备好的地图数据和下钻数据绑定到地图组件上。 4. 监听点击事件:通过 ECharts3D 提供的事件监听机制,在地图上监听用户的点击事件。当用户点击某个区域时,根据该区域的数据信息进行下钻操作,并展示该区域的详细数据。 下面是一个简单的示例代码,演示如何实现 ECharts3D 地图下钻: ```javascript // 引入 ECharts3D 库 import echarts from 'echarts'; import 'echarts-gl'; // 准备地图数据 const mapData = [ {name: '北京', value: 100}, {name: '上海', value: 200}, {name: '广州', value: 300}, {name: '深圳', value: 400}, // ... 其他区域数据 ]; // 准备下钻数据 const detailData = [ {name: '北京区域1', value: 50}, {name: '北京区域2', value: 50}, // ... 其他区域数据 ]; // 配置地图组件 const option = { geo3D: { map: 'china', // 使用中国地图 itemStyle: { areaColor: '#fff', // 区域背景颜色 opacity: 1, // 区域透明度 borderWidth: 1, // 区域边框宽度 borderColor: '#000', // 区域边框颜色 }, label: { show: true, // 是否显示区域标签 textStyle: { color: '#000', // 标签文字颜色 fontSize: 12, // 标签文字大小 }, }, regions: mapData, // 绑定地图数据 }, series: [{ type: 'bar3D', data: detailData, // 绑定下钻数据 }], }; // 监听点击事件 echarts.init(document.getElementById('chart')).on('geo3DClick', function(params) { const name = params.name; // 根据区域名称查询对应的下钻数据 const data = detailData.filter(item => item.name.startsWith(name)); // 更新下钻数据并重新渲染 option.series[0].data = data; echarts.init(document.getElementById('chart')).setOption(option); }); ``` 在上面的示例代码中,我们通过配置 ECharts3D 的 `geo3D` 组件来展示地图,并将准备好的地图数据绑定到组件上。在 `series` 中,我们配置了一个 3D 柱状图,用于展示下钻数据。在监听 `geo3DClick` 事件时,我们根据点击的区域名称查询对应的下钻数据,并更新 `series` 中的数据,最后重新渲染图表即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值