通过百度api处理交通数据
通过百度api处理交通数据
1、读取excel获取道路数据
-
//道路名称@Data @EqualsAndHashCode public class RoadName {@ExcelProperty("Name")private String name; }
-
/*** 获取excel中的道路名称*/private static List<String> getRoadName() {// 定义文件路径,指向包含道路名称的Excel文件String fileName = "src\\main\\resources\\static\\cd_road_name.xlsx";// 创建一个RoadName对象的列表,用于存储从Excel文件中读取的数据List<RoadName> nameDataList = new ArrayList<>();// 使用EasyExcel库读取Excel文件EasyExcel.read(fileName, RoadName.class, new AnalysisEventListener<RoadName>() {// 重写invoke方法,该方法会在读取每一行数据时被调用@Overridepublic void invoke(RoadName data, AnalysisContext context) {// 将读取到的每一行数据添加到nameDataList列表中nameDataList.add(data);}// 重写doAfterAllAnalysed方法,该方法会在所有数据读取完成后被调用@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 所有数据解析完成后的操作,这里只是打印一条消息System.out.println("所有数据解析完成!");}}).sheet().doRead(); // 指定读取第一个sheet并开始读取// 创建一个字符串列表,用于存储道路名称List<String> RoadNameList = new ArrayList<>();// 遍历nameDataList列表,提取每条记录的道路名称for (RoadName roadName : nameDataList) {// 将每条记录的道路名称添加到RoadNameList列表中RoadNameList.add(roadName.getName());}// 返回包含所有道路名称的列表return RoadNameList;}
2、获取百度api数据
-
代码官网有:https://lbsyun.baidu.com/faq/api?title=webapi/traffic-roadseek
-
package xyz.zzj.traffic_zzj.utils;import org.springframework.web.util.UriUtils; import xyz.zzj.traffic_zzj.constant.BaiduConstant;import java.net.URL; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URLConnection;import java.util.Map;//用于获取百度apipublic class BaiduApi {public static String URL = BaiduConstant.BAIDU_URL;public static String AK = BaiduConstant.BAIDU_AK;public String requestGetAK(String strUrl, Map<String, String> param) throws Exception {if (strUrl == null || strUrl.length() <= 0 || param == null || param.size() <= 0) {return null;}StringBuffer queryString = new StringBuffer();queryString.append(strUrl);for (Map.Entry<?, ?> pair : param.entrySet()) {queryString.append(pair.getKey() + "=");// 第一种方式使用的 jdk 自带的转码方式 第二种方式使用的 spring 的转码方法 两种均可// queryString.append(URLEncoder.encode((String) pair.getValue(), "UTF-8").replace("+", "%20") + "&");queryString.append(UriUtils.encode((String) pair.getValue(), "UTF-8") + "&");}if (queryString.length() > 0) {queryString.deleteCharAt(queryString.length() - 1);}java.net.URL url = new URL(queryString.toString());System.out.println(queryString.toString());URLConnection httpConnection = (HttpURLConnection) url.openConnection();httpConnection.connect();InputStreamReader isr = new InputStreamReader(httpConnection.getInputStream());BufferedReader reader = new BufferedReader(isr);StringBuffer buffer = new StringBuffer();String line;while ((line = reader.readLine()) != null) {buffer.append(line);}reader.close();isr.close();//数据类型为json字符串return buffer.toString();} }
3、使用获取的道路信息,请求百度api获取每条道路的拥堵信息,并设置定时任务,没半小时请求一次
-
//启动类和定时任务上都得加上 @EnableScheduling //提供给spring管理 @Component public class Baidu {
定时任务主方法代码
-
将json映射Java实体类:实体类如下
-
//接收返回的百度api数据的总实体类 @Data public class BaiduReturn {private int status;private String message;private String description;private Evaluation evaluation;private List<RoadTraffic> road_traffic;}
-
//拥堵数据 @Data public class CongestionSection{private String congestion_distance;private String speed;private int status;private String congestion_trend;private String section_desc; }
-
//拥堵状态 @Data public class Evaluation {private int status;private String status_desc;}
-
//路况数据 @Data public class RoadTraffic {private List<CongestionSection> congestion_sections;private String road_name; }
-
-
@Scheduled(cron = "0 0/30 * * * ?")public void scheduledTask() throws Exception { List<String> nameList;List<BaiduReturn> resultList = new ArrayList<>();nameList = getRoadName();for(int i = 0;i<nameList.size();i++){BaiduApi snCal = new BaiduApi();// 创建一个Map对象,用于存储请求参数Map params = new LinkedHashMap<String, String>();params.put("road_name", nameList.get(i));params.put("city", "成都市");params.put("ak", AK);String result = snCal.requestGetAK(URL, params);ObjectMapper objectMapper = new ObjectMapper();// 使用 readValue 方法解析 JSON 字符串为 BaiduReturn 对象BaiduReturn baiduReturn = objectMapper.readValue(result, BaiduReturn.class);if (baiduReturn.getStatus() == 0) {resultList.add(baiduReturn);}}
4、将获取的所有道路拥堵存入excel
-
主方法代码
-
写入excel表用的实体类如下
-
//用于写入excel的数据字段 @Data public class ExcelData {//城市名称private String cityName;//道路名称private String roadName;//道路详情private String description;//道路状态private String evalDesc;//道路拥堵距离private String congestionDistance;//道路拥堵车速private String speed;//道路拥堵地段private String congestionTrend;//道路拥堵的时间private String nowTime; }
-
-
//将数据写入excelfor (BaiduReturn baiduReturn : resultList) {RoadTraffic roadTraffic = new RoadTraffic();roadTraffic.setRoad_name(baiduReturn.getRoad_traffic().get(0).getRoad_name());roadTraffic.setCongestion_sections(baiduReturn.getRoad_traffic().get(0).getCongestion_sections());//转化为excel格式ExcelData excelData = new ExcelData();excelData.setCityName("成都市");excelData.setDescription(baiduReturn.getDescription());excelData.setEvalDesc(baiduReturn.getEvaluation().getStatus_desc());excelData.setRoadName(roadTraffic.getRoad_name());// 获取当前时间戳long timestamp = System.currentTimeMillis();// 将时间戳转换为Instant对象Instant instant = Instant.ofEpochMilli(timestamp);// 转换为本地时间,指定时区LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());// 定义日期时间格式DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");// 格式化日期时间String formattedDateTime = localDateTime.format(formatter);excelData.setNowTime(formattedDateTime);//不拥堵时,这几个字段是空,要进行判空处理if (roadTraffic.getCongestion_sections() !=null) {excelData.setCongestionDistance(roadTraffic.getCongestion_sections().get(0).getCongestion_distance());excelData.setSpeed(roadTraffic.getCongestion_sections().get(0).getSpeed());excelData.setCongestionTrend(roadTraffic.getCongestion_sections().get(0).getSection_desc());}else {excelData.setCongestionDistance("");excelData.setSpeed("");excelData.setCongestionTrend("");}// // 写入Excel文件String fileName = "src\\main\\resources\\static\\cd_road_traffic.xlsx";writeBaiduReturnToExcel(excelData, fileName);} }
-
写入excel的代码
-
/*** 将数据写入excel*/public static void writeBaiduReturnToExcel(ExcelData excelData, String fileName) throws IOException, IllegalAccessException {FileInputStream fis = new FileInputStream(new File(fileName));Workbook workbook = new XSSFWorkbook(fis);Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表int rowCount = sheet.getLastRowNum(); // 行数从0开始计数,所以需要加1int rowIndexToAppendAfter = rowCount; // 指定要在第几行之后追加数据(从0开始计数)fis = new FileInputStream(new File(fileName));workbook = new XSSFWorkbook(fis);sheet = workbook.getSheetAt(0); // 获取第一个工作表// 创建新行Row newRow = sheet.createRow(rowIndexToAppendAfter + 1);List<String> list = new ArrayList<>();// 通过反射获取ExcelData类的所有字段Class<?> clazz = excelData.getClass();// 遍历所有字段for (Field field : clazz.getDeclaredFields()) {field.setAccessible(true);Object value = field.get(excelData);list.add(value != null ? value.toString() : null);}// 将list转换为字符串数组方便填充String[] array = list.toArray(new String[0]);// 在新行中填充数据for (int i = 0; i < array.length; i++) {Cell cell = newRow.createCell(i);cell.setCellValue(array[i]);}// 将更改写回文件try (FileOutputStream fos = new FileOutputStream(fileName)) {workbook.write(fos);}}
-
相关文章:
通过百度api处理交通数据
通过百度api处理交通数据 1、读取excel获取道路数据 //道路名称Data EqualsAndHashCode public class RoadName {ExcelProperty("Name")private String name; }/*** 获取excel中的道路名称*/private static List<String> getRoadName() {// 定义文件路径&…...

探索CSDN博客数据:使用Python爬虫技术
探索CSDN博客数据:使用Python爬虫技术 在数字化的浪潮中,数据的获取与分析变得日益关键。CSDN作为中国领先的IT社区和服务平台,汇聚了海量的技术博客与文章,成为一座蕴藏丰富的数据宝库。本文将引领您穿梭于Python的requests和py…...

b站ip属地评论和主页不一样怎么回事
在浏览B站时,细心的用户可能会发现一个有趣的现象:某些用户的评论IP属地与主页显示的IP属地并不一致。这种差异引发了用户的好奇和猜测,究竟是什么原因导致了这种情况的发生呢?本文将对此进行深入解析,帮助大家揭开这一…...
如何查看服务器内存占用情况?
如何查看服务器的内存占用情况?你知道内存使用情况对服务器性能的重要性吗?内存是服务器运行的核心资源之一,了解内存的占用情况可以帮助你优化系统性能。 要查看服务器的内存占用情况,首先需要确定你使用的是哪种操作系统。不同…...
流架构的读书笔记(2)
流架构的读书笔记(2) 一、建模工具之一沃德利地图 推测技术的发展,交流和辩论思想的最有力的方法是沃德利地图 沃德利地图的制作步骤 1确定范围和用户需求 2确定满足用户需求所需的组件 3在一条范围从全新到被人们接受的演进轴上评估这些组成 部分的演…...

E6 中的 扩展运算符(Spread) 和 剩余运算符(Rest)
时间:2024.12.29 之前看到 Es6 中的 三点运算符,有如下的几种写法,有时候三点运算符放在左边,有时候三点运算符放在右边,老是混淆。今天记录下,加强理解。 先看一个问题 最近在看 《ECMAScript 6 入门》关于…...

Python的简单爬虫框架
爬虫为网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、…...

使用 uni-app 开发的微信小程序中,如何在从 B 页面回来时,重新拉取数据?
👨🏻💻 热爱摄影的程序员 👨🏻🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻🏫 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…...

Windows API Set:那些“只存在但不被使用“的DLL
API Set 是什么? 想象一下,Windows就像一个大型图书馆,而API Set就是这个图书馆的索引系统。但这个索引系统非常特别:它是直接内置在Windows加载器中的"虚拟目录"。 // 一个典型的API Set映射示例 api-ms-win-core-mem…...

黑神话悟空鼠标光标分享
效果图: 鼠标光标特点 这套鼠标光标的设计灵感来源于《黑神话:悟空》游戏中的角色和元素,具有以下特点: • 主题鲜明:光标设计紧扣游戏主题,采用了游戏中的元素,让玩家在使用电脑时也能感受到…...
编写一个简单的引导加载程序(bootloader)
编写一个简单的引导加载程序(bootloader)通常用于嵌入式系统或自定义操作系统。这里,我将为你提供一个基于x86架构的简单汇编语言 bootloader 示例。这个 bootloader 将会在启动时打印一条消息到屏幕上。 使用 NASM 汇编器来编写这个 bootlo…...

【Linux基础】进程(上) —— 概念、状态、优先级与环境变量
目录 一、进程的概念 1. 什么是进程 PCB进程控制块的理解 2. 查看进程的方式 ps ajx 指令 getpid系统调用 3. 另外一种查看进程的方式(了解) 4. 进程的常见调用 fork 创建子进程 现象说明 二、进程的状态 1. 操作系统层面的进程状态 ① 运行状态 ② 阻塞状态 ③…...
Rust: enum 和 i32 的区别和互换
在Rust编程语言中,enum(枚举)和i32是两种不同类型的数据结构,它们各自有不同的用途和特性。 i32 i32是一个32位的有符号整数类型。它用于存储整数值,范围从-2,147,483,648到2,147,483,647。i32是Rust中的基本数据类型…...
2024年终回顾
前言 很久没有更新博客,因为工作内容主要是内场开发,后来有点和互联网脱轨,断断续续上来看一下。这个总结应该也很简单,涉及以下的几个内容进行逐一说明 一、就业问题 这个问题可能很尖锐,从大环境来说,去…...

RGB、HSV颜色模型及MATLAB互换应用实例
一、前言 RGB和HSV模型是数字图像处理中颜色空间中的两种重要表示方式,RGB和HSV都是描述颜色的数学模型,可以用于表示和处理图像中的颜色信息。 RGB模型是一种基于光的颜色模型,由红(Red)、绿(Green&#x…...
# 【超全面了解鸿蒙生命周期】-生命周期补充
【超全面了解鸿蒙生命周期】-生命周期补充 鸿蒙所有的生命周期函数梳理 文章目录 【超全面了解鸿蒙生命周期】-生命周期补充前言一、AbilityStage的生命周期二、ExtensionAbility卡片生命周期三、Web组件常用生命周期 前言 本文是继之前写的生命周期函数梳理的进一步补充&…...

黑神话悟空游戏鼠标光标使用教程与下载
效果图: 鼠标光标特点 这套鼠标光标的设计灵感来源于《黑神话:悟空》游戏中的角色和元素,具有以下特点: • 主题鲜明:光标设计紧扣游戏主题,采用了游戏中的元素,让玩家在使用电脑时也能感受到…...
【机器学习】梯度下降
文章目录 1. 梯度下降概念2. 梯度下降的技巧2.1 动态设置学习率2.2 Adagrad调整梯度2.3 随机梯度下降(SGD)2.4 特征缩放 3. 梯度下降理论基础 1. 梯度下降概念 梯度:Loss 对参数在某一点的偏微分,函数沿梯度的方向具有最大的变化…...
【leetcode 07】707.设计链表
要点⭐ 链表的常见操作 获取第n个节点的值 头部插入节点 尾部插入节点 第n个节点前插入(先立新,在破旧) 删除第n个节点 class ListNode{int val;ListNode next;ListNode(){};ListNode(int val){this.valval;} } class MyLinkedList {//链表大…...
【Spring】详解(上)
Spring 框架核心原理与应用(上) 一、Spring 框架概述 (一)诞生背景 随着 Java 应用程序规模的不断扩大以及复杂度的日益提升,传统的 Java开发方式在对象管理、代码耦合度等方面面临诸多挑战。例如,对象之…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...