echarts学习:绘制地图

前言

经过之前一段时间的磨砺,我具备了基本的使用echarts绘制图表的能力。但是在最近这几个月里我接连遇到了几个棘手的任务,这大大的提升了我的echarts水平。其中我遇到的第一个高难度任务就是使用echarts绘制如下的地图:

简单的分析一下,这张图中我主要有几个任务点:

  1. 最重要的就是,要在地图上展示降雨区,这些降雨区的颜色要根据真实的数据渲染
  2. 要有一个图例
  3. 添加降雨区图层下的地图(可选任务,完成可以增加地图的真实性)

一、如何使用echarts绘制一张地图

想要使用echarts绘制地图,你必需要了解三个内容:registerMapseries-mapgeo。其中registerMap是用来注册地图的方法,series-map则用于创建地图类型的chart,geo(地理坐标系组件)则主要是用于进行地图的可视化设置的。

1.使用 registerMap 注册地图

想要绘制地图就必须使用地理空间数据,在echarts中我们可以使用echarts.registerMap方法将地理空间数据引入echarts中。当然echarts毕竟不是专业的地图库,因此它只能接受GeoJSON类型的地理数据或者是一张SVG图。

我是有降雨区的的坐标数据的,因此这里我的思路就是,先将地理坐标数据转换为GeoJSON,再将GeoJOSN注册为地图。

转换GeoJSON

这里我就直接使用turf.js中的polygonfeatureCollection方法进行了转换,同时还将降雨区的名称作为了polygon的属性数据。

const geoJson = featureCollection(geo.map(el =>polygon([el.coordinate], { name: el.name}))
);

注意:这里给polygon中添加名称很关键,有了名称后续才可以在地图上展示区域的名称,还有更重要的,方便之后作为主键用于关联数据和 GeoJSON 地理要素。

注册地图

echarts.registerMap("beijiang", {geoJson,
});

2.使用 series-map 和 geo 组件创建地图

这里我需要着重谈一个问题:series-mapgeo组件有什么联系和区别,一开始的时候我对这两者是傻傻分不清的。其实仔细观察就会发现,geo组件中的配置属性series-map中都有,但series-map可以给地图添加属性数据,geo组件则不能。所以其实可以理解为geoseries-map的“子集”。实际上在默认情况下series-map 会自己生成内部专用的 geo 组件。但是也可以用这个 geoIndex 指定一个 geo 组件。这样的话,map 和 其他 series(例如散点图)就可以共享一个 geo 组件了。

而我目前是没有共享geo组件的需求的,因此我就只需要使用series-map就行了,不用再专门搞一个geo组件了。那么此时我的配置项如下:

{series: [{type: "map",// 使用registerMap注册的地图名称map: "beijiang",// 每个降雨区对应的属性数据data: geo.map(item => ({name: item.name,value: item.value,})),top: "2%",left: "19%",itemStyle: {borderColor: "rgb(255,255,255,0.3)",borderWidth: 3,},label: {show: false,fontSize: 10,},aspectScale: 1,},],
}

这些配置当中最重要的是mapdatamap用于指定我使用哪个地图(实现通过registerMap注册的),data则用于引入地图的属性数据(在我这里就是降雨区的降雨量数据)。至于其它的配置项则就是用来配置布局和样式的这里就不详细介绍了。

二、如何让地图上的降雨区根据传入的数据进行颜色映射

目前还有一个最重要的任务没有实现,就是让每个降雨区根据不同的降雨量渲染不同的颜色,这个就需要用到视觉映射组件visualMap

1.如何使用visualMap组件

使用visualMap组件只需要回答好几个问题就行了。

对哪个系列使用数据映射?

通过seriesIndex选项设置对哪个系列进行映射

使用哪些数据进行映射?

数据映射使用的是系列中的series.data中的数据,但其中的数据可能会有多个维度,可以使用dimension选项设置使用哪个维度的数据

使用哪种类型的视觉映射组件?

virualMap组件分为连续型(visualMapContinuous)与分段型(visualMapPiecewise)。

连续型的意思是,进行视觉映射的数据维度是连续的数值;而分段型则是数据被分成了多段或者是离散型的数据。

连续型的是这样:

分段型的则是这样:

分段型的视觉映射组件又可以分为三种模式:

映射哪些视觉元素?如何设置映射规则?

数据映射的目标就是视觉元素,echarts中可以映射的视觉元素有:

主要通过inRangeoutOfRange设置视觉元素及其映射规则,详情请见相关文档:

visualMap-continuous.inRange

2.实现我的visualMap

根据上面总结的使用方法,我来实现自己的视觉映射。

第一步 对哪个系列使用数据映射?

我这边只有一个系列,因此不用专门设置。

第二步 使用哪些数据进行映射?

我的数据只有namevalue两个维度,因此也不用专门设置。

第三步 使用哪种类型的视觉映射组件?

查看一下示例,我需要实现这样的视觉映射:

因此我需要使用的是分段型视觉映射组件,并且要使用自定义分段模式

所以type就为'piecewise',并在pieces中定义每块的范围。

{visualMap:{type:"continuous",pieces:[...]}
}

映射哪些视觉元素?如何设置映射规则?

我需要映射的视觉元素就只有颜色,但是设置的方式就比较特殊了。对于分段型视觉映射组件的自定义分段模式来说,是直接在pieces中色孩子映射规则和视觉元素,不需要使用inRangeoutOfRange。详情请见官方配置项文档:visualMap-piecewise.pieces

{visualMap:{type:"continuous",pieces:[{ gte: 0, lte: 10, color: "#A6F28E" },{ gt: 10, lte: 25, color: "#258C30" },{ gt: 25, lte: 50, color: "#61B8FF" },{ gt: 50, lte: 100, color: "#0000E1" },{ gt: 100, lte: 250, color: "#FA00FA" },{ gt: 250, lte: 400, color: "#880015" },{ gt: 400, lte: 600, color: "#FFAA01" },{ gt: 600, lte: 1000, color: "#FF6600" },{ gt: 1000, lte: 1500, color: "#E60000" },{ gt: 1500, color: "#990100" },]}
}

最后在添加一些其它的设置,最终的效果如下:

{visualMap:{type: "piecewise",pieces: [{ gte: 0, lte: 10, color: "#A6F28E" },{ gt: 10, lte: 25, color: "#258C30" },{ gt: 25, lte: 50, color: "#61B8FF" },{ gt: 50, lte: 100, color: "#0000E1" },{ gt: 100, lte: 250, color: "#FA00FA" },{ gt: 250, lte: 400, color: "#880015" },{ gt: 400, lte: 600, color: "#FFAA01" },{ gt: 600, lte: 1000, color: "#FF6600" },{ gt: 1000, lte: 1500, color: "#E60000" },{ gt: 1500, color: "#990100" },],align: "right",textGap: 9,itemGap: 9,right: 10,bottom: 10,padding: [25, 5, 5, 5],inverse: true,itemWidth: 20, // 减小宽度itemHeight: 10, // 减小高度textStyle: {fontSize: 10,},backgroundColor: "#fff",}
}

三、如何给地图添加背景地图

现在我已经完成了地图的主要功能,接下来我想尝试给地图添加底图。我已经事先准备好了一张底图的图片:

我的计划就是将这张底图图片设置为图表的背景图片。

1.失败的尝试

将底图图片设置为图表容器的背景

一开始我在网上搜到了这个方法,直接将图片设置为容器的背景图,这样做确实可以实现对应的效果:

但是后面我发现这个方法不适合我,因为我生成地图的目标是要将其下载为图片,我是使用echartsInstance. getDataURL下载的,这样下载的图片是无法保留容器的背景的。

将底图图片注册为地图插入图表

在经历了上面的失败后,我又想到了echarts.registerMap方法可以将svg图片注册为地图,那么我是不是可以将底图图片先转为svg格式,然后再用echarts.registerMap方法注册为地图,最后再通过series-map添加到图表中。

很可以这么尝试之后失败了,我在注册和使用的阶段总是会报错,我无法解决这些报错。

我猜测这可能与我的svg只是一张套皮的png图片有关:

2.使用graphic添加底图图片

之后我又查阅了一些资料,了解到echarts的graphic组件可以添加图片。实际上graphic非常强大它可以向图表中添加各种图形以及文本和图片。

于是我成功的添加了底图图片。

{graphic:[{type: "image", // 图形元素类型id: "basemap", // 更新或删除图形元素时指定更新哪个图形元素,如果不需要用可以忽略right: "center", // 根据父元素进行定位(居中)y: -50,scaleY: 1.2,scaleX: 1.0,z: 0, // 层叠bounding: "all", // 决定此图形元素在定位时,对自身的包围盒计算方式style: {image: "./PixPin_2024-07-04_17-39-26.png",width: 550,height: 410,},}]
}

四、给图例添加单位

目前整张地图已经基本完成了,但还有一个小小部分没有实现,那就是原型图中的图例的单位:

这个用visualMap是没办法实现的,我本来是准备使用title组件 来添加这行文本的,但是如今既然了解到了graphic那我就准备用graphic-text来做。

{graphic:[{type: "text",x: 470,y: 185,z: 5,style: {text: "降雨量(mm)",fontSize: 10,}}]
}

最终效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/400867.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android studio 引入Json文件

Xcode引入json文件非常简单,没想到Android Studio是有讲究的,必须指定位置。 跟 lib 同一级目录下 创建一个assets(如果不存在就创建) future: DefaultAssetBundle.of(context).loadString(assets/appcenter.json),针对我这个路…

使用Leaks定位iOS内存泄漏问题并解决

使用Leaks定位iOS内存泄漏问题并解决 前言 内存泄漏问题一直是程序开发中最令人头疼的问题,特别是C/C。虽然C/C在C11之后引入了许多新特性,包括智能指针,自动类型推导等,但C中动态内存的分配和释放仍然需要程序员来显式地进行。…

【网络协议】精讲TCP通信原理!

前言 TCP 把连接作为最基本的对象,每一条 TCP 连接都有两个端点,这种端点我们叫作套接字(socket),它的定义为端口号拼接到 IP 地址即构成了套接字,例如,若 IP 地址为 192.3.4.16 而端口号为 80&…

CSS设置文本超出显示省略号

一、单行文本显示省略号 <div class"box"><p>测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本…

C# 静态方法和实例方法

一、静态成员&#xff0c;实例成员&#xff0c;静态方法&#xff0c;实例方法 静态成员就是用static修饰的字段&#xff1b; 实例成员就是没有被static修饰的字段&#xff1b; 静态方法就是用static修饰的方法&#xff1b; 实例方法就是没有被static修饰的方法&#xff1b;…

无人机之如何避免飞行错误篇

在无人机飞行中&#xff0c;飞手可能会遇到各种问题&#xff0c;这些问题不仅会影响飞行效果&#xff0c;还可以带来安全隐患。以下是一些常见的错误及避免方法&#xff0c;帮助飞手提高飞行稳定性和安全性&#xff1a; 一、校准传感器 IMU&#xff08;惯性测量单位&#xff0…

HttpClient在ASP.NET Core中的最佳实践:实现高效的HTTP请求

引言 在现代Web开发中&#xff0c;HTTP请求的高效性和可靠性对于应用的整体性能至关重要。ASP.NET Core提供了HttpClient类&#xff0c;它是一个强大且灵活的工具&#xff0c;可以用来发送HTTP请求并处理响应。然而&#xff0c;如何在ASP.NET Core中实现高效的HTTP请求&#x…

【Linux】手把手教你从零上手Vim编辑器

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:Linux ⚙️操作环境:Xshell (操作系统:CentOS 7.9 64位) 目录 &#x1f4cc;写在前面 &#x1f4cc;Vim是什么 &#x1f4cc;手把手教你开始使用Vim &#x1f38f;使用Vim编辑第一个程序 &#x1f38f;Normal(命令模…

Ilya Sutskever 2023年伯克利大学演讲回顾:无监督学习与GPT的数学基础

引言 在2023年&#xff0c;OpenAI联合创始人之一的Ilya Sutskever在伯克利大学进行了一次极具影响力的演讲。这场演讲虽然内容复杂晦涩&#xff0c;但却被认为是人工智能发展历史上的一个重要里程碑。在演讲中&#xff0c;Sutskever深入探讨了无监督学习的数学依据&#xff0c…

CocoaPods 官宣进入维护模式,不在积极开发新功能,未来将是 Swift Package Manager 的时代

昨天 CocoaPods 官宣现在项目**处于维护模式 **&#xff0c;简单来说&#xff0c;就是 CocoaPods 不会再像以前一样积极投入资源进行开发&#xff0c;所谓维护模式&#xff0c;就是让项目处于「可用」的状态&#xff0c;而此时距离 CocoaPods 的出现&#xff0c;也过去了有 13 …

树莓派4 AV没有视频输出

使用AV接口输出&#xff0c;没有画面 需要在config.txt文件中 增加配置 enable_tvout1config.txt 中的 dtoverlayvc4-kms-v3d 行末尾添加,composite&#xff1a; dtoverlayvc4-kms-v3d,composite默认情况下&#xff0c;输出 NTSC 复合视频。要选择不同的模式&#xff0c;请在…

Bug定义及生命周期(七)

BUG 定义 软件的bug&#xff0c;软件程序的漏洞或缺陷 – 常见&#xff0c;首先发现 软件可改进的细节&#xff0c;或与需求文档存在差异的功能实现等 测试工程师&#xff1a;发现bug&#xff0c;定位bug&#xff0c;提交bug&#xff0c;回归bug 类型 确定bug类型&#xff…

【中国数据库前世今生】数据存储管理的起源与现代数据库发展启蒙

记录开启本篇的目的: 作为1名练习时长2年半的DBA&#xff0c;工作大部分时间都在和数据库打交道&#xff0c;包括Oracle,Mysql,Postgresql,Opengauss等国内外数据库。但是对数据库的发展史却知之甚少。 正好腾讯云开发者社区正在热播:【纪录片】中国数据库前世今生,借此机会了解…

【云备份】学习Json

文章目录 1.Json数据类型基础数据类型复合数据类型JSON数据类型的应用 2.学习jsoncpp库利用json实现序列化利用json实现反序列化 1.Json数据类型 json 是一种数据交换格式&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。json数据交换格式是将多种数据对象组织…

MATLAB中lsqr函数用法

目录 语法 说明 示例 线性系统的迭代解 使用指定了预条件子的 lsqr 提供初始估计值 使用函数句柄代替数值矩阵 lsqr函数的功能是求解线性系统 - 最小二乘法。 语法 x lsqr(A,b) x lsqr(A,b,tol) x lsqr(A,b,tol,maxit) x lsqr(A,b,tol,maxit,M) x lsqr(A,b,tol,m…

【Qt】QWidget的windowIcon属性

QWidget的windowIcon属性 windowIcon表示窗口的图标 当我们使用默认的windowIcon的时候&#xff0c;其窗口的图标如下&#xff1a; API说明 windowIcon() 获取到控件的窗⼝图标. 返回 QIcon 对象. setWindowIcon(const QIcon& icon) 设置控件的窗⼝图标. 在Qt中&…

【STM32 FreeRTOS】任务

使用 RTOS 的实时应用程序可以被构建为一组独立的任务。每个任务在自己的上下文中执行&#xff0c;不依赖于系统内的其他任务或 RTOS 调度器本身。在任何时间点&#xff0c;应用程序中只能执行一个任务&#xff0c;实时 RTOS 调度器负责决定所要执行的任务。因此&#xff0c; R…

react中使用nextjs框架,前端调后端接口跨域解决方式

前端在项目目录中next.config.js文件中添加以下代码 async rewrites() {return [{source: "/api/:path*",destination: ${process.env.NEXT_PUBLIC_API_DOMAIN}/api/:path*,basePath: false}]} 截图&#xff1a; source: "/api/:path*": 定义了一个 URL …

C++ 面试题常用总结 详解(满足c++ 岗位必备,不定时更新)

&#x1f4da; 本文主要总结了一些常见的C面试题&#xff0c;主要涉及到语法基础、STL标准库、内存相关、类相关和其他辅助技能&#xff0c;掌握这些内容&#xff0c;基本上就满足C的岗位技能&#xff08;红色标记为重点内容&#xff09;&#xff0c;欢迎大家前来学习指正&…

【MySQL 03】库的操作 (带思维导图)

文章目录 &#x1f308; 一、创建数据库&#x1f308; 二、查看数据库&#x1f308; 三、使用数据库&#x1f308; 四、修改数据库&#x1f308; 五、删除数据库&#x1f308; 六、备份数据库&#x1f308; 七、恢复数据库&#x1f308; 八、字符集和校验规则⭐ 1. 查看系统默认…