开始

  这两天公司有个页面需要做数据可视化的展示,数据视化采用的是Echarts+百度地图API做展示,需要用到县级区级下钻的一个联动效果发现网上关于Echarts做到县区级下钻的资料很少,有的话也不是很详细,对于刚接触Echarts的让人来说可能有些搞不明白,在这里我把Echarts下钻开发过程中总结的知识分享给大家,也能使自己加深印象,当然啦,对于一些在软件行业折腾了几年的老油条来说,这些都是一些非常基础的东西。但是还是希望能帮助到那些刚接触Echarts遇到类似问题需要帮助的人。如果哪里写的不对,或者有更好的方法,也欢迎大家吐槽留言,互相学习。

进入正题

  我这里用的是Echarts2.2.7,这是官网http://echarts.baidu.com/echarts2/;首先下载Echarts包引入Echarts.js

  然后再准备两个个DIV,配置路径,使用MAP,官网有说明http://echarts.baidu.com/echarts2/doc/start.html

  这里就不细说了,讲下官网没有的。中国地图下钻到省级联动效果。

第一步

加载中国地图都准备好了后再函数里定义一个option来设置中国地图的样式如下:

 function (ec) {
// 基于准备好的dom,初始化echarts图表
var myChart = ec.init(document.getElementById('main'));
var SubordinateMap = ec.init(document.getElementById('subordinate')); option = {
tooltip : {
trigger: 'item', //提示框的触发类型。
formatter: '{b}' //内容格式器可以支持异步回调函数。返回一个你想要提示的字符串就可以了
},
dataRange: { //值域选择
min: ,
max: ,
calculable: false,
show: false,
color: ['#ff3333', 'orange', 'yellow', 'lime', 'aqua'],
textStyle: { //文字颜色
color: '#fff'
}
},
series: [ //图表生成的数据内容数组
{
name: '中国',
type: 'map', //图表类型为地图
mapType: 'china', //地图类型中国地图,
selectedMode: 'single', //选中模式,可以设置多选模式和单选,不能选择则删除删除属性
hoverable: false, //悬浮是否高亮
itemStyle:{
normal: { //地图样式
borderColor: '#71D1FF', //地图边界颜色
color: '#070C67' //地图颜色
},
emphasis: { //地图选中时样式
label: {
show: true,
textStyle: {
color: '#fff' //选中时区域名字颜色
},
},
color: '#71D1FF' //选中时颜色
}
},
data:[
{name:'广东',selected:true} //广东默认别选中
],
geoCoord: { //每个城市对应的经纬度
'上海': [121.4648,31.2891] }...//类似数据省略

这个是全国地图,最后在使用setOption()方法加载地图:

 myChart.setOption(option, true);

第二步通过on事件实现省级下钻

添加一个省级对象(类似第一步的option)设置样式数据等,Echarts2.2.7这里不需要下载省级地图,直接通过Data设置数据读取就可以了:

                 //省级
provinceO = {
title: { //标题
text: '全国34个省市自治区',
subtext: '省级'
},
tooltip: {
trigger: 'item' //提示框的触发类型。
},
legend: { //图列
orient: 'vertical', //图列显示的方式
x: 'right',
data: ['随机数据']
},
series: [
{
name: '随机数据',
type: 'map',
mapType: '湖南', //要显示的省份,下钻就是通过on事件来更改属性
selectedMode: 'single', //选中模式,可以设置多选模式和单选,不能选择则删除删除属性
itemStyle: {
normal: {
label: { show: true }, //是否显示城市名字
borderColor: '#71D1FF', //地图边界颜色
color: '#070C67'
},
emphasis: { label: { show: true } } //选中后样式 },
data: [
{ name: '重庆市', value: Math.round(Math.random() * ) }}....//类似数据省略

通过on来更改series下的mapType属性,然后通过setOption方法来给第二个DIV加载地图(当然也可以直接给第一个DIV重新加载),这样就实现下钻到省的联动效果了;

               var ecConfig = require('echarts/config');
   myChart.on(ecConfig.EVENT.MAP_SELECTED, function (param) {
var name = param.target;//获得选中的城市
provinceO.series[].mapType = name;//设置series的mapType属性为当前选中的城市
SubordinateMap.setOption(provinceO, true);//给SubordinateMapDIV重现加载地图 });

第三步通实现市级下钻效果
通过一个数组绑定每个城市对应的文件名:

 var cityMap = {
"北京市": "", //每个城市对应的json文件名
"天津市": "",
"上海市": "",
"重庆市": ""}//重复数据省略

通过循环引入地图数据:

           var mapType = [];
var mapGeoData = require('echarts/util/mapData/params');
//console.log(mapGeoData)
for (var city in cityMap) { //通过循环来引入数据
mapType.push(city);
// 自定义扩展图表类型
mapGeoData.params[city] = {
getGeoJson: (function (c) {
var geoJsonName = cityMap[c]; //通过cityMap数组得到JSON文件名
return function (callback) {
$.getJSON('geoJson/' + geoJsonName + '.json', callback); //得到地图JSON文件数据,首先你本地路径下得有这个JSON文件
}
})(city)
}
}

添加一个市级对象设置样式数据,跟上面不同的是这里需要地图数据,因为Echarts没有带市级地图,需要自己去网上找地图数据:

           //市级
cityO = {
title: { //标题
text: '全国344个主要城市'
},
tooltip: {
trigger: 'item', //提示框的触发类型。
formatter: '{b}' //内容格式器可以支持异步回调函数。返回一个你想要提示的字符串就可以了
},
series: [ //图表生成的数据内容数组
{
name: '全国344个主要城市(县)地图',
type: 'map', //类型为地图,
mapType: '北京市', //要显示的市,下钻就是通过on事件来更改属性
selectedMode: 'single',//选中模式,可以设置多选模式和单选,不能选择则删除删除属性
itemStyle: {
normal: {
label: { show: true }, //是否显示城市名字
borderColor: '#71D1FF', //地图边界颜色
color:'#070C67'
},
emphasis: { label: { show: true } } //选中后的样式
},
data: []
}
]
};

然后通过on来更改series下的mapType属性,在通过setOption方法来给第二个DIV重新加载地图就实现下钻到市级了。

           SubordinateMap.on(ecConfig.EVENT.MAP_SELECTED, function (param) {
var name = param.target;//获得选中的城市
cityO.series[].mapType = name;//设置series的mapType属性为当前选中的城市
SubordinateMap.setOption(cityO, true);//给SubordinateMapDIV重现加载地图
});

如果你还需要下钻到更小范围比如区级,那就只能跟百度地图API结合了,PS:当然也可以用Ehcarts自定义地图实现但是每个县的区级地图JSON数据网上也没有,
并且Echarts生成也只能生成到县。

如何下钻到县区级:
实现效果:点击某个市的县后,在到百度地图上框出边界线,设置缩放级别调整视角。(如果想要更好的效果也可以把边除了框出来的城市外其他的城市不显示)

引入百度地图API,在页面上添加一个DIV来加载百度地图,然后初始化百度地图:

   function (echarts, BMapExtension) {
var BMapExt = new BMapExtension($('#main')[], BMap, echarts, {
enableMapClick: false
});
map = BMapExt.getMap();
var container = BMapExt.getEchartsContainer(); var startPoint = { //经纬度
x: 104.114129,
y: 37.550339
};
var point = new BMap.Point(startPoint.x, startPoint.y);
map.centerAndZoom(point, ); //根据经纬度调整视角
map.enableScrollWheelZoom(true); //开启滚轮缩放
// 地图自定义样式
map.setMapStyle({
styleJson: [
{
"featureType": "background",
"elementType": "all",
"stylers": {
"color": "#444444"
}
}
]
})
}

通过Echarts加载的市级地图的on事件触发百度地图设置函数:

        var myChart = echarts.init(document.getElementById('main'));
var ecConfig = require('echarts/config');
myChart.on(ecConfig.EVENT.MAP_SELECTED, function (param) {
getBoundary(param.target);
});

由于没个城市的大小,形状都不一样,在DIV里面显示的效果就不一样,有大的城市没有显示全,有些小的又放的太小了,并且视角也不是最佳视角,所以我这了定义的一个数组用来存放每个下钻城市
的视角位置,已经缩放级别,这样就跟根据自己设置的DIV大小来调整地图的大小了。

 //定义一个数组来存放每个城市的视角位置,和放大级别
var PositionData = [{ name: '济宁市', long: 116.782471, lat: 35.226815, zoom: }, { name: '新乡市', long: 114.172514, lat: 35.216547, zoom: }, { name: '甘孜藏族自治州', long: 99.935306, lat: 31.093953, zoom: }]
function getBoundary(city) {
var ply;
var bdary = new BMap.Boundary();
bdary.get(city, function (rs) { //获取行政区域
//map.clearOverlays(); //清除地图覆盖物
var count = rs.boundaries.length; //行政区域的点有多少个
for (var i = ; i < count; i++) {
ply = new BMap.Polygon(rs.boundaries[i], { strokeWeight: , strokeColor: "#ffff00", fillColor: "none" }); //建立多边形覆盖物
map.addOverlay(ply); //添加覆盖物 ,这里要用到初始化时的map ,
//map.setViewport(ply.getPath()); //调整视野
}
for (var i = ; i < PositionData.length; i++)
{
if (PositionData[i].name == city) {
//通过经纬度指定视野的中心位置,以及放大级别
map.centerAndZoom(new BMap.Point(PositionData[i].long, PositionData[i].lat), PositionData[i].zoom);
break;
}
else {
if (i == PositionData.length - ) {
//如果数组里没有该城市视角数据和放大级别数据时就设置默认的视角位置和放大级别
map.centerAndZoom(city, );
}
}
}
});
}

最后
如果想实现下钻到区级,原理一样,这里就不讲了,需要源码或地图数据的,可以联系我,如果有什么更好的方法,欢迎吐槽留言。

当然你也可以请我喝杯咖啡(学的,不发个二维码都没啥期待,哈哈哈)

数据视化Echarts+百度地图API实现市县区级下钻的更多相关文章

  1. 【百度地图API】批量地址解析与批量反地址解析(带商圈数据)

    原文:[百度地图API]批量地址解析与批量反地址解析(带商圈数据) 摘要:因为地址解析的webserives方式还没有开通,所以先用JS版本的地址解析接口来批量获取地址解析数据吧,同时还能得到商圈的数 ...

  2. 用百度地图API分析打交通大数据

    百度地图API, 文档不全,例子不细致. 在网上还没有太多有用的例子.比如说下面几个需求的解决方案就找不到: 1. 如何用百度地图API查询一个地点的经纬度. 2. 如何用百度地图通过一个经纬度查询商 ...

  3. scrapy爬虫框架调用百度地图api数据存入数据库

    scrapy安装配置不在本文 提及, 1.在开始爬取之前,必须创建一个新的Scrapy项目.进入自定义的项目目录中,运行下列命令 scrapy startproject mySpider 其中, my ...

  4. 【百度地图API】如何利用自己的数据制作社交地图?只显示可视区域内的标注

    原文:[百度地图API]如何利用自己的数据制作社交地图?只显示可视区域内的标注 摘要:如果你自己的数据已经超过1万个,如何进行合理的显示?除了聚合marker外,还有一个办法.那就是,只显示可视区域内 ...

  5. 【百度地图API】如何利用地图API制作汽车沿道路行驶的动画?——如何获得道路层数据

    原文:[百度地图API]如何利用地图API制作汽车沿道路行驶的动画?--如何获得道路层数据 有几个做汽车导航的朋友问我说,他们想在地图上制作一辆车沿着道路行驶的动画.可是,百度地图的道路数据并没有公开 ...

  6. 【百度地图API】交你如何用百度地图搜索自己的数据!不需数据库!

    原文:[百度地图API]交你如何用百度地图搜索自己的数据!不需数据库! 摘要: 我有一定的房产数据,还有银行数据.我想在百度地图上标注出来,并且能搜索到我这些数据. 可是百度的数据库上并没有我的数据. ...

  7. 【百度地图API】建立全国银行位置查询系统(四)——如何利用百度地图的数据生成自己的标注

    原文:[百度地图API]建立全国银行位置查询系统(四)--如何利用百度地图的数据生成自己的标注 摘要: 上一章留个悬念,"如果自己没有地理坐标的数据库,应该怎样制作银行的分布地图呢?&quo ...

  8. 百度地图API获取数据

    目前,大厂的服务范围越来越广,提供的数据信息也是比较全的,在生活服务,办公领域,人工智能等方面都全面覆盖,相对来说,他们的用户基数大,通过用户获取的信息也是巨大的.除了百度提供api,国内提供免费AP ...

  9. 百度地图 api 功能封装类 (ZMap.js) 本地搜索,范围查找实例 [源码下载]

    相关说明 1. 界面查看: 吐槽贴:百度地图 api 封装 的实用功能 [源码下载] 2. 功能说明: 百度地图整合功能分享修正版[ZMap.js] 实例源码! ZMap.js 本类方法功能大多使用 ...

随机推荐

  1. linux下查看已经安装的jdk 并卸载jdk

    一.查看Jdk的安装路径: whereis javawhich java (java执行路径)echo $JAVA_HOME echo $PATH 备注:如果是windows中,可以使用: set j ...

  2. C++ 文本读写

    写文件: ofstream of; of.open("test.txt"); string content = "abcd"; of.write(content ...

  3. 重新认识Swift中的可选型(Swift2.1)

    //: Playground - noun: a place where people can play import UIKit /* Swift中nil代表是是另外一种类型, 而不像OC那样, 任 ...

  4. SQL 无法打开物理文件 XXX.mdf",操作系统错误 5:"5(拒绝访问。)"

    用T-SQL命令附加数据库时,出现如下异常信息: 无法打开物理文件 XXX.mdf".操作系统错误 5:"5(拒绝访问.)". (Microsoft SQL Server ...

  5. jQuery 小知识点(插件)

    1.jQuery插件小知识点: 估计很多人都没弄明白下面的东西,特从网络上搜索了下面的知识,自己以后用起来也比较方便: $.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例 ...

  6. Linux定时任务crontab命令使用详解

    1.crontab功能介绍: crontab的功能是在一定的时间间隔内定时执行一些命令. 2.crontab参数详解: 1 crontab -u //设定某个用户的cron服务,一般root用户在执行 ...

  7. 【结构型】Decorate模式

    装饰模式主要意图是为对象扩展额外的职责,但对于用户来说,在使用行为上并没有任何的变化.在此举一个例子来解释该模式的含义.假如你手上有一张照片,此时可以给它盖上一片玻璃片,同时再套上一个精美的相框.如此 ...

  8. 函数式编程做用户登陆注册练习-pycharm上

    def login(username,password): """ 用户登陆 :param username: 用户名 :param password:密码 :retur ...

  9. PHP开发环境设置

    步骤有三个: Apache 服务器安装.PHP 安装和让 Apache 支持 PHP 1. Apache 服务器的安装与配置 基于Windows操作系统支持的PHP开发的服务器有IIS和Apache, ...

  10. 使用__autoload()来管理文件导入

    其基本思想是把要使用到的其他资源文件统一使用__autoload()方法来管理,我们在使用的时候只需要引入包含__autoload()方法的文件即可.其对性能的影响是微乎其微的,但是带来的好处是巨大的 ...