数据视化Echarts+百度地图API实现市县区级下钻
开始
这两天公司有个页面需要做数据可视化的展示,数据视化采用的是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实现市县区级下钻的更多相关文章
- 【百度地图API】批量地址解析与批量反地址解析(带商圈数据)
原文:[百度地图API]批量地址解析与批量反地址解析(带商圈数据) 摘要:因为地址解析的webserives方式还没有开通,所以先用JS版本的地址解析接口来批量获取地址解析数据吧,同时还能得到商圈的数 ...
- 用百度地图API分析打交通大数据
百度地图API, 文档不全,例子不细致. 在网上还没有太多有用的例子.比如说下面几个需求的解决方案就找不到: 1. 如何用百度地图API查询一个地点的经纬度. 2. 如何用百度地图通过一个经纬度查询商 ...
- scrapy爬虫框架调用百度地图api数据存入数据库
scrapy安装配置不在本文 提及, 1.在开始爬取之前,必须创建一个新的Scrapy项目.进入自定义的项目目录中,运行下列命令 scrapy startproject mySpider 其中, my ...
- 【百度地图API】如何利用自己的数据制作社交地图?只显示可视区域内的标注
原文:[百度地图API]如何利用自己的数据制作社交地图?只显示可视区域内的标注 摘要:如果你自己的数据已经超过1万个,如何进行合理的显示?除了聚合marker外,还有一个办法.那就是,只显示可视区域内 ...
- 【百度地图API】如何利用地图API制作汽车沿道路行驶的动画?——如何获得道路层数据
原文:[百度地图API]如何利用地图API制作汽车沿道路行驶的动画?--如何获得道路层数据 有几个做汽车导航的朋友问我说,他们想在地图上制作一辆车沿着道路行驶的动画.可是,百度地图的道路数据并没有公开 ...
- 【百度地图API】交你如何用百度地图搜索自己的数据!不需数据库!
原文:[百度地图API]交你如何用百度地图搜索自己的数据!不需数据库! 摘要: 我有一定的房产数据,还有银行数据.我想在百度地图上标注出来,并且能搜索到我这些数据. 可是百度的数据库上并没有我的数据. ...
- 【百度地图API】建立全国银行位置查询系统(四)——如何利用百度地图的数据生成自己的标注
原文:[百度地图API]建立全国银行位置查询系统(四)--如何利用百度地图的数据生成自己的标注 摘要: 上一章留个悬念,"如果自己没有地理坐标的数据库,应该怎样制作银行的分布地图呢?&quo ...
- 百度地图API获取数据
目前,大厂的服务范围越来越广,提供的数据信息也是比较全的,在生活服务,办公领域,人工智能等方面都全面覆盖,相对来说,他们的用户基数大,通过用户获取的信息也是巨大的.除了百度提供api,国内提供免费AP ...
- 百度地图 api 功能封装类 (ZMap.js) 本地搜索,范围查找实例 [源码下载]
相关说明 1. 界面查看: 吐槽贴:百度地图 api 封装 的实用功能 [源码下载] 2. 功能说明: 百度地图整合功能分享修正版[ZMap.js] 实例源码! ZMap.js 本类方法功能大多使用 ...
随机推荐
- ruby 知识点
$LOAD_PATH 执行 require 读取文件时搜索的目录名数组,也可以写作 $: 创建 URI 的时候可以直接这样 URI("http://www.dy2018.com/i/9751 ...
- 解析xml的几种方式
http://blog.csdn.net/smcwwh/article/details/7183869
- Objective-C学习篇10—NSDate与NSDateFormatter
NSDate NSDate 时间类,继承自NSObject,其对象表示一个时间点 NSDate *date = [NSDate date]; NSLog(@"date = %@", ...
- cocoapods出现Diff: /../Podfile.lock: No such file or directory错误
第一种解决方法: 关闭Xcode,重新执行pod install,之后再重新打开Xcode运行. 第二种解决方法: 删除以下文件: xcworkspacePodfile.lockPods文件夹~/Li ...
- 武汉科技大学ACM:1007: 文本编辑器
Problem Description YB打算写一个功能强大的文本编辑器,并取一个炫酷拉风,高端优雅的名字,比如“YB牌文本编辑器”之类的.既然功能强大,那肯定得有个查找功能吧.但是他在完成这个功能 ...
- Mysql中存储方式的区别
MySQL的表属性有:MyISAM 和 InnoDB 2种存储方式: MyISAM 不支持事务回滚 InnoDB 支持事务回滚 可以用 show create table tablename 命令看表 ...
- cmd命名设置成全局
如在jsdoc里.想要把jsdoc命名设置成全局.只要把环境变量里面的用户变量里面的path变量值增加 C:\Program Files\nodejs;E:\Program Files (x86)\j ...
- KVM virt-manager使用.
本来不想写,但是觉得教程就应该详细点..所以又有了这篇文章..主要是对图形化kvm管理的一些说明 接着上一篇... 1.Virtual Machine Manager 摘要: 打开Virtual Ma ...
- 使用 HTTP 缓存机制提升系统性能
摘要 HTTP缓存机制定义在HTTP协议标准中,被现代浏览器广泛支持,同时也是一个用于提升基于Web的系统性能的广泛使用的工具.本文讨论如何使用HTTP缓存机制提升基于Web的系统,以及如何避免误用. ...
- javaWeb图片验证码代码
1. [代码]初始粗糙代码 import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.a ...