先来要实现的效果图:

下方图1是官网的案例:http://www.echartsjs.com/gallery/editor.html?c=scatter-map

下图2是展示气泡类型为pin的效果:


绘制散点图(气泡)是echarts的一种series:

所以要实现在geojson绘制的地图上展示散点图就不能在series里设置geojson的地图在series的type为map里:

如果将注册的地图放在这里啦,那么在series里设置的scatter无法正常的显示,所以要将注册的geojson地图在echarts的geo里配置,series里的scatter设置coordinateSystem: 'geo',才能实现效果。

下面贴出实现的代码:

用到的geojson文件可以在世界各国以及中国各区县的JSON数据下载免费下载

<script>
var myChart = echarts.init(document.getElementById('container'));
$.get('china.json',function(geoJson){
echarts.registerMap('china',geoJson);
var mapData = geoJson.features.map(function(item){
return {
name: item.properties.name,
value: item.properties.childNum,
cp: item.properties.cp,
}
});
var data = [
{name: '四川', value: 20057.34},
{name: '重庆', value: 15477.48},
{name: '云南', value: 31686.1},
{name: '贵州', value: 6992.6},
{name: '湖南', value: 44045.49},
{name: '湖北', value: 40689.64},
{name: '陕西', value: 37659.78}
];
const max = 100000,
min = 900; // todo
const maxSize4Pin = 100,
minSize4Pin = 20;
var areaValue = data;
var convertData = function (areaValue) {
var res = [];
for (var i = 0; i < areaValue.length; i++) {
// var geoCoord = geoCoordMap[data[i].name];
mapData.forEach((v) => {
if(v.name == areaValue[i].name){
res.push({
name: areaValue[i].name,
value: v.cp.concat(areaValue[i].value)
});
}
});
}
console.log(res);
return res;
};
var option = {
title: {
text: '测试地图',
left: 'center',
},
tooltip: {
trigger: 'item',
formatter: '{b}<br/>{c}'
},
geo: {
show: true,
map: 'china',
label: {
normal: {
show: false
},
emphasis: {
show: true
}
},
roam: true,
itemStyle: {
normal: {
areaColor: '#031525',
borderColor: '#3B5077'
},
emphasis: {
areaColor: '#2B91B7'
}
},
zoom: 1.2
},
series: [
/*{
name: '地区测试数据',
type: 'map',
mapType: 'china', // 自定义扩展图表类型
// geoIndex: 0,
// aspectScale: 0.75, // 长宽比
itemStyle:{
normal:{label:{show:true}},
emphasis:{label:{show:true}}
},
data: areaValue
},*/
{
name: 'pm2.5',
type: 'scatter',
coordinateSystem: 'geo',
data: convertData(data),
symbolSize: function (val) {
return val[2] / 2000;
},
label: {
normal: {
formatter: '{b}',
position: 'right',
show: false
},
emphasis: {
show: true
}
},
itemStyle: {
normal: {
color: '#ddb926'
}
}
},
{
name: '点',
type: 'scatter',
coordinateSystem: 'geo',
symbol: 'pin',
symbolSize: function(val) {
const a = (maxSize4Pin - minSize4Pin) / (max - min);
let b = minSize4Pin - a * min;
b = maxSize4Pin - a * max;
return a * val[2] + b;
},
label: {
normal: {
show: true,
textStyle: {
color: '#fff',
fontSize: 9
}
}
},
itemStyle: {
normal: {
color: '#F62157' // 标志颜色
}
},
zlevel: 6,
data: convertData(data)
}
]
}
myChart.setOption(option);
});
</script>

上面的方法,当鼠标经过地图时不会触发echarts的提示框组件tooltip,只有经过scatter才会有,如果地图也要触发tooltip组件,那就必须在series里添加一个type为map的serise,type的值为注册的地图比如type='china';

{
name: '地区测试数据',
type: 'map',
mapType: 'china', // 自定义扩展图表类型
geoIndex: 0,
// aspectScale: 0.75, // 长宽比
itemStyle:{
normal:{label:{show:true}},
emphasis:{label:{show:true}}
},
data: areaValue
}

其中的geoIndex很关键,如果不设置为option里的对应的geo,map series 会自己生成内部专用的 geo 组件,但是也可以用这个 geoIndex 指定一个 geo 组件。这样的话,map 和 其他 series(例如散点图)就可以共享一个 geo 组件了。并且,geo 组件的颜色也可以被这个 map series 控制,从而用 visualMap 来更改。

具体可以看api:http://echarts.baidu.com/option.html#series-map.geoIndex

修改:实现上面的代码后,发现在scatter上显示label数据时,默认显示的是我们处理后的value里索引为1的经纬度数据,并不是我们要的真实value数据,官网上的很多案例都没有体现该项的配置,

我们需要自己去设置标签内容,使用echarts的formatter:

http://echarts.baidu.com/option.html#series-scatter.label.formatter

{
name: '点',
type: 'scatter',
coordinateSystem: 'geo',
symbol: 'pin',
symbolSize: function(val) {
const a = (maxSize4Pin - minSize4Pin) / (max - min);
let b = minSize4Pin - a * min;
b = maxSize4Pin - a * max;
return a * val[2] + b;
},
label: {
normal: {
// formatter: '{@score}',
formatter: '{@[2]}',
show: true,
textStyle: {
color: '#fff',
fontSize: 9
}
}
},
itemStyle: {
normal: {
color: '#F62157' // 标志颜色
}
},
zlevel: 6,
data: convertData(data)
}

其中formatter: '{@[2]}'里的@[2]表示获取value里的第三项。具体参数可看上方给的链接

注:这里是使用的geojson文件绘制的地图,可以直接获取到里面的数据,也可以使用echarts给的地图js来绘制地图,但是没办法获取到文件里的数据,也无法在上面展示散点图,可以在3Dmap里使用。

比如中国的地图js可以引入:

<script src="http://echarts.baidu.com/asset/map/js/china.js"></script>

世界地图:

<script src="http://echarts.baidu.com/asset/map/js/world.js"></script>

在echarts里在geojson绘制的地图上展示散点图(气泡)、线集。的更多相关文章

  1. 地图 SDK 系列教程-在地图上展示指定区域(转载)

    腾讯位置服务地图SDK是一套提供多种地理位置服务的应用程序接口.通过调用该接口,开发者可以在自己的应用中加入地图相关的功能(如地图展示.标注.绘制图形等),轻松访问腾讯地图服务和数据,构建功能丰富.交 ...

  2. 百度地图公交线路查询,并绘制到地图上并获取所有路径经纬度点(可供echarts 路径图使用)

    github地址 https://github.com/a1115040996/MyHTML/tree/gh-pages/BDMap 源代码 <!DOCTYPE html PUBLIC &quo ...

  3. [转][修]利用matlab绘制地图上的点、线、面

    一.绘制点 %生成背景地图地图   h = worldmap('France'); %读取和显示大陆架   landareas = shaperead('landareas.shp','UseGeoC ...

  4. 用echarts绘制中国地图

    在项目中运用到图形展示数据太常见了,echarts是一款使用率非常高的插件工具,很多大平台都是使用echarts: 一般运用到条形.折线.扇形图,今天说一说在中国地图上展示各地数据: 首先要准备中国地 ...

  5. echarts实现中国地图数据展示

    在项目中运用到图形展示数据太常见了,echarts是一款使用率非常高的插件工具,很多大平台都是使用echarts: 一般运用到条形.折线.扇形图,今天说一说在中国地图上展示各地数据: 首先要准备中国地 ...

  6. Echarts 地图上显示数值

    Echarts 地图上展示数值,效果如下: 上代码:关键代码用红色 series: [ { //name: '香港18区人口密度', type: 'map', mapType: 'jiangsu', ...

  7. R绘制中国地图,并展示流行病学数据

    流行病学的数据讲究“三间分布”,即人群分布.时间分布和空间分布.其中的“空间分布”最好是在地图上展示,才比较清楚.R软件集统计分析与高级绘图于大成,是最适合做这项工作了.关于地图的绘制过程,谢益辉.邱 ...

  8. 在高德地图上用svg.js绘制简单图形

    这段时间做的一个项目,需要在地图上绘制简单的图形.在学习高德地图JS API的过程中,发现高德地图提供的点.线等API并不能满足我的需求,还好它开放了自定义图层CustomLayer,官方说自定义图层 ...

  9. 操作指南:如何利用Smartbi、Tableau实现地图可视化展示

    优秀的地图分析是高信息量与美感兼具的.以往制作地图分析基本都需要依靠编程,制作的门槛比较高,制作也比较复杂.如果有一款只需要套入地理经纬度数据或区域名称,就能自动识别定位出相应位置的地图可视化工具是不 ...

随机推荐

  1. linux下分割和重组文件

    linux shell命令里的split和cat命令可以轻松完成这两个功能,举个例子来说,比如一个1GB大小的文件foo.zip,以100M为块分割: 分割: split -b 100M -d foo ...

  2. vicoapp使用备忘

    vico是一个模式编辑器,意味着没用过vi之类编辑器的童鞋用起来肯定觉得很不习惯. 模式切换 i:切至编辑模式,在光标前插入 a:切至编辑模式,在在光标后插入 I:类似于i,不过在行首插入 esc键: ...

  3. python select.select模块通信全过程详解

    要理解select.select模块其实主要就是要理解它的参数, 以及其三个返回值.select()方法接收并监控3个通信列表, 第一个是所有的输入的data,就是指外部发过来的数据,第2个是监控和接 ...

  4. JVM学习--(五)垃圾回收器

    上一篇我们介绍了常见的垃圾回收算法,不同的算法各有各的优缺点,在JVM中并不是单纯的使用某一种算法进行垃圾回收,而是将不同的垃圾回收算法包装在不同的垃圾回收器当中,用户可以根据自身的需求,使用不同的垃 ...

  5. index() checkbox单选问题

    index() 只对兄弟节点有用 如果这种结构要选择checkbox 时用prop附加属性 removeAttr清楚属性 $('.checkbox').prop('checked',true) $(' ...

  6. FreeMarker系列学习笔记

    FreeMarker是一个非常优秀的模板引擎,这个模板引擎可用于任何场景,FreeMarker负责将数据模型中的数据合并到模板中,从而生成标准输出.FreeMarker可以提供昜好的团队协作,对于界面 ...

  7. MVC3 项目总结

    验证 Validation 多样化验证规则 http://www.cnblogs.com/xling/archive/2012/07/11/2587002.html 最常见的验证方式是:在实体的属性上 ...

  8. java并发包分析之———AQS框架

    一.什么是同步器   多线程并发的执行,之间通过某种 共享 状态来同步,只有当状态满足 xxxx 条件,才能触发线程执行 xxxx . 这个共同的语义可以称之为同步器.可以认为以上所有的锁机制都可以基 ...

  9. java并发包小结(一)

    java.util.concurrent 包含许多线程安全.高性能的并发构建块.换句话讲,创建 java.util.concurrent 的目的就是要实现 Collection 框架对数据结构所执行的 ...

  10. P3370 【模板】字符串哈希

    题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 输入输出格式 输入格式: 第一行包含一个整数N,为字符串 ...