当前位置: 首页 > news >正文

D3实现站点路线图demo分享

分享一下通过D3实现的站点路线分布图,这是一个demo。效果图如下:

在这里插入图片描述

源码如下:
<template><div class="map-test" ref="d3Chart"><div class="tooltip" id="popup-element"><span>{{ text }}</span><i id="close-element" class="el-icon-close"></i></div><div class="mark" v-show="visible"></div></div>
</template><script>
import * as d3 from "d3";export default {name: "MapTest",components: {},data() {return {text: null,svgInstance: null, // d3元素实例popupInstance: null, // 弹窗实例visible: false,allData: [], // 全部点位数据allLineData: [], // 全部连线数据gsNamePointData: [], // 高速名称点位数据};},computed: {},methods: {createChart() {const width = window.innerWidth;const height = window.innerHeight;this.svgInstance = d3.select(this.$refs.d3Chart).append("svg").attr("width", width).attr("height", height).attr("viewBox", `0 0 ${width} ${height}`).attr("preserveAspectRatio", "xMidYMid slice");this.popupInstance = d3.select("#popup-element");const closeBtn = d3.select("#close-element");closeBtn.on("click", (event) => {this.popupInstance.transition().duration(300).style("opacity", 0) // 使弹窗逐渐透明.style("transform", "scale(0)"); // 缩小弹窗});// 全部点位信息const data = [{x: 500,y: 150,label: "湖州",code: 2117,source: 2117,target: 2115,type: "station",gsName: "申苏浙皖",},{x: 700,y: 150,label: "织里",code: 2115,source: 2115,target: 2113,type: "station",gsName: "申苏浙皖",},{x: 1200,y: 150,label: "南浔",code: 2113,source: 2113,target: null,type: "station",gsName: "申苏浙皖",},{x: 700,y: 350,label: "湖州东",code: 3233,source: 3233,target: 3231,type: "station",gsName: "申嘉湖",},{x: 1200,y: 350,label: "双林",code: 3231,source: 3231,target: 3229,type: "station",gsName: "申嘉湖",},{x: 1400,y: 350,label: "南浔南",code: 3229,source: 3229,target: null,type: "station",gsName: "申嘉湖",},{x: 700,y: 550,label: "钟管",code: 4049,source: 4049,target: 4051,type: "station",gsName: "杭绕西复线",},{x: 1200,y: 550,label: "新市西",code: 4051,source: 4051,target: 3206,type: "station",gsName: "杭绕西复线",},{x: 1350,y: 550,label: "新市枢纽",code: 3206,source: 3206,target: null,type: "station",gsName: "杭绕西复线",},{x: 800,y: 700,label: "雷甸",code: 3243,source: 3243,target: 3241,type: "station",gsName: "练杭",},{x: 1300,y: 700,label: "新安",code: 3241,source: 3241,target: 3239,type: "station",gsName: "练杭",},{x: 1500,y: 700,label: "新市",code: 3239,source: 3239,target: null,type: "station",gsName: "练杭",},{x: 900,y: 150,label: "织里枢纽",code: 5101,source: 5101,target: 5111,type: "hub",gsName: "沪杭高速",},{x: 900,y: 210,label: "织里东",code: 5111,source: 5111,target: 5113,type: "hh-station",gsName: "沪杭高速",},{x: 900,y: 280,label: "南浔西",code: 5113,source: 5113,target: 5102,type: "hh-station",gsName: "沪杭高速",},{x: 900,y: 350,label: "双林枢纽",code: 5102,source: 5102,target: 5115,type: "hh-station",gsName: "沪杭高速",},{x: 900,y: 410,label: "菱湖(分中心)",code: 5115,source: 5115,target: 5117,type: "hh-station",gsName: "沪杭高速",},{x: 900,y: 480,label: "千金",code: 5117,source: 5117,target: 5103,type: "hh-station",gsName: "沪杭高速",},{x: 900,y: 550,label: "士林枢纽",code: 5103,source: 5103,target: 5119,type: "hub",gsName: "沪杭高速",},{x: 960,y: 620,label: "下舍",code: 5119,source: 5119,target: 5104,type: "hh-station",gsName: "沪杭高速",},{x: 1050,y: 700,label: "新安枢纽",code: 5104,source: 5104,target: null,type: "hub",gsName: "沪杭高速",},];this.allData = data;const colorList = ["#409EFF","#67C23A","#E6A23C","#F56C6C","#909399",];// 获取“全部点位”连线数据this.allLineData = this.getLineData(data);const gsKeyToValue = [...new Set(data.map((ele) => ele.gsName))];// 高速名称数据gsKeyToValue.forEach((ele, index) => {const line = this.allLineData.filter((item) => item.gsName === ele);if (line.length > 0) {this.drawLine(this.svgInstance,line,index,colorList[index]);}const gsPointList = this.allData.filter((item) => item.gsName === ele);const len = gsPointList.length;if (len >= 2) {this.gsNamePointData.push(this.calculateGSNamePosition(gsPointList[len - 1],gsPointList[len - 2],ele));} else if (len == 1) {this.gsNamePointData.push(this.calculateGSNamePosition(gsPointList[len - 1],gsPointList[len - 1],ele));}});// 画“全部点位”this.drawPoint(this.svgInstance, data);// 画“收费站名称”this.drawPointText(this.svgInstance,data,"label",0,-25,40,-10);// 画“收费站编码”this.drawPointText(this.svgInstance, data, "code", 0, -25, 40, 6);this.drawPointText(this.svgInstance,this.gsNamePointData,"label",0,-25,0,30,'#000',20,'bold');},/*** 通过判断type返回目标图片的地址* @param   {String}   type       图片类型* @returns {String}   url        目标图片的地址*/setImgUrl(type) {let url;switch (type) {case "gantry":url = require("../../../assets/equipmentIcon.png");break;case "station":url = require("../../../assets/dataIcon.png");break;case "hub":url = require("../../../assets/userIcon.png");break;case "hh-station":url = require("../../../assets/homeIcon.png");break;}return url;},/*** 画点* @param   {Object}   svg         d3实例* @param   {Array}    pointData   点位数据* @param   {String}   type        点位类型* @returns {void}     无返回值*/drawPoint(svg, pointData) {// 根据类型设置图标地址svg.selectAll(".point").data(pointData).enter().append("image").attr("class", (d) => {return `.point-${d.type}`;}).attr("id", (d) => {return `id-${d.code}`;}).attr("x", (d) => d.x - 20).attr("y", (d) => d.y - 20).attr("width", 40).attr("height", 40).attr("href", (d) => {return this.setImgUrl(d.type);}).attr("r", 8).on("mouseover", (event, d) => {this.visible = true;// 置灰“当前节点非相关节点”的文本svg.selectAll("text").classed("opacity-1", true);// 高亮“当前节点相关节点”的文本svg.selectAll("text").filter((n) => n.gsName == d.gsName).classed("opacity-10", true);// 置灰“当前节点非相关节点”的图标svg.selectAll("image").classed("opacity-1", true);// 高亮“当前节点相关节点”的图标svg.selectAll("image").filter((n) => n.gsName == d.gsName).classed("opacity-10", true);// 置灰“当前节点非相关节点”的连线svg.selectAll("line").classed("opacity-1", true);// 高亮“当前节点相关节点”的连线const ele = svg.selectAll("line").filter((l) => l.gsName === d.gsName);// 设置初始状态ele.classed("opacity-10", true).style("stroke-dasharray", "25, 25").style("stroke-dashoffset", 0);// 启动流水效果function startAnimation() {const length = 1000;ele.style("stroke-dasharray", "25,25") // 设置虚线的总长度.style("stroke-dashoffset", length) // 设置初始的偏移量.transition() // 创建过渡动画.duration(10000) // 设置动画时长.ease(d3.easeLinear) // 使用线性过渡.style("stroke-dashoffset", 0) // 让偏移量为 0,从而产生流水效果.on("end", startAnimation); // 动画结束时递归调用}// 启动动画startAnimation();}).on("mouseout", (event, d) => {this.visible = false;// 置灰节点的文本svg.selectAll("text").classed("opacity-1", false);svg.selectAll("text").filter((n) => n.gsName == d.gsName).classed("opacity-10", false);// 置灰节点的图标svg.selectAll("image").filter((n) => n.gsName == d.gsName).classed("opacity-10", false);svg.selectAll("image").classed("opacity-1", false);// 置灰节点间的连线,停止动画svg.selectAll("line").classed("opacity-1", false);svg.selectAll("line").filter((l) => l.gsName === d.gsName).classed("opacity-10", false).style("stroke-dasharray", "0,0").interrupt();});},/*** 画“点文字”* @param   {Object}   svg         d3实例* @param   {Array}    pointData   点位数据* @param   {String}   property    展示文字的属性* @param   {Number}   x           横向(x轴)偏移量* @param   {Number}   y           纵向(y轴)偏移量* @param   {Number}   dx          文本之间的间距* @param   {Number}   dy          文本之间的间距* @param   {String}   color       文本之间的间距* @param   {Number}   fontSize    文字大小* @param   {Number}   fontWeight  文字加粗* @returns {void}     无返回值*/drawPointText(svg,pointData,property,x = 0,y = 0,dx = 0,dy = 0,color = "#000",fontSize = 14,fontWeight = 400,) {svg.selectAll(`.text-${property}`).data(pointData).enter().append("text").attr("class", `.text-${property}`).attr("x", (d) => d.x + x + dx).attr("y", (d) => d.y + y).attr("text-anchor", "middle").attr("fill", color).attr("font-size", fontSize).attr("font-weight", fontWeight).append("tspan").attr("x", (d) => d.x + dx).attr("dy", dy).text((d) => d[property]);},/**** @param   {Object}    svg        d3实例* @param   {Array}     linkData   点位连接数据* @param   {String}    lineName   线名称* @param   {String}    lineColor   线名称* @returns {void}      无返回值*/drawLine(svg, linkData, lineName, lineColor) {svg.selectAll(`.line-${lineName}`).data(linkData).enter().append("line").attr("class", `.line-${lineName}`).attr("x1", (d) => d.source.x).attr("y1", (d) => d.source.y).attr("x2", (d) => d.target.x).attr("y2", (d) => d.target.y).style("stroke", lineColor).style("stroke-width", 10) // 设置线条宽度.style("stroke-linecap", "square") // 设置端点样式.style("stroke-linejoin", "round"); // 设置连接点样式},/*** 获取连线数据* @param   {Array}     linkData   点位连接数据* @returns {void}      无返回值*/getLineData(linkData) {const res = [];// 创建一个站点代码与站点对象的映射const stationMap = linkData.reduce((map, station) => {map[station.code] = station;return map;}, {});// 遍历原始的站点列表来构建最终的结果for (let i = 0; i < linkData.length; i++) {const currentStation = linkData[i];const targetCode = currentStation.target;// 如果目标站点存在if (targetCode && stationMap[targetCode]) {const targetStation = stationMap[targetCode];// 创建一个新的对象,将source和target配对res.push({source: currentStation,target: targetStation,gsName: currentStation.gsName,});// 标记该站点的目标站点为null,防止重复配对stationMap[targetCode] = null;}}return res;},/*** 通过倒数前两个点位计算高速名称的点位数据* @param   {Object}    lastOne    倒数第一个点位* @param   {Object}    lastTwo    倒数第二个点位* @param   {String}    label      高速名称* @param   {Number}    distance   距离* @returns {Object}    高速点位*/calculateGSNamePosition(lastOne, lastTwo, label, distance = 100) {// 计算lastOne到lastTwo的向量const vx = lastOne.x - lastTwo.x;const vy = lastOne.y - lastTwo.y;// 计算lastOne到lastTwo的距离const dist = Math.sqrt(vx * vx + vy * vy);// 计算单位向量const unitX = vx / dist;const unitY = vy / dist;// 根据单位向量计算a3的位置,a3距离lastOne的横纵坐标都为200const a3X = lastOne.x + unitX * distance;const a3Y = lastOne.y + unitY * distance;// 返回a3的位置return { x: a3X, y: a3Y, label, gsName: label };},},created() {},mounted() {this.createChart();},
};
</script><style lang="less">
.map-test {height: 100%;width: 100%;overflow: hidden;cursor: pointer;position: relative;svg {width: 100%;height: 100%;cursor: pointer;}.tooltip {position: absolute;width: 200px;height: 40px;background-color: pink;z-index: 9;transform: scale(0);font-size: 20px;display: flex;align-items: center;justify-content: center;opacity: 0;transition: opacity 0.5s ease, transform 0.5s ease;.el-icon-close {position: absolute;top: 0;right: 0;font-size: 16px;}}.opacity-10 {opacity: 1!important;}.opacity-2 {opacity: 0.2;}.opacity-1 {opacity: 0.1;}.mark {position: absolute;top: 0;left: 0;height: 100%;width: 100%;background: rgba(0,0,0,0.05);z-index: -1;}
}
</style>
D3 官网:https://d3js.org/
D3 API地址:https://d3js.org/api
功能描述:
  1. 画点、画线、画文本内容
  2. 鼠标悬浮点位,高亮关联点位、文本及其高速公路名称
  3. 鼠标悬浮展示动态流水线效果
  4. 弹窗效果已包含,未在demo中展示
数据分析:

当前数据是前端mock数据,后续应用在实际项目中需要后端给到的数据格式是:

  1. 每个点位中需要有相对位置坐标,前端根据视口范围计算,展示点位
  2. 点位需要包含类型,来判断展示对应的图表(门架、站点、枢纽等)
  3. 点位需要包含指向关系,作用是用来画连接线
  4. 点位需要包含高速名称,用于展示高速名称标识
  5. 点位必须按照顺序返回,否则连线会比较乱,视觉体验差
注意:
  • 高速公路名称是根据calculateGSNamePosition函数计算的出来的
后端返回的数据样例:
// x,y代表坐标
// label: 名称
// source:源
// target:指向目标
// type:类型
const data = {'沪杭高速': [{x: 900,y: 150,label: "织里枢纽",code: 5101,source: 5101,target: 5111,type: "hub",},{x: 900,y: 210,label: "织里东",code: 5111,source: 5111,target: 5113,type: "station",},],
};// x,y代表坐标
// label: 名称
// source:源
// target:指向目标
// type:类型
// gsName:高速名称
const data1 = [{x: 900,y: 150,label: "织里枢纽",code: 5101,source: 5101,target: 5111,type: "hub",gsName: "沪杭高速",},{x: 900,y: 210,label: "织里东",code: 5111,source: 5111,target: 5113,type: "station",gsName: "沪杭高速",},
];

相关文章:

D3实现站点路线图demo分享

分享一下通过D3实现的站点路线分布图&#xff0c;这是一个demo。效果图如下&#xff1a; 源码如下&#xff1a; <template><div class"map-test" ref"d3Chart"><div class"tooltip" id"popup-element"><span>…...

非文件形式的内存动态函数库调用接口

使用memfd的系统调用接口将动态库加载到proc虚拟文件系统&#xff0c;提供的fd为进程持有的句柄&#xff0c;通过dlopen的path指向此句柄&#xff0c;即可实现非文件系统加载动态链接库。 文章目录 一、memfd_create二、dl_open三、示例参考 一、memfd_create 接口名称int mem…...

liunx docker 部署 nacos seata sentinel

部署nacos 1.按要求创建好数据库 2.创建docker 容器 docker run -d --name nacos-server -p 8848:8848 -p 9848:9848 -p 9849:9849 -e MODEstandalone -e SPRING_DATASOURCE_PLATFORMmysql -e MYSQL_SERVICE_HOST172.17.251.166 -e MYSQL_SERVICE_DB_NAMEry-config -e MYSQL…...

解决没法docker pull问题

没想到国内源死差不多了&#xff0c;以下内容需要提前科学上网 su cd /etc/systemd/system/docker.service.d vim proxy.conf 参照下图修改&#xff0c;代理服务器改成你自己的。 ​​[Service] Environment"HTTP_PROXYsocks5://192.168.176.180:10810" Environment&…...

面试小札:闪电五连鞭_2

1 请简单描述一下Java中的多线程。 多线程是指在一个程序中可以同时运行多个线程来执行不同的任务。在Java中&#xff0c;通过 java.lang.Thread 类来创建和控制线程。可以通过继承 Thread 类或者实现 Runnable 接口的方式来定义线程的执行逻辑。 线程有多种状态&#xff0c;…...

Milvus向量数据库06-RAG检索增强

Milvus向量数据库06-RAG检索增强 文章目录 Milvus向量数据库06-RAG检索增强1-学习目标2-参考网址3-执行过程记录1-到底什么是RAGRAG 的基本流程&#xff1a;为什么 RAG 优于传统的基于检索的方法&#xff1a;示例流程&#xff1a; 2-RAG和Elasticsearch对比3-RAG和向量数据库之…...

信创国产化时代:打造安全高效的信创网站解决方案

在全球科技竞争日益激烈的背景下&#xff0c;信创国产化已经成为中国信息技术领域的重要战略选择。信创国产化&#xff0c;即信息技术应用创新与国产化&#xff0c;旨在通过自主研发和创新&#xff0c;推动核心技术的国产化&#xff0c;减少对外部技术的依赖&#xff0c;确保国…...

python编程Day13-异常介绍捕获异常抛出异常

异常 介绍 1, 程序在运行时, 如果Python解释器遇到到一个错误, 则会停 止程序的执行, 并且提示一些错误信息, 这就是异常. 2, 程序停止执行并且提示错误信息这个动作, 通常称之为: 抛出 (raise) 异常 # f open(aaaa.txt) # FileNotFoundError: [Errno 2] No such file or dire…...

【JAVA高级篇教学】第二篇:使用 Redisson 实现高效限流机制

在高并发系统中&#xff0c;限流是一项非常重要的技术手段&#xff0c;用于保护后端服务&#xff0c;防止因流量过大导致系统崩溃。本文将详细介绍如何使用 Redisson 提供的 RRateLimiter 实现分布式限流&#xff0c;以及其原理、使用场景和完整代码示例。 目录 一、什么是限流…...

力扣-图论-8【算法学习day.58】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…...

Spring 中的验证、数据绑定和类型转换

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

Github----提交人不是自己

账号用户名都设置对的,但是提交人不是自己 解决 发现是用户名和账号都夹了"号导致 git config --global user.name "Your Name" git config --global user.email "your.emailexample.com"不用引号 git config --global user.name Your Name git …...

常用工具软件

前言 之前汇总过一篇嵌入式开发工具&#xff0c;但是掺杂了一些更偏向于日常使用的软件工具&#xff0c;这里单独提出来分享&#xff0c;都是自己在用的。 1.文件对比工具 BeyondCompare 文件对比利器&#xff0c;添加右键快捷键后。选中两个文件&#xff0c;右键可以直接进…...

Oracle报错ORA-01653: 表xx无法通过 8192在表空间中扩展

向Oracle 19g数据库中批量插入数据&#xff0c;当插入近2亿条数据后&#xff0c;报出如下错误&#xff1a; ORA-01653: 表xx无法通过 8192 (在表空间 xx_data 中) 扩展 查看表空间&#xff0c;发现表空间大小已达到32G&#xff0c;表空间无法进行自动扩展了。&#xff08;初始…...

【C语言】库函数常见的陷阱与缺陷(3):内存分配函数

目录 一、malloc 函数 1.1. 功能与常见用法 1.2. 陷阱与缺陷 1.3. 安全使用建议 1.4. 安全替代和代码示例 二、calloc 函数 2.1. 功能与常见用法 2.2. 陷阱与缺陷 2.3. 安全使用建议 2.4. 安全替代和代码示例 三、realloc 函数 3.1. 功能与常见用法 3.2. 陷阱与缺…...

Vue前端实现预览并打印PDF文档

一. 需求 1. 点击文档列表中的【打印】按钮&#xff0c;获取后台生成的PDF的url&#xff0c;弹窗进行预览&#xff1a; 2. 点击【打印】按钮&#xff0c;进行打印预览和打印&#xff1a; 二. 需求实现 首先后台给的是word文档&#xff0c;研究了一圈后发现暂时无法实现&…...

CSS学习记录07

CSS轮廓 轮廓是在元素周围绘制的一条线&#xff0c;在边框之外&#xff0c;以凸显元素。 CSS拥有如下轮廓属性&#xff1a; outline-styleoutline-coloroutline-widthoutline-offsetoutline 注意&#xff1a;轮廓与边框不同。不同之处在于&#xff1a;轮廓是在元素边框之外…...

喆塔科技携手国家级创新中心,共建高性能集成电路数智化未来

集创新之力成数智之塔 近日&#xff0c;喆塔科技与国家集成电路创新中心携手共建“高性能集成电路数智化联合工程中心”并举行签约揭牌仪式。出席此次活动的领导嘉宾包含&#xff1a;上海市经济和信息化委员会、上海市集成电路行业协会、复旦大学微电子学院、国家集成电路创新中…...

基于单片机的汽车雨刷器装置

摘要 下雨天时道路十分模糊&#xff0c;能见度非常低&#xff0c;司机分散注意力去手动打开雨刷器开关会非常危险。据统计&#xff0c;全世界雨天行车的车祸事故有7&#xff05;是因为司机手动打开雨刷分心导致的。为了减小司机因为手动打开雨刷发生车祸的概率&#xff0c;所以…...

013-SpringBoot 定义优雅的全局异常处理方式

SpringBoot 定义优雅的全局异常处理方式 一、概述二、定义全局异常接口三、定义全局异常枚举四、定义全局基础异常五、定义全局基础业务异常六、定义全局返回七、定义全局返回工厂八、全局异常处理九、实体类十、Controller十一、效果展示一、概述 在日常项目开发中,异常是常…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...

大数据驱动企业决策智能化的路径与实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;数据驱动的企业竞争力重构 在这个瞬息万变的商业时代&#xff0c;“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...