Echarts简述 :一个纯 Javascript 的图表库。
//参数配置 - 如果不熟悉请参考官网 - 此处以重庆地图为例
var options = {
"title" : {
"text": "重庆地图",
"x":"center"
},
"tooltip" : {
"trigger": "item",
"enterable":true
},
"dataRange": {
"min": 0,
"max" : 50,
"precision":0,
"text":["高","低"], // 文本,默认为数值文本
"calculable" : false,
"x": "left",
"color":["#FFA500","#93AE46","#27B78C","#93DBC5","#CCCCCC"]
},
"toolbox": {
"show" : true,
"orient" : "vertical",
"x": "right",
"y": "center",
"feature" : {
"mark" : {"show": true},
"dataView" : {"show": true, "readOnly": false},
"restore" : {"show": true},
"saveAsImage" : {"show": true}
}
},
"series" : [
{
"name": "重庆",
"type": "map",
"mapType": "重庆",
"roam": false,
"itemStyle":{
"normal":{
"label":{"show":true},
"areaStyle":{
"color":"#CCCCCC"
},
"borderColor":"#FFF"
},
"emphasis":{
"label":{"show":true},
"areaStyle":{
"color":"#2D8CD1"
}
}
},
"data":[]
}]
}

讲解使用版本:2.x。

合适人群:相对Echarts有所了解、以及对地图数据合并有所疑惑的朋友。

1.Echarts基础地图实现

 

这里大家不难发现,中间几个区域文字重合,不够理想化.

2.解决方式-合并区域

由于重合显示不友好,建议吧重合区域合并提出。根据源码可以看出只要将其他区域的coordinate和encodeOffsets合并到一个即可。

//将巴南区、江北区、渝北区、璧山区、北碚区、九龙坡区、沙坪坝区、大渡口区、南岸区、渝中区
//等区域的coordinates和encodeOffsets放在统一的模块就能被当作是一个区域,然后删除原模块数据
{
'type': 'Feature',
'id': '500103',
'properties': {
'name': '主城区',//自定义名称
'cp': [
106.574269,29.571625
],
'childNum': 10
},
'geometry': {
'type': 'Polygon',
'coordinates': [
'@@nxnVlJlUXLu0083¦@x@Vl@nKVVX@V_V@@KlVXUu0084@lKlxXIl@ÈĊ@Vl@n_VJlu008Enu0090Vlnbu0084²VVVJVu0081VmUUkĕUamçUu008F@»W@@ĉnu0099V@XwVU@UUJWUXUW@UKm@UVUIVaUu0099UVmLUVu0083UUu0084UWWXUakVmUkbW@UVku0083UL@VW@kUWu0083u0081@mJUXVVUu0084@lmV@zklVVkLUl@¦u009BI',
'@@nLVU@wV@lVu0084@Xllu0084ÈKlU@Lu0084@@bVKnx@I@JVaV@u0084x@Il@@Un@laVVn@mu008Fku008DUIm`k@WXu0081Jmk¯mkxWIkxWJk_UmVUUKu0083@UUu0099@u0083u0084@l',
'@@@bVVXLu0082a@lnbWn@Lu0084@XVlK@VVLUVlbkLUKVVVL@Vu009AnXu0082VL@VV@UbVb@x@¦UxVb@bUJu0083L@Lu0084VVxlK@u0099nk@U@Wu0084UVLlKXVu0084@VblU@UUKVU@wn@VJVanLlkX@VaVKu0099¯@a@U@U@u0083VaUKu0084kUUu0083±maUkm@UUkbm@@Vk@@Ju0083wU@Ub@I@JmwUL@au0083@@KkVÇLku0083Wku0083@kUU@@xUVmKUnllUb',
'@@XzVlVVkbVL@JVĀXu008Eu0082¼Vu0084u0084u0084XbW`Xu009CWVÈu008Eu0084u0084VVu009Au008EVkV@@UXa@alK@Iu0083u0083U@UKWu0081UyUI@wVUUWVak@VUku0083W¹@WXI@yVIUK@kWwkѯ±W@u0099kUb@KkVVVmXu0083J',
'@@Xu0082VLV@u0084u0084@JkL@bWb@VU@UlÆu009CVyu0084a@nV@nn@KUu008F@IVJU_lJXu0090V@VlVIV`nIn°@bu0082lUbu009Au0084u0084KVI@aUaVw@¥@wUaVaU@@UUKWu0081u0099m@UUKUUVLlKkaVUUK@UkLWUu0083@@KXmma@ku0081bWKUU@aUamLnÞ@VWLk@@Wm@ULU@@Uu0099KUVWI',
'@@XKu0082L@Vu009A@XbV@lW@UV@@VXIV@Uu0099VKlL@Knu0090nJ@VV@VU@Iu0084@@mVUVWUUmL@V¯LUK@UV@UU@a@U@yU@WLUK@X@KUVmL@u0083@aXI@w@ammVk@WÛwm@UxVu0090u0081VVbVLUJVxVUu0084V@V@X@JUIVbm@@Vk@@VkL@lVLUJ@zWJ@X',
'@@Xºlu0084UVl@UbVXUV@xVJVzXJVUu009AL@VV@VKn@@Xl@XK@UmÝnKVbVakkVm@ku0084u0083UK@UmImu008F@LkKULVu009AU@WJ@UU@@VkXU@Wau0099@@Uu0081KWL',
'@@VVu0084JVL@bUVVnl`XIlwXJlw°nnlu0082IXW@UÇĉk@WJkwkLu0083@WVkU@LU@U`W@UXUV@n',
'@@k@@U@wu0084¥WKkVkImUmwu0081a@b@xWJ@b@u0084nKVU@L@WVLXKV@@z@V@bVVU@@VVL°K@U',
'@@VLu009A@VVu0084@VL@aUKu0083IUUu0083@@JUVU@'
],
'encodeOffsets': [
[108990,30061],
[109013,30319],
[109013,30381],
[108585,30032],
[108855,30449],
[108799,30241],
[108799,30241],
[109092,30241],
[109080,30190],
[109036,30257]
]
}
}

合并后的图形

3.显示被合并区域

区域合并后,如果想要显示被合并区域则需要将其提出来这位单独模块。

//提取成单独的区域
{
'type': 'Feature',
'id': 'chong_qing_zcq_geo',
'properties': {
'name': '重庆主城区',
'cp': [
107.7539,
30.1904
],
'childNum': 40
},
'geometry': {
'type': 'Polygon',
'coordinates': ['@@əȂòɜƨu0098ѺɛƦȁ̐@ƪu0097õŏφƥòȃƥ̍Ƨôυ̏ƧôñóóôɛŏƩôƧƥôƧóυƨu009C̒ѹôu009CƦȃ@փƥɛ̑@@ɜƧó@ɚƧ@ñφσõ@ŎɝôƧu0097@ʵѷóƧʵóu0098@ŎóŐó@ôȁƥu009Bó̒υôóʶəu0098ƧȄς̎ƧȂôƨƨƨφɛ̎Őƨʷɞ@ςu052EóŌôôφ@ɜu0588̎ƨ'],
'encodeOffsets': [[
111150,
32446
]]
}
}
//为提取的区域添加数据链接指向
'重庆主城区': {
getGeoJson: function (callback) {
require(['./geoJson/chong_qing_zcq_geo'], function (md) {
callback(decode(md));
});
}
}
//为提取的区域添加地图数据
define('echarts/util/mapData/geoJson/chong_qing_zcq_geo', [], function () {
return {
'type': 'FeatureCollection',
'features': [
{
'type': 'Feature',
'id': '500113',
'properties': {
'name': '巴南区',
'cp': [
106.7322,
29.4214
],
'childNum': 1
},
'geometry': {
'type': 'Polygon',
'coordinates': [
'@@nxnVlJlUXLu0083¦@x@Vl@nKVVX@V_V@@KlVXUu0084@lKlxXIl@ÈĊ@Vl@n_VJlu008Enu0090Vlnbu0084²VVVJVu0081VmUUkĕUamçUu008F@»W@@ĉnu0099V@XwVU@UUJWUXUW@UKm@UVUIVaUu0099UVmLUVu0083UUu0084UWWXUakVmUkbW@UVku0083UL@VW@kUWu0083u0081@mJUXVVUu0084@lmV@zklVVkLUl@¦u009BI'
],
'encodeOffsets': [[
108990,
30061
]]
}
},
{
'type': 'Feature',
'id': '500105',
'properties': {
'name': '江北区',
'cp': [
106.8311,
29.6191
],
'childNum': 1
},
'geometry': {
'type': 'Polygon',
'coordinates': ['@@nLVU@wV@lVu0084@Xllu0084ÈKlU@Lu0084@@bVKnx@I@JVaV@u0084x@Il@@Un@laVVn@mu008Fku008DUIm`k@WXu0081Jmk¯mkxWIkxWJk_UmVUUKu0083@UUu0099@u0083u0084@l'],
'encodeOffsets': [[
109013,
30319
]]
}
},
{
'type': 'Feature',
'id': '500112',
'properties': {
'name': '渝北区',
'cp': [
106.7212,
29.8499
],
'childNum': 1
},
'geometry': {
'type': 'Polygon',
'coordinates': ['@@@bVVXLu0082a@lnbWn@Lu0084@XVlK@VVLUVlbkLUKVVVL@Vu009AnXu0082VL@VV@UbVb@x@¦UxVb@bUJu0083L@Lu0084VVxlK@u0099nk@U@Wu0084UVLlKXVu0084@VblU@UUKVU@wn@VJVanLlkX@VaVKu0099¯@a@U@U@u0083VaUKu0084kUUu0083±maUkm@UUkbm@@Vk@@Ju0083wU@Ub@I@JmwUL@au0083@@KkVÇLku0083Wku0083@kUU@@xUVmKUnllUb'],
'encodeOffsets': [[
109013,
30381
]]
}
},{
'type': 'Feature',
'id': '500227',
'properties': {
'name': '璧山区',
'cp': [
106.2048,
29.5807
],
'childNum': 1
},
'geometry': {
'type': 'Polygon',
'coordinates': ['@@XzVlVVkbVL@JVĀXu008Eu0082¼Vu0084u0084u0084XbW`Xu009CWVÈu008Eu0084u0084VVu009Au008EVkV@@UXa@alK@Iu0083u0083U@UKWu0081UyUI@wVUUWVak@VUku0083W¹@WXI@yVIUK@kWwkѯ±W@u0099kUb@KkVVVmXu0083J'],
'encodeOffsets': [[
108585,
30032
]]
}
},{
'type': 'Feature',
'id': '500109',
'properties': {
'name': '北碚区',
'cp': [
106.5674,
29.8883
],
'childNum': 1
},
'geometry': {
'type': 'Polygon',
'coordinates': ['@@Xu0082VLV@u0084u0084@JkL@bWb@VU@UlÆu009CVyu0084a@nV@nn@KUu008F@IVJU_lJXu0090V@VlVIV`nIn°@bu0082lUbu009Au0084u0084KVI@aUaVw@¥@wUaVaU@@UUKWu0081u0099m@UUKUUVLlKkaVUUK@UkLWUu0083@@KXmma@ku0081bWKUU@aUamLnÞ@VWLk@@Wm@ULU@@Uu0099KUVWI'],
'encodeOffsets': [[
108855,
30449
]]
}
},{
'type': 'Feature',
'id': '500107',
'properties': {
'name': '九龙坡区',
'cp': [
106.3586,
29.4049
],
'childNum': 1
},
'geometry': {
'type': 'Polygon',
'coordinates': ['@@XKu0082L@Vu009A@XbV@lW@UV@@VXIV@Uu0099VKlL@Knu0090nJ@VV@VU@Iu0084@@mVUVWUUmL@V¯LUK@UV@UU@a@U@yU@WLUK@X@KUVmL@u0083@aXI@w@ammVk@WÛwm@UxVu0090u0081VVbVLUJVxVUu0084V@V@X@JUIVbm@@Vk@@VkL@lVLUJ@zWJ@X'],
'encodeOffsets': [[
108799,
30241
]]
}
},{
'type': 'Feature',
'id': '500106',
'properties': {
'name': '沙坪坝区',
'cp': [
106.3696,
29.6191
],
'childNum': 1
},
'geometry': {
'type': 'Polygon',
'coordinates': ['@@Xºlu0084UVl@UbVXUV@xVJVzXJVUu009AL@VV@VKn@@Xl@XK@UmÝnKVbVakkVm@ku0084u0083UK@UmImu008F@LkKULVu009AU@WJ@UU@@VkXU@Wau0099@@Uu0081KWL'],
'encodeOffsets': [[
108799,
30241
]]
}
},
{
'type': 'Feature',
'id': '500108',
'properties': {
'name': '南岸区',
'cp': [
106.6663,
29.5367
],
'childNum': 1
},
'geometry': {
'type': 'Polygon',
'coordinates': ['@@VVu0084JVL@bUVVnl`XIlwXJlw°nnlu0082IXW@UÇĉk@WJkwkLu0083@WVkU@LU@U`W@UXUV@n'],
'encodeOffsets': [[
109092,
30241
]]
}
},{
'type': 'Feature',
'id': '500104',
'properties': {
'name': '大渡口区',
'cp': [
106.4905,
29.4214
],
'childNum': 1
},
'geometry': {
'type': 'Polygon',
'coordinates': ['@@k@@U@wu0084¥WKkVkImUmwu0081a@b@xWJ@b@u0084nKVU@L@WVLXKV@@z@V@bVVU@@VVL°K@U'],
'encodeOffsets': [[
109080,
30190
]]
}
},{
'type': 'Feature',
'id': '500103',
'properties': {
'name': '渝中区',
'cp': [
106.5344,
29.5477
],
'childNum': 1
},
'geometry': {
'type': 'Polygon',
'coordinates': ['@@VLu009A@VVu0084@VL@aUKu0083IUUu0083@@JUVU@'],
'encodeOffsets': [[
109036,
30257
]]
}
}
],
'UTF8Encoding': true
}
});

通过上面方式后,你只需要修改series.mapType = '重庆主城区'(你自定义名称),就能显示提取的区域了,此时就完成了。

4.关于其他问题

有些朋友可能对上面的地理位置编码很好奇,其实解码出来就是Array[{x,y},{x,y},...],下面是我根据源码查找的编码解码方法。

//从Echarts提取的编码解码方法
function decodePolygon(coordinate, encodeOffsets) {
var result = [];
var prevX = encodeOffsets[0];
var prevY = encodeOffsets[1]; for (var i = 0; i < coordinate.length; i+=2) {
var x = coordinate.charCodeAt(i) - 64;
var y = coordinate.charCodeAt(i+1) - 64;
// ZigZag decoding
x = (x >> 1) ^ (-(x & 1));
y = (y >> 1) ^ (-(y & 1));
// Delta deocding
x += prevX;
y += prevY; prevX = x;
prevY = y;
// Dequantize
result.push([x / 1024, y / 1024]);
} return result;
} function encodePolygon(coordinate, encodeOffsets) {
var result = ''; var prevX = quantize(coordinate[0][0]);
var prevY = quantize(coordinate[0][1]);
encodeOffsets[0] = prevX;
encodeOffsets[1] = prevY; for (var i = 0; i < coordinate.length; i++) {
var point = coordinate[i];
result+=encode(point[0], prevX);
result+=encode(point[1], prevY); prevX = quantize(point[0]);
prevY = quantize(point[1]);
} return result;
} function encode(val, prev){
val = quantize(val);
val = val - prev; if (((val << 1) ^ (val >> 15)) + 64 === 8232) {
val--;
}
val = (val << 1) ^ (val >> 15);
return String.fromCharCode(val+64);
} function quantize(val) {
return Math.ceil(val * 1024);
}
//测试写的编码方法
function testEncode(json){
var feature = json;
var coordinates = feature.geometry.coordinates;
var encodeOffsets = feature.geometry.encodeOffsets; for (var c = 0; c < coordinates.length; c++) {
var coordinate = coordinates[c]; if (feature.geometry.type === 'Polygon') {
coordinates[c] = encodePolygon(
coordinate,
encodeOffsets[c]
);
} else if (feature.geometry.type === 'MultiPolygon') {
for (var c2 = 0; c2 < coordinate.length; c2++) {
var polygon = coordinate[c2];
coordinate[c2] = encodePolygon(
polygon,
encodeOffsets[c][c2]
);
}
}
}
return json;
}

Echarts地图合并提取的更多相关文章

  1. 工作中遇到的有关echarts地图和百度地图的问题

    工作中遇到的有关echarts地图和百度地图的问题 *** 前言:在做项目中需要制作一个场景是左边是柱状图,右边是地图,地图上悬浮一个按钮可以切换echarts地图和百度地图.*** 功能: 在点击左 ...

  2. Echarts 地图添加自定义区域

    使用 Echarts 生成地图时,如果需要添加一些自定义区域,该怎么做呢?请看下面示例. 生成原始地图 index.hmtl 引入 Jquery 和 Echart <!DOCTYPE html& ...

  3. Echarts 地图上显示数值

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

  4. echarts地图扩展文件使用geoJson格式。

    echarts地图扩展文件使用geoJson格式. 1.在线生成 http://ecomfe.github.io/echarts-map-tool/  这里可以生成省市区的json,但是最多生成到”区 ...

  5. react使用echarts地图实现中国地图大区展示

    日常项目中经常会用到百度地图或者echarts图标展示,今天给大家展示的是如何在react开发项目中使用百度echars的地图展示,把中国地图分为东北大区.华东大区.华南大区.华西大区.华中大区以及华 ...

  6. Echarts 地图(map)插件之 鼠标HOVER和tooltip自定义数据

    在项目开发中,有需要用到地图的地方,百度的echarts地图插件就是个不错的选择, 这里总结一下地图自定义鼠标HOVER时的事件和自定义tooltip数据: 一.鼠标HOVER时的事件: 参照官方文档 ...

  7. echarts 地图 动态 展示 结合css+js

    echarts地图展示功能非常强大,官网上静态展示的样例非常多了,动态的资料少.研究了下.我眼下实现的通过ajax从server获取数据动态展示地图. 另外,我们有时候希望在地图之上做些自己定义的东西 ...

  8. echarts地图边界数据的实时获取与应用,省市区县多级联动【附最新geoJson文件下载】

    首先,来看下效果图 在线体验地址:https://hxkj.vip/demo/echartsMap/,并提供实时geoJson数据文件下载 echarts官方社区链接地址(可在线编辑):https:/ ...

  9. 本周学习总结(原生+Echarts地图)

    本周主要想完成工作中大屏地图相关的知识,所以学习的时间不是很长 dsa.js(数据结构) 拖了两个星期还没看,等啥时候继续研究算法和数据结构再看源码 GoJS 有时间要好好研究下 https://gi ...

随机推荐

  1. 第5/7Beta冲刺

    1.团队成员 成员姓名 成员学号 秦裕航 201731062432(组长) 刘东 201731062227 张旭 201731062129 王伟 201731062214 2.SCRU部分 2.1各成 ...

  2. 【面试】IP数据报格式分析

    (除选项外的报头区总共20个字节) 1)版本:IPV4/IPV6 2)头长度:报头区长度,用于计算数据区的开始位置,比如头长度为6,代表报头区长度为6*4个字节,头长度的单位为4字节,所以报头区长度不 ...

  3. Python中的int函数

    python帮组文档 class int(x, base=10) Return an integer object constructed from a number or string x, or ...

  4. Modelsim——do脚本、bat命令

    一.do脚本实现自动化仿真 Modelsim是支持命令的,我们可以用 .do 文件将这些命令先写好然后在Modelsim上调用.因为我的编辑器不支持.do的语法,所以这里改用 .tcl文件,它和 .d ...

  5. (父向子传值)组件内的properties类似与vue中的prop接收外界传递进来的参数

    =================================================== 外界引用组件的时候 传递方法  父传子

  6. go 学习笔记(4) --变量与常量

    “_”   可以理解成一个垃圾桶,我们把值赋给“_”  ,相当于把值丢进垃圾桶,在接下来的程序中运行中不需要这个下划线这个值 a,b :=1,2 只能用在函数体内 package main impor ...

  7. java之hibernate之配置讲解

    1.映射文件:User.hbm.xml <!-- package 指向class中所有类的包名,可以直接在指定类名时同时指定包名 --> <hibernate-mapping pac ...

  8. ASP.Net Core 2.1+ Cookie 登录授权验证【简单Cookie验证】

    介绍 本文章发布于博客园:https://www.cnblogs.com/fallstar/p/11310749.html 作者:fallstar 本文章适用于:ASP.NET Core 2.1 + ...

  9. 普通element ui table组件的使用

    1.使用基础的element ui 的table的基础使用 首先,使用前要先引用element库到项目中,可以直接引入element的js和css或者在vue项目下按需加载不同的组件 废话不多说,直接 ...

  10. 传统IDC 部署网站

    选择IDC机房 1.选择云主机. 2.传统IDC a购买服务器 b服务器托管 c装系统 装系统 虚拟机软件 vmware workstation virtualbox hyper-v 下载:r.ami ...