vue + echart 实现中国地图 和 省市地图(可切换省份)
一.中国地图
1.先导入echarts,然后再main.js里引入echarts
// 引入echarts
import echarts from 'echarts'
Vue.prototype.$echarts = echarts // 还要特别引入china.json,这样中国地图才会出现,不然只会出现右下角的南海诸岛 import china from 'echarts/map/json/china.json'
echarts.registerMap('china', china) 2.页面代码
<div id="chinaChart" :style="{width: '100%', height: '500px'}"></div>
async drawChina() {
  //加载中国地图
  const that = this;
  // 基于准备好的dom,初始化echarts实例
  var myChartContainer = document.getElementById('chinaChart');
  var resizeMyChartContainer = function () {
    myChartContainer.style.width = (document.body.offsetWidth / 2) + 'px'//页面一半的大小
  }
  resizeMyChartContainer();
  var myChartChina = this.$echarts.init(myChartContainer);
  var chinaData = that.diTuData;//后台返回的地图数据,要去掉"省"字
  var chinaBigValue = that.bigValue;//返回数据中最大值
  // 绘制图表
  var chinaMap = {
    title: {//标题
      text: '省级统计',
      left: 'center'
    },
    visualMap: {
      min: 0,
      max: chinaBigValue,
      left: '10%',
      top: 'bottom',
      text: ['高', '低'],
      calculable: true,
      color: ['#0b50b9', '#c3e2f4']
    },
    tooltip: { //鼠标移动到某个省份时显示内容
      show: true,
      formatter: function (item) {
        let resData = item.data;
        if (resData) {
          return "省份:" + resData.name + "<br/>" + "数量:" + resData.value + "<br/>" + "百分比:" + resData.scale
        } else {
          return "省份:" + item.name + "<br/>" + "数量: 0" + "<br/>" + "百分比: 0.00%"
        }
      }
    },
    selectedMode: 'single',
    calculable: true,
    series: [
      {
        name: '',
        type: 'map',
        mapType: 'china',//main.js引入的中国地图
        itemStyle: {
          normal: {
            borderColor: 'rgba(0, 0, 0, 0.2)'
          },
          emphasis: {
            shadowOffsetX: 0,
            shadowOffsetY: 0,
            shadowBlur: 20,
            borderWidth: 0,
            shadowColor: 'rgba(0, 0, 0, 0.5)'
          }
        },
        showLegendSymbol: true,
        label: {
          normal: {
            show: true
          },
          emphasis: {
            show: true
          }
        },
        data: chinaData
      }
    ]
  }
  myChartChina.setOption(chinaMap);
  window.onresize = function () {
    resizeMyChartContainer();
    myChartChina.resize();
  }
}
async changeCityData() {
  //转变获取市区数据(因为我这边是获取微信小程序数据,所以要转变下数据格式)
  const that = this;
  let provinceData = that.allCity;//所有市区数据
  var provinceItem = that.provinceItem;//下拉选中省份
  var countNum = 0; //当前省份总值
  var bigCityValue = 0; //市区最大值
  var newProData = []; //转变后数据
  for (let i = 0; i < allProvince.length; i++) {
    let itemName = allProvince[i].name;
    let reg = RegExp(itemName);
    //判断下拉选中的省份
    if (reg.test(provinceItem)) {
      var cityList = [];
      //区别有的省份没有市只有区
      if (allProvince[i].city.length <= 1) {
        cityList = allProvince[i].city[0].area;
      } else {
        cityList = allProvince[i].city;
      }
      for (let j = 0; j < provinceData.length; j++) {
        let proName = provinceData[j].name;
        let proValue = provinceData[j].value;
        let regProName = RegExp(proName);
        if (regProName.test("未知")) {
          var newProItem = {};
          newProItem.name = "未知";
          newProItem.value = proValue;
          newProData.push(newProItem);
        } else {
          for (let k = 0; k < cityList.length; k++) {
            let cityName = "";
            //区别有的省份没有市只有区
            if (allProvince[i].city.length <= 1) {
              cityName = cityList[k];
            } else {
              cityName = cityList[k].name;
            }
            //判断当前省份的市区
            if (regProName.test(cityName)) {
              var newProItem = {};
              newProItem.name = cityName;
              newProItem.value = proValue;
              newProData.push(newProItem);
              countNum += proValue;
              if (bigCityValue < proValue) {
                bigCityValue = proValue;
              }
            }
          }
        }
      }
    }
  }
  //添加遗漏的省份的市区
  if (newProData.length <= 0) {
    for (let i = 0; i < allProvince.length; i++) {
      let itemName = allProvince[i].name;
      let reg = RegExp(itemName);
      //判断下拉选中的省份
      if (reg.test(provinceItem)) {
        var cityList = [];
        //区别有的省份没有市只有区
        if (allProvince[i].city.length <= 1) {
          cityList = allProvince[i].city[0].area;
        } else {
          cityList = allProvince[i].city;
        }
        for (let j = 0; j < cityList.length; j++) {
          let cityName = "";
          //区别有的省份没有市只有区
          if (allProvince[i].city.length <= 1) {
            cityName = cityList[j];
          } else {
            cityName = cityList[j].name;
          }
          var newProItem = {};
          newProItem.name = cityName;
          newProItem.value = 0;
          newProData.push(newProItem);
        }
      }
    }
  }
  //计算百分比
  for (let i = 0; i < newProData.length; i++) {
    let newProName = newProData[i].name;
    let regNewPro = RegExp(newProName);
    if ((countNum > 0 || newProData[i].value > 0) && !regNewPro.test("未知")) {
      let itemNum = newProData[i].value * 100 / countNum;
      newProData[i].scale = itemNum.toFixed(2) + "%";
    } else {
      newProData[i].scale = "0.00%";
    }
  }
  //从大到小排序
  newProData.sort((a, b) => {
    return b.value - a.value;
  })
  that.bigCityValue = bigCityValue;
  that.provinceCity = newProData;
}
async getProvinceItem(val) {
  //省份选择
  let that = this;
  that.provinceItem = val;
  that.getMethodType = "ProvinceType";
  that.changeCityData();
  that.drawProvince();
}
3.样式

二。省市地图(可切换省份)
1.最好把所有省份的js下载并放到本地(也可以连线上的,下面有下载所有地图的json数据链接,我这边没有钓鱼岛和台湾的js),并且还要下载一份所有省市区的json数据和省份的js数据对应。
2.页面
<el-card v-loading="isProvinceLoading">
<div class="chart-top">
<el-select v-model="provinceVal" @change="getProvinceVal" placeholder="请选择">
<el-option
v-for="item in provinceScatter"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
<el-select v-model="provinceValue" @change="getProvinceValue" placeholder="请选择">
<el-option
v-for="item in provinceOptions"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
<el-select v-model="provinceItem" @change="getProvinceItem" placeholder="请选择">
<el-option
v-for="item in provinceDatas"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
<span>{{provinceBeginDate}}</span><span>至</span><span>{{provinceEndDate}}</span>
</div> <div style="display: flex">
<div id="provinceChart" :style="{width: '100%', height: '500px'}"></div> <el-table
:data="provinceCity"
style="width: 100%" height="500">
<el-table-column
prop="name"
label="市区"
min-width="100">
</el-table-column>
<el-table-column
prop="value"
label="用户数">
</el-table-column>
<el-table-column
prop="scale"
label="占比">
</el-table-column>
</el-table>
</div>
</el-card>
import allProvince from "../../assets/province-json/all-province";
import "../../assets/province-js/anhui";
import "../../assets/province-js/aomen";
import "../../assets/province-js/beijing";
import "../../assets/province-js/chongqing";
import "../../assets/province-js/fujian";
import "../../assets/province-js/gansu";
import "../../assets/province-js/guangdong";
import "../../assets/province-js/guangxi";
import "../../assets/province-js/guizhou";
import "../../assets/province-js/hainan";
import "../../assets/province-js/hebei";
import "../../assets/province-js/heilongjiang";
import "../../assets/province-js/henan";
import "../../assets/province-js/hubei";
import "../../assets/province-js/hunan";
import "../../assets/province-js/jiangxi";
import "../../assets/province-js/jilin";
import "../../assets/province-js/liaoning";
import "../../assets/province-js/jiangsu";
import "../../assets/province-js/neimenggu";
import "../../assets/province-js/ningxia";
import "../../assets/province-js/qinghai";
import "../../assets/province-js/shandong";
import "../../assets/province-js/shanghai";
import "../../assets/province-js/shanxi";
import "../../assets/province-js/shanxi1";
import "../../assets/province-js/sichuan";
import "../../assets/province-js/tianjin";
import "../../assets/province-js/xianggang";
import "../../assets/province-js/xinjiang";
import "../../assets/province-js/xizang";
import "../../assets/province-js/yunnan";
import "../../assets/province-js/zhejiang";
async drawProvince() {
  //加载省市区地图
  const that = this;
  // 基于准备好的dom,初始化echarts实例
  var mychartContainer = document.getElementById('provinceChart');
  var resizeMyChartContainer = function () {
    mychartContainer.style.width = (document.body.offsetWidth / 2) + 'px'//页面一半的大小
  }
  resizeMyChartContainer();
  var mychart = this.$echarts.init(mychartContainer);
  var provinceData = that.provinceCity;//返回的市区数据
  var bigCityValue = that.bigCityValue;//最大值
  var provinceItem = that.provinceItem;//下拉选中省份
  // 绘制图表
  var optionMap = {
    title: {
      text: provinceItem + '省统计',
      left: 'center'
    },
    tooltip: {
      show: true,
      formatter: function (item) {
        let resData = item.data;
        if (resData) {
          return "市区:" + resData.name + "<br/>" + "数量:" + resData.value + "<br/>" + "百分比:" + resData.scale
        } else {
          return "市区:" + item.name + "<br/>" + "数量: 0" + "<br/>" + "百分比: 0.00%"
        }
      }
    },
    visualMap: {
      min: 0,
      max: bigCityValue,
      left: '10%',
      top: 'bottom',
      text: ['高', '低'],
      calculable: true,
      color: ['#0b50b9', '#c3e2f4']
    },
    selectedMode: 'single',
    series: [
      {
        // 类型
        type: 'map',
        // 系列名称,用于tooltip的显示,legend 的图例筛选 在 setOption 更新数据和配置项时用于指定对应的系列
        map: provinceItem,
        // 地图类型
        mapType: 'province',//对应省份,中文(如:广东)
        //设置图形大小
        zoom: 0.8,
        itemStyle: {
          normal: {
            borderColor: 'rgba(0, 0, 0, 0.2)'
          },
          emphasis: {
            shadowOffsetX: 0,
            shadowOffsetY: 0,
            shadowBlur: 20,
            borderWidth: 0,
            shadowColor: 'rgba(0, 0, 0, 0.5)'
          }
        },
        showLegendSymbol: true,
        label: {
          normal: {
            show: true
          },
          emphasis: {
            show: true
          }
        },
        data: provinceData
      }
    ]
  }
  mychart.setOption(optionMap);
  window.onresize = function () {
    resizeMyChartContainer();
    mychart.resize();
  }
}
3.样式

参考文档
http://datav.aliyun.com/tools/atlas/#&lat=31.840232667909365&lng=104.2822265625&zoom=4
https://blog.csdn.net/qq_38021296/article/details/84380709
https://www.jianshu.com/p/028525cbd080
https://www.cnblogs.com/colorful-paopao1/p/10566289.html
vue + echart 实现中国地图 和 省市地图(可切换省份)的更多相关文章
- echarts使用------地图生成----省市地图的生成及其他相关细节调整
		为使用多种业务场景,百度echarts地图示例只有中国地图,那么在使用省市地图的时候,就需要我们使用省市的地图数据了 以下为陕西西安市的地图示例: 此页面引用echarts的js:http://ech ... 
- 用 R 画中国分省市地图
		用 R 画中国分省市地图 (2010-11-18 16:25:34) 转载▼ 标签: 中国地图 营销 杂谈 分类: 数据分析 用R 也可以做出漂亮的依参数变化的中国地图. 主要参考(http://co ... 
- Vue Baidu Map局部注册实现和地图绘点
		需求:在vue项目中,实现用户选择地图绘点或者通过搜索关键字选点 <template> <div id="home"> <h2>首页地图< ... 
- vue cli3.0 结合echarts3.0和地图的使用方法
		echarts 提供了直观,交互丰富,可高度个性化定制的数据可视化图表.而vue更合适操纵数据. 最近一直忙着搬家,就没有更新博客,今天抽出空来写一篇关于vue和echarts的博客.下面是结合地图的 ... 
- Bing必应地图中国API一显示地图  (转) 做人要厚道
		Bing必应地图中国API一显示地图 2011-05-24 14:27:31| 分类: Bing&Google|字号 订阅 微软必应地图中国地图API发布已经有10天了,考虑到网上现 ... 
- Android地图开发之地图的选择
		做lbs开发差不多快2年了,地图相关的产品也差不多做了3个了,用到过的地图包括google地图.高德地图.百度地图.图吧.Osmdroid,今天总结下,方便大家开发时选择合适的地图. 首先说定位模块选 ... 
- Windows Store Javascript项目使用高德地图、谷歌地图、百度地图API
		原文 Windows Store Javascript项目使用高德地图.谷歌地图.百度地图API 在Win8 Store 项目中可以使用的地图主要有微软的Bing Map,目前高德地图sdk也支持Wi ... 
- 百度地图api根据地图缩放等级显示不同的marker点,功能二
		功能一里面有marker点后台的代码 根据地图的缩放等级显示不同marker点的坐标JSP代码 <%@ page language="java" contentType=&q ... 
- GPS定位为什么要转换处理?高德地图和百度地图坐标处理有什么不一样?
		GPS定位为什么要转换处理?高德地图和百度地图坐标处理有什么不一样? 先了解一下 高德地图 采用: GCJ-02 (不可逆) 百度百科: http://baike.baidu.com/link?url ... 
随机推荐
- 【SEED Labs】DNS Rebinding Attack Lab
			Lab Overview 实验环境下载:https://seedsecuritylabs.org/Labs_16.04/Networking/DNS_Rebinding/ 在这个实验中模拟的物联网设备 ... 
- 「从零单排canal 03」 canal源码分析大纲
			在前面两篇中,我们从基本概念理解了canal是一个什么项目,能应用于什么场景,然后通过一个demo体验,有了基本的体感和认识. 从这一篇开始,我们将从源码入手,深入学习canal的实现方式.了解can ... 
- JavaWeb网上图书商城完整项目-CommonUtils(1生成uuid,2Map转换成JavaBean)
			java工程中添加上面的jar包 CommonUtils类就两个方法: l String uuid():生成长度32的随机字符,通常用来做实体类的ID.底层使用了UUID类完成: l T toBe ... 
- JavaWeb网上图书商城完整项目--day02-16.登录功能各层实现
			/*1.第一步将用户提交的参数封装成javabean对象 * *2.对提交的参数的进行合法性的校验 * *3.通过用户名和密码去查找得到user对象 *如果user对象为null,说明用户名和密码不正 ... 
- Spring 面试详解
			SpringSpring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象.Spring的核心思想是IoC(控制反转),即不再需要程序员去显式地 ... 
- java8 Optional  类
			package jdk180reduce; import java.util.ArrayList; import java.util.HashMap; import java.util.List; i ... 
- springboot项目打war包发布到外置tomcat
			第一步:修改pom.xml 1. <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> ... 
- jmeter在non-GUI模式下用法
			用法 jmeter -n -t HTTPRequesttest.jmx -l testHistory/testResult.jtl -e -o testHistory/testReport 参数说明 ... 
- jQuery处理默认配置参数(将一个或多个对象的内容合并到目标对象)
			问题 我们在封装一个函数时, 需要别人传递一个json对象作为参数, 而用户可能只传入部分参数, 这是就可以利用$extend()来与合并到默认JSON参数合并. // 程序需要的参数 var def ... 
- Spring AOP学习笔记05:AOP失效的罪因
			前面的文章中我们介绍了Spring AOP的简单使用,并从源码的角度学习了其底层的实现原理,有了这些基础之后,本文来讨论一下Spring AOP失效的问题,这个问题可能我们在平时工作中或多或少也会碰到 ... 
