气象相关图表制作-字体图标、图片、折线的堆叠

开发工作中有个需要展示气温(折线)、天气(图片)、风羽(字体图标)的图表展示需求,之前用过highcharts的关于类似的chart,里面的风雨用的是自带的图片,但是现在要求风羽需要用字体图标渲染,于是我选择了比较熟悉的Echarts制作这个图表。

难点

  1. 风羽(字体图标)不仅需要显示,还需要旋转,但是旋转的时,风羽会偏移
  2. 各类元素之间需要分层显示

代码

/**
* SouthAsiaViewHighImpactWeatherSingleAirportChart.vue 逐3小时天气预报图
* @Author ZhangJun
* @Date  2024/6/19 10:18
**/
<template><div class="w-full h-full"></div>
</template>
<script>
import * as echarts from 'echarts';
import CanvasGridUtils from "@/utils/leaflet/CanvasGridUtils";
import moment from "moment/moment";export default {name: 'SouthAsiaViewHighImpactWeatherSingleAirportChart',data() {return {chartOption: {grid: {left: '5%',right: '5%',bottom: '3%',top: '5px',containLabel: true},tooltip: {trigger: 'axis',backgroundColor: 'rgba(0, 38, 72, 0.9)',borderColor: 'rgba(141, 180, 255, 0.31)',borderWidth: 2,formatter: (params) => {let [temperatureParams, weatherParams, windParams, levelParams] = params;let date = moment(temperatureParams?.name, 'YYYYMMDDHHmm').format('YYYY-MM-DD HH:mm');//温度值let temperatureValue = `${temperatureParams?.value}`;let temperatureMarker = temperatureParams?.marker;//天气let weatherValue = weatherParams?.value?.[2];let weatherMarker = weatherParams?.data.symbol;//风向/风力let windMarker = CanvasGridUtils.GetWindChar(windParams?.value?.[1]);let rotate = windParams?.data.label.rotate;let levelValue = `${levelParams?.value?.[1]}`;return [`<div style="font-size: 14px; color: #FFFFFF;font-weight: bold;">${date}</div>`,`<div style="display: flex; justify-content: space-between; align-items: center;"><div style="padding: 0 10px;">${temperatureMarker}</div><div style="font-size: 12px; color: #FFFFFF;">${temperatureValue}</div></div>`,`<div style="display: flex; justify-content: space-between; align-items: center;"><img src="${weatherMarker.replace('image://', '')}" alt="${weatherValue}" style="width: 30px; height: 30px;"><div  style="font-size: 12px; color: #FFFFFF;">${weatherValue}</div></div>`,`<div style="display: flex; justify-content: space-between; align-items: center;"><div style="transform: rotate(${rotate}deg);font-size: 30px;font-weight: bold;color: #FFFFFF;">${windMarker}</div><div style="font-size: 12px; color: #FFFFFF;">${levelValue}</div></div>`].join('');}},xAxis: {type: 'category',boundaryGap: false,axisLine: {show: false},axisTick: {show: false},splitLine: {show: false},axisLabel: {fontFamily: 'D-DIN,SAN-SERIF',fontSize: '12px',fontWeight: 'normal',color: '#FFFFFF',formatter: (value) => {return value ? moment(value, 'YYYYMMDDHHmm').format('HH:mm') : '';},},//日期数据data: ['202406280000', '202406280300', '202406280600', '202406280900', '202406281200', '202406281500', '202406281800', '202406282100']},yAxis: [{type: 'value',axisLine: {show: false},axisTick: {show: false},axisLabel: {show: false},splitLine: {show: false},min: -120,max: 60,},{type: 'value',axisLine: {show: false},axisTick: {show: false},axisLabel: {show: false},splitLine: {show: false},min: 0,max: 100,}],series: [{name: '温度',type: 'line',yAxisIndex: 0,label: {show: true,color: '#fff',align: 'center',formatter: '{c}℃'},lineStyle: {color: '#FFBC1E'},labelLayout(params) {return {x: params.rect.x - params.rect.width,y: params.rect.y < params.rect.height * 2 ? params.rect.y + params.rect.height * 3 : params.rect.y - params.rect.height,verticalAlign: 'middle',align: 'left'}},data: [-10, -12, 11, 13, 60, 23, 21, 11]},//天气{name: 'weather',type: 'pictorialBar',yAxisIndex: 1,symbolSize: 30,symbolOffset: [0, -65],label: {show: true,fontSize: 12,color: '#fff',offset: [0, -10],formatter: ({value}) => {return value?.[2];},},data: [{value: ['202406280000', 0, '晴'],symbol: `image://${require('@/assets/images/weather/晴.png')}`,},{value: ['202406280300', 0, '晴'],symbol: `image://${require('@/assets/images/weather/晴.png')}`,},{value: ['202406280600', 0, '多云'],symbol: `image://${require('@/assets/images/weather/多云.png')}`,},{value: ['202406280900', 0, '晴'],symbol: `image://${require('@/assets/images/weather/晴.png')}`,},{value: ['202406281200', 0, '晴'],symbol: `image://${require('@/assets/images/weather/晴.png')}`,},{value: ['202406281500', 0, '阵雨'],symbol: `image://${require('@/assets/images/weather/阵雨.png')}`,},{value: ['202406281800', 0, '阴'],symbol: `image://${require('@/assets/images/weather/阴.png')}`,},{value: ['202406282100', 0, '晴'],symbol: `image://${require('@/assets/images/weather/晴.png')}`,},]},//绘制风羽{name: 'winBarb',type: 'pictorialBar',yAxisIndex: 1,symbolSize: [0, 65],label: {show: true,fontFamily: 'iconfont',fontSize: 30,fontWeight: 'bold',color: '#fff',formatter: ({value}) => {return CanvasGridUtils.GetWindChar(value?.[1]);},},data: [{value: ['202406280000', 10],label: {rotate: 180,},}, {value: ['202406280300', 10],label: {rotate: 0,},}, {value: ['202406280600', 10],label: {rotate: 90,},}, {value: ['202406280900', 10],label: {rotate: 200,},}, {value: ['202406281200', 10],label: {rotate: 180,},}, {value: ['202406281500', 10],label: {rotate: 180,},}, {value: ['202406281800', 10],label: {rotate: 180,},}, {value: ['202406282100', 10],label: {rotate: 180,},}]},// 绘制风力等级图标{name: 'winLevel',type: 'pictorialBar',yAxisIndex: 1,symbolSize: [0, 20],label: {show: true,fontSize: 12,fontFamily: 'MiSans, sans-serif',color: '#fff',align: 'center',formatter: ({value}) => {let level = value?.[1];return `${level}`;},},data: [['202406280000', 3],['202406280300', 3],['202406280600', 4],['202406280900', 5],['202406281200', 4],['202406281500', 3],['202406281800', 4],['202406282100', 3],]}]}}},methods: {/*** 初始化图表*/initChart() {echarts.init(this.$el).setOption(this.chartOption);},},mounted() {this.$nextTick(() => {this.initChart();});}
}
</script>

效果

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Windows环境本地部署开源在线演示文稿应用PPTist并实现远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Linux双网卡默认路由的metric设置不正确,导致SSH连接失败问题定位

测试环境 VMware虚拟机 RockyLinux 9 x86_64 双网卡&#xff1a;eth0(访问外网): 10.206.216.92/24; eth1(访问内网) 192.168.1.4/24 问题描述 虚拟机重启后&#xff0c;SSH连接失败&#xff0c;提示"Connection time out"&#xff0c;重启之前SSH连接还是正常的…

基于Spring Boot医护人员排班系统

设计技术&#xff1a; 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatisvue 工具&#xff1a;IDEA、Maven、Navicat 主要功能&#xff1a; 医护类型管理 医护人员排班系统的系统管理员可以对医护类型添加修改删除以及查询操作。具体界面…

SS8870T-3.6A 扫地机和滚刷电机的大电流电机驱动

扫地机器人已经成为现代家庭清洁的必备工具&#xff0c;而其中的关键部件——电机&#xff0c;对于其性能和用户体验起着至关重要的作用。为了确保扫地机器人的高效清洁和稳定运行&#xff0c;至少需要使用7个直流电机&#xff0c;包括行走轮、滚轮、边刷和吸尘等功能的驱动。 …

Python接口测试课程,每天学会一个Python小知识!

第一天: Python基础 Python简介、环境搭建及包管理 Python简介&#xff1a; 特点&#xff1a;Python是一门动态、解释型、强类型语言 动态&#xff1a;在运行期间才做数据检查&#xff08;不用提前声明变量&#xff09;- 静态语音(C/Java)&#xff1a;编译时检查数据类型&…

根据指定日期自定义el-date-picker日期选择器样式

需求 功能需要在DatePicker日期选择器中&#xff0c;对有数据的日期下方添加小圆点提示样式&#xff0c;后台会返回按年份查询的日期数据 dayjs插件 dayjs中文网&#xff1a;https://dayjs.fenxianglu.cn/ npm install dayjs实现点 配置picker-options对象中的cellClassName属性…

django 逆向生成对应数据库表的models模型类 —— python

一&#xff0c;在setting.py中配置好连接数据库的参数 在setting中的DATABASESZ中配置默认参数&#xff0c;并在INSTALLED_APPS中导入模块名。 DATABASES {default:{ENGINE: django.db.backends.mysql, # 数据库引擎NAME: jljupcs, # 数据库名称HOST: 127.0.0.1, # 数据库…

检索增强生成RAG系列1--RAG的实现

大模型出现涌现能力之后&#xff0c;针对大模型的应用也如雨后春笋般。但是&#xff0c;在大模型真正落地之前&#xff0c;其实还需要做好最后一公里&#xff0c;而这个最后一公里&#xff0c;其中不同应用有着不同的方法。其中prompt、微调和RAG都是其中方法之一。本系列就是针…

简单的同步压缩变换脊线检测(PythonMATLAB)

由于 Heisenberg 测不准原理&#xff0c;线性时频变换方法无法同时在时间和频率方向达到最佳的时频分布&#xff0c;窗函数和小波函数的选择也降低了各方法的自适应性。同样&#xff0c;二次型变换方法难以在去除交叉干扰项的同时保证较高的能量集中度。为了解决该问题&#xf…

MySQL的安装与配置

MySQL提供安装包和压缩包两种安装方式&#xff0c;安装包是以.msi作为后缀名的二进制分发文件&#xff0c;压缩包是以.zip为后缀的压缩文件。安装包的安装只要双击安装文件&#xff0c;然后按照提示一步步安装就可以了&#xff0c;属于“傻瓜”式安装&#xff1b;压缩包的安装需…

基于SpringBoot校园一卡通系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; Java精品实战案例《600套》 2023-2025年最值得选择的Java毕业设计选题大全&#xff1…

World of Warcraft [CLASSIC] Level 70 Riding Skill

World of Warcraft http://account.battlenet.com.cn-CSDN博客 World of Warcraft [CLASSIC] Level 70 Riding Skill 魔兽世界【怀旧】70级骑术 部落如何学习70级骑术&#xff0c;如何区影月谷&#xff0c;影月村&#xff0c;怀旧一下 荆棘谷 暮色森林 逆风小径 悲伤沼泽 诅…

变工况下转子、轴承数据采集及测试

1.固定工况下的数据采集 1.wireshark抓包 通过使用 Wireshark 抓包和 Linux 端口重放技术&#xff0c;可以模拟实际机械设备的运行环境&#xff0c;从而减少实地验证软件和算法的复杂性和麻烦。 打开设备正常运转&#xff0c;当采集器通过网口将数据发送到电脑时&#xff0c…

ubuntu 编译交叉环境arm 版本的openssl库

一&#xff0c;下载源码 [ Old Releases ] - /source/old/index.html 二&#xff0c;设置交叉编译环境 我的交叉环境是RV1126开发板&#xff0c;/home/rpdzkj/development/cross-compile-tools/rv1126/ 对应的是我电脑里的RV1126开发板的交叉环境下的gc g等路径存放 设置环境…

5. zabbix分布式监控

zabbix分布式监控 一、zabbix分布式监控二、zabbix分布式监控部署1、环境描述2、zabbix proxy的部署2.1 安装zabbix proxy相关的软件2.2 创建proxy需要的库、导入表2.3 编辑zabbix proxy配置文件&#xff0c;指定数据库连接2.4 启动zabbix proxy 3、在zabbix server添加代理4、…

数据结构与算法基础(王卓)--学习笔记

1 数据结构分类 1.1 逻辑结构分类 集合结构线性结构&#xff1a;线性表、栈、队列、串树形结构图形结构 1.2 物理结构分类 逻辑结构在计算机中的真正表示方式&#xff08;又称为映射&#xff09;称为物理结构&#xff0c;也可叫做存储结构 顺序存储结构&#xff1a;数组链…

高德地图获取key值步骤

1、创建新应用 进入控制台&#xff08;https://lbs.amap.com/dev/&#xff09;&#xff0c;创建一个新应用。 如果您之前已经创建过应用&#xff0c;可直接跳过这个步骤。 2、添加新Key 在创建的应用上分别填写key名称、选择服务平台、SHA1、以及PackageName SHA1:是在安卓…

【项目实训】解决前后端跨域问题

由于前端框架使用vue&#xff0c;后端使用flask&#xff0c;因此需要解决前后端通信问题 在vue.config.js中修改 module.exports defineConfig({transpileDependencies: true,lintOnSave:false, }) // 跨域配置 module.exports {devServer: { //记住&#x…

Omniverse 下载 isaac sim过慢的解决办法

比如在上海地区&#xff0c;下载isaac只有 200kb/s&#xff0c;这8个G下载要很长时间 对于着急的小伙伴&#xff0c;可以直接去日志里拿下载链接&#xff0c;在Omniverse里点右上角小人&#xff0c;点开里面SETTINGS&#xff0c;如图 点击&#xff0c;LOGS LOCATION&#xff0c…

海外仓一件代发效率提升方案:拣货区规划策略

作为海外仓的核心业务&#xff0c;一件代发处理的效率和准确性&#xff0c;可以说直接影响了海外仓的经济效益。今天我们就会针对大家都比较头疼的一件代发效率问题&#xff0c;给大家分享一些实用建议。 提升一件代发效率要考虑的3个关键要素 对以一件代发为主要业务的海外仓…