首页 > 其他分享 >vue3项目中使用echarts实现中国地图大区任意分区

vue3项目中使用echarts实现中国地图大区任意分区

时间:2024-03-25 10:01:19浏览次数:19  
标签:province features 大区 value vue3 echarts name

最终效果:

背景:项目需要在中国地图上显示各大区的库存情况,使用echarts将下载的中国地图挂载后,好家伙,全是一块块的省份,再定睛一看,我这项目需求的大区咋只有6个,好好好,看来得探索一波如何将各省份自定义为大区了。

1. echarts、中国地图json文件下载

echarts下载:

npm install echarts

中国地图json码文件下载

想要显示地图,这个文件很必要。下载地址:DataV.GeoAtlas地理小工具系列 (aliyun.com)

 2.  实现基本地图展示

 在.vue文件中引用echarts、中国地图json文件:

import * as echarts from 'echarts';
import chinaJson from "@/assets/json/china.json"

注:

1、这里echarts是全部引用,最好按需引用;

2、这里json名是改过的

 html代码:

<div id="myChart" style="width:100%;height:calc(100% - 30px)"></div>

js代码:

  onMounted(() => {
    myChart= echarts.init(document.getElementById('myChart'))
    window.onresize = function(){
      // 图形随窗口变化而变化
      myChart.resize();
    }
  })

  const initMyChartt = (mychart) => {
    let dataList = [
      {name: '湖北省', value: 732},
      {name: '贵州省', value: 666},
      {name: '广东省', value: 333},
      {name: '广西壮族自治区', value: 123},
      {name: '湖南省', value: 50},
      {name: '四川省', value: 0}
    ]
    let option = {
      tooltip: {
        trigger: 'item',
        formatter: function (params) {
          return params.name+':'+params.value;//自行定义formatter格式
        }
      },
      visualMap: {
        show: false,
        min: 0,
        max: 1000,
        left: 'left',
        top: 'bottom',
        text: ['高', '低'],//取值范围的文字
        inRange: {
          color: ['#79bbff', '#c45656', '#FD665F']
        },
      },
      geo: {
        map: 'china',
        roam: true,//不开启缩放和平移
        zoom: 1.23,//视角缩放比例
        scaleLimit:{min:1,max:3}, // 缩放级别
        zoom: 1.23,//视角缩放比例
        regions: [
          {
            name: "南海诸岛",
            value: 0,
            itemStyle: {
              opacity: 0, // 不绘制
            },
            label: {
              show: false // 不显示文字
            }
          }
        ],
        label: {
          show: true,
          fontSize: '10',
          color: 'rgba(0,0,0,0.7)', // 大区文本颜色
          
        },
        itemStyle: {
          // borderWidth: 0,
          // borderColor: 'rgba(0, 0, 0, 0.2)', // 边界框线颜色 
          
        },
        emphasis: {
          label: {
            color: '#fff' 
          },
          itemStyle: {
            areaColor: '#337ecc',//鼠标选择区域颜色
            shadowOffsetX: 0,
            shadowOffsetY: 0,
            shadowBlur: 20,
            shadowColor: 'rgba(0, 0, 0, 0.5)',
          }  
        }
      },
      series: [
        {
          name: '中国地图',
          type: 'map',
          geoIndex: 0,
          data: dataList
        }
      ] 
    }
    echarts.registerMap('china', { geoJSON: chinaJson });
    mychart.setOption(option, true);
  }

 效果如下图:

 3. 大区划分

呃呃,接下来就是大区划分了,也就是将某些省份合成一个大区,怎么合?要合什么地方?害怕!!

不行,为了项目(为了活下去),我们打开地图json码来分析一下,相信答案就在里面嘻嘻嘻。

 下载下来的地图json:

里面包含了两个属性,其中“features”属性里面是个数组,里面是34个对象。好这下明白了,这不就是34个省份?!,把这些省份合成需要的大区就好了。

通过观察,保持原有的数据结构不变,将features.properties.name改成大区名,将归属改大区的省份的features.geometry.coordinates合并为一个,最后将修改后的地图挂载在echart上就能得到想要的省份合并大区了。

修改中国地图json文件代码:

  import chinaJson from "@/assets/json/chinaLand.json"
  // 将省份合并成大区
  const mergeProvinces = (features, province, region) => {//合并大区里省份的coordinates
    let newFeatures = [];
    if(features[0].properties.name.indexOf('大区')!==-1) {
      return
    }
    for(let i = 0; i < province.length; i++) {
      for(let j = 0; j < province[i].length; j++) {
        for(let k = 0; k < features.length; k++) {
          if(features[k].properties.name == province[i][j]) {
            if(newFeatures[i]) {
              if(features[k].properties.name == '内蒙古自治区') {
                features[k].geometry.coordinates = [features[k].geometry.coordinates]
              }
              newFeatures[i].geometry.coordinates.push(...features[k].geometry.coordinates)
            }else {
              newFeatures.push(features[k])
              newFeatures[i].properties.name = region[i]
            }
            break
          }
        }
      }
    }
    chinaJson.features = newFeatures;
  };
  // 按照需要设定大区分区,province中元素内容为region中各大区所包含的省份,需要对应好
  const provinceAndregion = {
      province: [//把各个大区的省份用二维数组分开
        ["黑龙江省", "吉林省",  "辽宁省", '北京市', '天津市', '河北省'],
        [ '湖北省', '上海市', '江苏省', '安徽省', '浙江省'],
        ["河南省", '山东省'],
        ['湖南省', '重庆市', '四川省', '云南省', '西藏自治区', '贵州省'],
        ['陕西省', '甘肃省', '青海省', '宁夏回族自治区', '新疆维吾尔自治区','山西省',"内蒙古自治区"],
        ['广东省', '广西壮族自治区', '福建省', '海南省', '江西省', '香港特别行政区', '澳门特别行政区', '台湾省'],
      ],
      region: ['东北大区', '华东大区', '华中大区', '西南大区', '西北大区', '华南大区'],
  };

  // 调用
  mergeProvinces(chinaJson.features, provinceAndregion.province, provinceAndregion.region);

 最终实现分区js代码(全部):

  onMounted(() => {
    myChart= echarts.init(document.getElementById('myChart'))
    window.onresize = function(){
      // 图形随窗口变化而变化
      myChart.resize();
    }
  })
  // 将省份合并成大区
  const mergeProvinces = (features, province, region) => {//合并大区里省份的coordinates
    let newFeatures = [];
    if(features[0].properties.name.indexOf('大区')!==-1) {
      return
    }
    for(let i = 0; i < province.length; i++) {
      for(let j = 0; j < province[i].length; j++) {
        for(let k = 0; k < features.length; k++) {
          if(features[k].properties.name == province[i][j]) {
            if(newFeatures[i]) {
              if(features[k].properties.name == '内蒙古自治区') {
                features[k].geometry.coordinates = [features[k].geometry.coordinates]
              }
              newFeatures[i].geometry.coordinates.push(...features[k].geometry.coordinates)
            }else {
              newFeatures.push(features[k])
              newFeatures[i].properties.name = region[i]
            }
            break
          }
        }
      }
    }
    chinaJson.features = newFeatures;
  };
  const initMyChartt = (mychart) => {
   const provinceAndregion = {
      province: [//把各个大区的省份用二维数组分开
        ["黑龙江省", "吉林省",  "辽宁省", '北京市', '天津市', '河北省'],
        [ '湖北省', '上海市', '江苏省', '安徽省', '浙江省'],
        ["河南省", '山东省'],
        ['湖南省', '重庆市', '四川省', '云南省', '西藏自治区', '贵州省'],
        ['陕西省', '甘肃省', '青海省', '宁夏回族自治区', '新疆维吾尔自治区','山西省',"内蒙古自治区"],
        ['广东省', '广西壮族自治区', '福建省', '海南省', '江西省', '香港特别行政区', '澳门特别行政区', '台湾省'],
      ],
      region: ['东北大区', '华东大区', '华中大区', '西南大区', '西北大区', '华南大区'],
    };
    mergeProvinces(chinaJson.features, provinceAndregion.province, provinceAndregion.region);
    let dataList = [
      {name: '西北大区', value: 732},
      {name: '华南大区', value: 666},
      {name: '东北大区', value: 333},
      {name: '西南大区', value: 123},
      {name: '华东大区', value: 50},
      {name: '华中大区', value: 0}
    ]
    let option = {
      tooltip: {
        trigger: 'item',
        formatter: function (params) {
          return params.name+':'+params.value;//自行定义formatter格式
        }
      },
      visualMap: {
        show: false,
        min: 0,
        max: 1000,
        left: 'left',
        top: 'bottom',
        text: ['高', '低'],//取值范围的文字
        inRange: {
          color: ['#79bbff', '#c45656', '#FD665F']
        },
      },
      geo: {
        map: 'china',
        roam: true,//不开启缩放和平移
        zoom: 1.23,//视角缩放比例
        scaleLimit:{min:1,max:3}, // 缩放级别
        zoom: 1.23,//视角缩放比例
        regions: [
          {
            name: "南海诸岛",
            value: 0,
            itemStyle: {
              opacity: 0, // 不绘制
            },
            label: {
              show: false // 不显示文字
            }
          }
        ],
        label: {
          show: true,
          fontSize: '10',
          color: 'rgba(0,0,0,0.7)', // 大区文本颜色
          
        },
        itemStyle: {
          borderWidth: 0,
          // borderColor: 'rgba(0, 0, 0, 0.2)', // 边界框线颜色 
          
        },
        emphasis: {
          label: {
            color: '#fff' 
          },
          itemStyle: {
            areaColor: '#337ecc',//鼠标选择区域颜色
            shadowOffsetX: 0,
            shadowOffsetY: 0,
            shadowBlur: 20,
            shadowColor: 'rgba(0, 0, 0, 0.5)',
          }  
        }
      },
      series: [
        {
          name: '中国地图',
          type: 'map',
          geoIndex: 0,
          data: dataList
        }
      ] 
    }
    echarts.registerMap('china', { geoJSON: chinaJson });
    mychart.setOption(option, true);
  }

最终效果:

标签:province,features,大区,value,vue3,echarts,name
From: https://blog.csdn.net/qq_46673413/article/details/136969294

相关文章

  • echarts.js画折线图
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><scriptsrc="https://cdn.bootcdn.net/ajax/libs/echarts/5.4.3/echarts.min.js"></script></head><body><divid="w......
  • 分享:vue3+OpenTiny UI+cesium 实现三维地球
    效果图使用vue3+OpenTinyUI+cesium实现三维地球node.js>=v16.0opentinyvue3ui安装指南https://opentiny.design/tiny-vue/zh-CN/os-theme/docs/installationyarnadd@opentiny/vue@3项目依赖"dependencies":{  "@opentiny/vue":"3"......
  • vue3项目初始化
    初始化项目newsappVSCode打开终端,newsapp项目目录,可自定义vuecreatenewsapp有提示“因为在此系统上禁止运行脚本”的话,请执行set-ExecutionPolicyRemoteSigned执行后再重复执行vuecreatenewsapp注意选择Vue3版本测试项目是否正常可运行:先进入newsapp目录,用cdn......
  • 前端Vue篇之Vue3响应式:Ref和Reactive
    目录Vue3响应式:Ref和ReactiveRef和Reactive概述用途Ref基本用法及在setup()中的使用基本用法在setup()中使用`<scriptsetup>`语法为何使用refReactive基本概念及在模板中的使用基本概念在模板中使用Reactive深层响应式与Ref区别为何使用ReactiveRef和Reactive比较和......
  • Apache ECharts的用法——通过直观的图表来展示数据
    定义ApacheECharts是一款基于Javascript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。官网地址:https://echarts.apache.org/zh/index.html为了通过直观的图表来展示数据入门案例ApacheEcharts官方提供的快速入门:点击跳转网盘下载下载链......
  • python基础——异常、模块和包、pyecharts
    文章目录一、异常1、异常捕获2、异常传递二、python模块1、概念2、导入方式3、自定义模块4、python包5、导入第三方包三、pyecharts1、概念2、JSON数据格式一、异常1、异常捕获1.基本语法try: 可能发生错误的代码except: 如果出现异常应该执行的代码try: ......
  • vue3 动态编译组件失败:Component provided template option but runtime compilation
    根据vue3官方文档路由,写了如下一个简单的页面来模拟路由的实现。为了减少*.vue文件的个数,在这个但页面中,使用defineComponent通过object定义组件。<scriptsetup>import{ref,computed,defineComponent}from'vue'constHome=defineComponent({template:`......
  • VUE3.0(一):vue3.0简介
    Vue3入门指南什么是vueVue(发音为/vjuː/,类似view)是一款用于构建用户界面的JavaScript框架。它基于标准HTML、CSS和JavaScript构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue都可以胜任。vue3官方文......
  • Vue3 - Element Plus 下拉选择器 el-select 覆盖修改 placeholder样式,解决覆盖不生效
    前言如果需要Vue2版本,请访问这篇文章。本文实现了在vue3+element-plus网站开发中,完美覆盖el-select选择器样式,强力修改select下拉选择框placeholder样式,同时也支持修改文字、大小、边框、等,支持任意样式的覆盖修改!网上的教程几乎都不生效,使用本教程的方法......
  • 一篇搞定ECharts的基本使用,赶快收藏起来学习吧~
    准备工作引入声明一个有宽高的dDOM元素echarts.init(DOM)option配置对象echarts.setOptions(option)基础配置option类似于一个容器,那么里面的属性就相当于组件:xAxis(直角坐标系X轴)、yAxis(直角坐标系Y轴)、grid(直角坐标系底板)、angleAxis(极坐标系角度轴)、radiusAxi......