ECharts--中国地图(无敌详细)_echarts中国地图-程序员宅基地

技术标签: html5  echarts  

前段时间需要做一个中国地图的页面,要求是展示各地产品的销量,我就在网上搜了很多ECharts的资料,学习了一下怎么使用。

本着互相学习,共同进步的原则,特此分享一下自己的学习经验以及使用技巧。如果有用的话可以给老弟点个赞~

首先先展示一下成品:(利用JavaScript在HTML页面绘制),表格利用bootstrap.min.css样式,当然你也可以自己编写样式实现。本文重点介绍如何使用ECharts绘制中国地图并打入地区散点。

话不多说直接上干货!!

首先ECharts 是一个使用 JavaScript 实现的开源可视化库,涵盖各行业图表,满足各种需求;
在中国地图上实现打点,我们需要引入两个文件:
  1. echarts.js 官网地址下载:快速上手 - Handbook - Apache ECharts

  1. chain.js 这个官网已经找不到了,需要自行搜寻下载

  1. 也可以直接从我的网盘下载:

链接:链接:https://pan.baidu.com/s/18OPEgoRPCVerAkwqTZrExg?pwd=123l 
提取码:123l

下载完这两个文件后,导入自己的编辑器,我是用IDEA,下面是文件的结构;我们只需要编写两个文件
  1. index.html 启动页面

  1. RobotSales.json 写入我们需要省市的经纬度坐标和说明信息(自定义)

接下来我将详细介绍这两个文件的内容

RobotSales.json


我将地区的数据信息封装到了一个json文件中,我们只需要请求该文件就能获取地区数据,包括:地名、坐标、销量、其他文本等信息

我们知道json文件的格式是 “key”:value 格式;作为在地图上打点(定位)的依据,这里我们最少要写两点:name和value

n其中ame是地区名字! value是该地区的经纬度坐标; 其他信息根据自己的需要自行添加就行~。

[
    {
        "name": "深圳",
        "value": [114.271522, 22.753644],
        "Sales": "2台",
        "text": "机器人1"
    },
    {
        "name": "南京",
        "value": [118.46, 32.02],
        "Sales": "2台",
        "text": "机器人1"
    },
    {
        "name": "重庆",
        "value": [106.54, 29.59],
        "Sales": "1台",
        "text": "机器人1"
    },
    {
        "name": "北京",
        "value": [116.24, 39.55],
        "Sales": "3台",
        "text": "机器人1"
    },
    {
        "name": "荆州",
        "value": [113.41, 29.59],
        "Sales": "2台",
        "text": "机器人1"
    }
]

ps:经纬度可以百度

index.html文件


我们已经编写完JSON文件,下边就是我们的index.html内容。代码稍多,没有耐心的老哥可以下滑到最后直接复制粘贴(详情已写入注解)

首先dataValue是我们自己编写的json数据,中国地图可以直接使用,但是如果要展示某一个地区比如荆州,就需要我们查询这个地区的经纬度坐标,然后传给ECharts。

下边我主要介绍一下是如何提取json数据的,以及ECharts使用过程中自己的薄见,若有瑕疵欢迎留言:

提取json文件的数据

因为我们将地区信息封装到json文件了,我们需要请求该文件提取出来信息才能使用!这里我使用的是ajax请求,请求成功后的数据res传入 dealWithData(res)函数中。

 $.ajax({
             url: "HTML/json/RobotSales.json",//json文件位置,文件名
             type: "GET",
             dataType: "json",
             success: function(data) {
                 letres=[];//自定义一个空数组接收请求回来的json数据
                 for(leti=0;i<data.length;i++){
                     res.push({name:data[i].name,
                         value: data[i].value,
                         sales:data[i].Sales//若json文件中自己定义了其他信息,在下边直接以k:v形式进行罗列即可;但是主要“,”
                     });
                 };
                 //重点:将封装的json数据传递到dealWithData函数中进行渲染处理使用
                 dealWithData(res);
                 //===销售表格===
                 letrow=[];
                 for (leti=0; i<data.length; i++) {
                     letname=data[i].name;
                     letsales=data[i].Sales;
                     lettext=data[i].text;
                     //拼接表格的行和列
                     row.push("<tr><td>"+name+"</td>"+
                         '<td>'+sales+'</td>'+text+'</tr>');
                 }
                 table.append(row.join());//追加到table表格中
             }
         });

涟漪特效

涟漪特效就是像这种跟水纹一样; 看起来非常高大上吧!! 我们一起来看看怎么实现的

 //涟漪特效
 {
     name: "产品销量",
     type: "effectScatter",
     coordinateSystem: "geo",
     data:dataValue,//传入的地图点数据
     symbolSize: 6,//涟漪大小
     showEffectOn: "render",
     //涟漪效应
     rippleEffect: {
         brushType: "stroke",
         color: "#f13434",
         period: 10,//周期
         scale: 10//规模
     },
     hoverAnimation: true,//悬停动画
     //地图点样式
     label: {
         formatter: "{b}",
         position: "top",
         show: true,
         fontSize: "10",
     },
     itemStyle: {
         color: "#f13434",
         shadowBlur: 2,
         shadowColor: "#333"
     },
     //鼠标点击散点的下弹框
     tooltip: {
         show: true,
         triggerOn:"click",
         formatter: function(data1) {
         console.log(data1)
         let data2 = data1.data;
         return "<b>销量<b><br>"+data2.name+data2.sales
           }
      },
      zlevel: 1
  }

看完涟漪特效我们还要再看一个ECharts配置!

tooltip 配置
 tooltip: {
   show: true, // 是否显示
   trigger: 'axis', // 触发类型  'item'图形触发:散点图,饼图等无类目轴的图表中使用; 'axis'坐标轴触发;'none':什么都不触发。
   axisPointer: { // 坐标轴指示器配置项。
       type: 'shadow', // 'line' 直线指示器  'shadow' 阴影指示器  'none' 无指示器  'cross' 十字准星指示器。
       axis: 'auto', // 指示器的坐标轴。 
       snap: true, // 坐标轴指示器是否自动吸附到点上
   },
   showContent: true, //是否显示提示框浮层,默认显示。
   triggerOn: 'mouseover', // 触发时机  'mouseover'鼠标移动时触发。     'click'鼠标点击时触发。  'mousemove|click'同时鼠标移动和点击时触发。
   enterable: false, // 鼠标是否可进入提示框浮层中,默认为false,如需详情内交互,如添加链接,按钮,可设置为 true。
   renderMode: 'html', // 浮层的渲染模式,默认以 'html 即额外的 DOM 节点展示 tooltip;
   backgroundColor: 'rgba(50,50,50,0.7)', // 提示框浮层的背景颜色。
   borderColor: '#333', // 提示框浮层的边框颜色。
   borderWidth: 0, // 提示框浮层的边框宽。
   padding: 5, // 提示框浮层内边距,
   textStyle: { // 提示框浮层的文本样式。
       color: '#fff',
       fontStyle: 'normal',
       fontWeight: 'normal',
       fontFamily: 'sans-serif',
       fontSize: 14,
   },
   extraCssText: 'box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);', // 额外附加到浮层的 css 样式
   confine: false, // 是否将 tooltip 框限制在图表的区域内。
   formatter: '{b} 的成绩是 {c}'
   formatter: function(arg) {
       return arg[0].name + '的分数是:' + arg[0].data
   }
 }

为了弄明白我们formatter 配置,我们可以在散点函数的tooltip中打印出data1参数

 //我们的散点
     {
         name: '销量',
         type: 'scatter',
         coordinateSystem: 'geo',//坐标系统
         data: dataValue,
         //地图点的样式;颜色,大小
         symbolSize: 12,
         itemStyle: {
             color: "#f13434",
             shadowBlur: 2,
             shadowColor: "#333"
         },
         //鼠标点击散点的下弹框
         tooltip: {
             show: true,
             triggerOn:"click",
             formatter: function(data1) {
             //打印回调函数中的参数
             console.log(data1)
           }
         },
     },

把回调函数的参数打印出来看看

可以看到我们想要的数据在data中!!

最后再介绍一下地图的点击事件

点击事件

点击事件就是我们在使用地图界面鼠标点击后触发某些事件;为了设计点击事件,我们先得看看点击函数中的param都有什么

 //点击事件
     myChart.on('click', function(param) {
         console.log("点击")
         console.log(param)
     });

运行后点击一个散点

当我们点击散点可以从日志中观察到param包括我们编写的json数据---data;那这好说了!,我们直接从data中取出我们想要的数据然后进行后边处理就行啦!

 //点击事件
     myChart.on('click', function(param) {
         let data = param.data;
         if (data){
             console.log("城市:"+data.name+";坐标:"+data.value+";销量:"+data.sales);
         }
     });

好了,下边就是该页面全部代码,光看是没用的,大家可以复制粘贴运行试试!本人还在学习java后端,对于前端知识了解不深刻的地方,欢迎大家在评论区讨论,共同进步!

 <!DOCTYPE html>
 <htmllang="en">
 <head>
     <metacharset="UTF-8">
     <title>机器人销量地图</title>
     <scriptsrc="HTML/js/echarts.js"></script>
     <scriptsrc="HTML/js/chain.js"></script>
     <scriptsrc="HTML/js/jquery-3.5.1.js"></script>
     <linkrel="stylesheet"href="HTML/css/bootstrap.min.css">
     <style>
         tablethead, tbodytr {
             display:table;
             width:100%;
             table-layout:fixed;
         }
         /*表格文字属性;居中,字体宽度和字体大小*/
         trth{
             text-align: center;
             font-weight:bold;
             font-size: larger;
         }
         /*将表头缩进1.2em*/
         tablethead {
             width: calc( 100% - 1.2em )
         }
         /*表头数据格式:颜色和文字居中*/
         trtd{
             color: #FFFFFF;
             text-align: center;
         }
         /*表格设置滚动*/
         tabletbody{
             display:block;
             height:115px;
             overflow-y:scroll;
         }
     </style>
 </head>
 ​
 <bodystyle="background-color: #2c313a">
 <divclass="container"style="height: 100% ;width: 100%">
 <!--这里利用bootstrap的样式:
                         一个页面布局为12份,id=main的代码块展示我们的中国地图;
                         class:col-md-9 代表这个div占9份;col-md-3 占3份-->
     <divid= "content-left"class="col-md-9"  style="margin-top: 20px">
         <divid="main"style="width: 100%;height:800px"></div>
     </div>
 ​
     <divclass="col-md-3 table-responsive">
         <!--            表格展示销量-->
         <tableclass="table table-bordered"style="margin-top: 20px">
             <thead>
             <tr>
                 <thstyle="color: #FFFFFF">地区</th>
                 <thstyle="color: #FFFFFF">销量(台)</th>
                 <!--                    <th style="color: #FFFFFF">类型</th>      ?-->
             </tr>
             </thead>
             <tbodyid="tbody">
             </tbody>
         </table>
     </div>
 ​
 </div>
 ​
 </body>
 <script>
 <!--    echarts初始化:获取myChart对象-->
     varmyChart=echarts.init(document.getElementById('main'));
 ​
     $(function(){
         //获取表格对象
         lettable=$("#tbody");
         //发生ajax请求,到json文件,data为返回的数据,将数据封装到空数组中;直接拿来用即可
         $.ajax({
             url: "HTML/json/RobotSales.json",//json文件位置,文件名
             type: "GET",
             dataType: "json",
             success: function(data) {
                 letres=[];//自定义一个空数组接收请求回来的json数据
                 for(leti=0;i<data.length;i++){
                     res.push({name:data[i].name,
                         value: data[i].value,
                         sales:data[i].Sales//若json文件中自己定义了其他信息,在下边直接以k:v形式进行罗列即可;但是主要“,”
                     });
                 };
                 //重点:将封装的json数据传递到dealWithData函数中进行渲染处理使用
                 dealWithData(res);
                 //===销售表格===
                 letrow=[];
                 for (leti=0; i<data.length; i++) {
                     letname=data[i].name;
                     letsales=data[i].Sales;
                     lettext=data[i].text;
                     //拼接表格的行和列
                     row.push("<tr><td>"+name+"</td>"+
                         '<td>'+sales+'</td>'+text+'</tr>');
                 }
                 table.append(row.join());//追加到table表格中
             }
         });
     })
 ​
 ​
     functiondealWithData(data){
         letdataValue=data;
         option= {
             //设置一个标题
             title: {
                 text: '设备销量',
                 x: 'center',
                 textStyle: {
                     color: '#fff',
                     fontSize:"40"
                 }
             },
             //鼠标划过省份下弹框
             tooltip: {
                 show: true,
                 triggerOn:'click'//点击生效
             },
             geo: {
                 map: 'china',//必须写
                 roam:false,// 拖拽功能;自选关闭开启
                 zoom: 1.235,//地图缩放比例
                 center: [105, 36],//地图位置
                 //地图省份的样式;包括板块颜色和边框颜色
                 itemStyle: {
                     areaColor: '#f5f2f2',
                     borderColor: "#835f5f",
                 },
                 //省份字体样式;包括是否展示,字体大小和颜色
                 label: {
                     normal: {
                         show:true,
                         fontSize: "11.5",
                         color: "rgb(107,102,102)"
                     }
                 },
                 //鼠标划过的高亮设置;包括省份板块颜色和字体等
                 emphasis: {
                     itemStyle: {
                         areaColor: '#d0a3a3',
                     },
                     label: {
                         show: true,
                         color:"rgb(255,255,255)"
                     }
                 }
             },
 ​
             series: [
                 //我们的散点
                 {
                     name: '销量',
                     type: 'scatter',
                     coordinateSystem: 'geo',//坐标系统
                     data: dataValue,
                     //地图点的样式;颜色,大小
                     symbolSize: 12,
                     itemStyle: {
                         color: "#f13434",
                         shadowBlur: 2,
                         shadowColor: "#333"
                     },
                     //鼠标点击散点的下弹框
                     tooltip: {
                         show: true,
                         triggerOn:"click",
                         formatter: function(data1) {
                             letdata2=data1.data;
                             return"<b>销量<b><br>"+data2.name+data2.sales
                         }
                     },
                 },
 ​
                 //涟漪特效
                 {
                     name: "产品销量",
                     type: "effectScatter",
                     coordinateSystem: "geo",
                     data:dataValue,//传入的地图点数据
                     symbolSize: 6,//涟漪大小
                     showEffectOn: "render",
                     //涟漪效应
                     rippleEffect: {
                         brushType: "stroke",
                         color: "#f13434",
                         period: 10,//周期
                         scale: 10//规模
                     },
                     hoverAnimation: true,//悬停动画
                     //地图点样式
                     label: {
                         formatter: "{b}",
                         position: "top",
                         show: true,
                         fontSize: "10",
                     },
                     itemStyle: {
                         color: "#f13434",
                         shadowBlur: 2,
                         shadowColor: "#333"
                     },
                     //鼠标点击散点的下弹框
                     tooltip: {
                         show: true,
                         triggerOn:"click",
                         formatter: function(data1) {
                             console.log(data1)
                             letdata2=data1.data;
                             return"<b>销量<b><br>"+data2.name+data2.sales
                         }
                     },
                     zlevel: 1
                 }
             ]
         };
         myChart.setOption(option);
     }
 ​
 
 ​
     //点击事件
     myChart.on('click', function(param) {
         letdata=param.data;
         if (data){
             console.log("城市:"+data.name+";坐标:"+data.value+";销量:"+data.sales);
         }
     });
 
 ​
 </script>
 </html>
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45066453/article/details/129479541

智能推荐

Docker 快速上手学习入门教程_docker菜鸟教程-程序员宅基地

文章浏览阅读2.5w次,点赞6次,收藏50次。官方解释是,docker 容器是机器上的沙盒进程,它与主机上的所有其他进程隔离。所以容器只是操作系统中被隔离开来的一个进程,所谓的容器化,其实也只是对操作系统进行欺骗的一种语法糖。_docker菜鸟教程

电脑技巧:Windows系统原版纯净软件必备的两个网站_msdn我告诉你-程序员宅基地

文章浏览阅读5.7k次,点赞3次,收藏14次。该如何避免的,今天小编给大家推荐两个下载Windows系统官方软件的资源网站,可以杜绝软件捆绑等行为。该站提供了丰富的Windows官方技术资源,比较重要的有MSDN技术资源文档库、官方工具和资源、应用程序、开发人员工具(Visual Studio 、SQLServer等等)、系统镜像、设计人员工具等。总的来说,这两个都是非常优秀的Windows系统镜像资源站,提供了丰富的Windows系统镜像资源,并且保证了资源的纯净和安全性,有需要的朋友可以去了解一下。这个非常实用的资源网站的创建者是国内的一个网友。_msdn我告诉你

vue2封装对话框el-dialog组件_<el-dialog 封装成组件 vue2-程序员宅基地

文章浏览阅读1.2k次。vue2封装对话框el-dialog组件_

MFC 文本框换行_c++ mfc同一框内输入二行怎么换行-程序员宅基地

文章浏览阅读4.7k次,点赞5次,收藏6次。MFC 文本框换行 标签: it mfc 文本框1.将Multiline属性设置为True2.换行是使用"\r\n" (宽字符串为L"\r\n")3.如果需要编辑并且按Enter键换行,还要将 Want Return 设置为 True4.如果需要垂直滚动条的话将Vertical Scroll属性设置为True,需要水平滚动条的话将Horizontal Scroll属性设_c++ mfc同一框内输入二行怎么换行

redis-desktop-manager无法连接redis-server的解决方法_redis-server doesn't support auth command or ismis-程序员宅基地

文章浏览阅读832次。检查Linux是否是否开启所需端口,默认为6379,若未打开,将其开启:以root用户执行iptables -I INPUT -p tcp --dport 6379 -j ACCEPT如果还是未能解决,修改redis.conf,修改主机地址:bind 192.168.85.**;然后使用该配置文件,重新启动Redis服务./redis-server redis.conf..._redis-server doesn't support auth command or ismisconfigured. try

实验四 数据选择器及其应用-程序员宅基地

文章浏览阅读4.9k次。济大数电实验报告_数据选择器及其应用

随便推点

灰色预测模型matlab_MATLAB实战|基于灰色预测河南省社会消费品零售总额预测-程序员宅基地

文章浏览阅读236次。1研究内容消费在生产中占据十分重要的地位,是生产的最终目的和动力,是保持省内经济稳定快速发展的核心要素。预测河南省社会消费品零售总额,是进行宏观经济调控和消费体制改变创新的基础,是河南省内人民对美好的全面和谐社会的追求的要求,保持河南省经济稳定和可持续发展具有重要意义。本文建立灰色预测模型,利用MATLAB软件,预测出2019年~2023年河南省社会消费品零售总额预测值分别为21881...._灰色预测模型用什么软件

log4qt-程序员宅基地

文章浏览阅读1.2k次。12.4-在Qt中使用Log4Qt输出Log文件,看这一篇就足够了一、为啥要使用第三方Log库,而不用平台自带的Log库二、Log4j系列库的功能介绍与基本概念三、Log4Qt库的基本介绍四、将Log4qt组装成为一个单独模块五、使用配置文件的方式配置Log4Qt六、使用代码的方式配置Log4Qt七、在Qt工程中引入Log4Qt库模块的方法八、获取示例中的源代码一、为啥要使用第三方Log库,而不用平台自带的Log库首先要说明的是,在平时开发和调试中开发平台自带的“打印输出”已经足够了。但_log4qt

100种思维模型之全局观思维模型-67_计算机中对于全局观的-程序员宅基地

文章浏览阅读786次。全局观思维模型,一个教我们由点到线,由线到面,再由面到体,不断的放大格局去思考问题的思维模型。_计算机中对于全局观的

线程间控制之CountDownLatch和CyclicBarrier使用介绍_countdownluach于cyclicbarrier的用法-程序员宅基地

文章浏览阅读330次。一、CountDownLatch介绍CountDownLatch采用减法计算;是一个同步辅助工具类和CyclicBarrier类功能类似,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。二、CountDownLatch俩种应用场景: 场景一:所有线程在等待开始信号(startSignal.await()),主流程发出开始信号通知,既执行startSignal.countDown()方法后;所有线程才开始执行;每个线程执行完发出做完信号,既执行do..._countdownluach于cyclicbarrier的用法

自动化监控系统Prometheus&Grafana_-自动化监控系统prometheus&grafana实战-程序员宅基地

文章浏览阅读508次。Prometheus 算是一个全能型选手,原生支持容器监控,当然监控传统应用也不是吃干饭的,所以就是容器和非容器他都支持,所有的监控系统都具备这个流程,_-自动化监控系统prometheus&grafana实战

React 组件封装之 Search 搜索_react search-程序员宅基地

文章浏览阅读4.7k次。输入关键字,可以通过键盘的搜索按钮完成搜索功能。_react search