通过百度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方法,该方法会在读取每一行数据时被调用
                @Override
                public void invoke(RoadName data, AnalysisContext context) {
                    // 将读取到的每一行数据添加到nameDataList列表中
                    nameDataList.add(data);
                }
    
                // 重写doAfterAllAnalysed方法,该方法会在所有数据读取完成后被调用
                @Override
                public 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;
    
    //用于获取百度api
    
    public 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;
      }
      
  •  //将数据写入excel
                for (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开始计数,所以需要加1
                  int 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);
                  }
      
              }
      

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

表达式语句、复合语句和空语句

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;表达式语句、复合语句和空语句 发布时间&#xff1a;2024.12.26 隶属专栏&#xff1a;C语言 目录 1. 表达式语句定义作用常见类型赋值语句函数调用语句 2. 复合语句定义作用变量作用域 3. 空语句定义作用 1. 表达式…

Linux arm 编译安装glibc-2.29

重要的话说三遍&#xff1a; &#xff01;&#xff01;&#xff01;&#xff01;&#xff01;不要轻易自己去安装glibc&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; &#xff01;&#xff01;&#xff01;&#xff01;&#xff01;不要轻易自己去安装glibc&a…

20241225在ubuntu22.04.5下使用smartmontools命令查看ssd的寿命

20241225在ubuntu22.04.5下使用smartmontools命令查看ssd的寿命 2024/12/25 15:10 rootrootrootroot-ThinkBook-16-G5-IRH:~$ sudo apt install smartmontools rootrootrootroot-ThinkBook-16-G5-IRH:~$ sudo fdisk -l Disk /dev/nvme0n1: 3.73 TiB, 4096805658624 bytes, 800…

大数据学习之Redis 缓存数据库二,Scala分布式语言一

一.Redis 缓存数据库二 26.Redis数据安全_AOF持久化机制 27.Redis数据安全_企业中该如何选择持久化机制 28.Redis集群_主从复制概念 29.Redis集群_主从复制搭建 30.Redis集群_主从复制原理剖析 31.Redis集群_哨兵监控概述 32.Redis集群_配置哨兵监控 33.Redis集群_哨兵监控原理…

Datawhale AI 冬令营学习笔记-零编程基础制作井字棋小游戏

井字棋小游戏是通过豆包MarsCode实现的&#xff0c;没有改动任何的代码&#xff0c;全部是通过对话让AI进行优化和改进。 开始进入正题&#xff1a;进入豆包MarsCode在线IDE&#xff0c;直接点击上方蓝字&#xff0c;或复制链接打开: 豆包 MarsCode - 编程助手。 IDE界面&…

vscode+编程AI配置、使用说明

文章目录 [toc]1、概述2、github copilot2.1 配置2.2 使用文档2.3 使用说明 3、文心快码&#xff08;Baidu Comate&#xff09;3.1 配置3.2 使用文档3.3 使用说明 4、豆包&#xff08;MarsCode&#xff09;4.1 配置4.2 使用文档4.3 使用说明 5、通义灵码&#xff08;TONGYI Lin…

Redis数据结构和内部编码以及单线程架构

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Redis数据结构和内部编码以及单线程架构 收录于专栏[redis] 本专栏旨在分享学习Redis的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 …

虚拟机Hyper-V,安装网络宝塔Docker

我下载的是centos-min大小1G&#xff0c;安装后没网络&#xff0c; 关闭防火墙&#xff0c;网络&#xff0c;修改onBootyes,这里需要看下network-Scripts下有什么文件。 然后就可以访问网络了 虚拟机的设置也是默认就好 网络需要设置允许共享-重要 urlhttps://download.bt.cn/i…

红魔电竞PadPro平板解BL+ROOT权限-KernelSU+LSPosed框架支持

红魔Padpro设备目前官方未开放解锁BL&#xff0c;也阉割了很多解锁BL指令&#xff0c;造成大家都不能自主玩机。此规则从红魔8开始&#xff0c;就一直延续下来&#xff0c;后续的机型大概率也是一样的情况。好在依旧有开发者进行适配研究&#xff0c;目前红魔PadPro平板&#x…

Linux-----进程处理(文件IO资源使用)

下面代码是通过父进程和子进程对同一个文件IO资源进行操作&#xff0c;父进程和子进程都对这个进程进行写入操作&#xff0c;我们都知道这两个进程实际上是并发的&#xff0c;所以需要一个同步机制来去操作同一个资源&#xff08;后面再深入去说明同步的api&#xff0c;这里使用…

EdgeX Core Service 核心服务之 Core Command 命令

EdgeX Core Service 核心服务之 Core Command 命令 一、概述 Core-command(通常称为命令和控制微服务)可以代表以下角色向设备和传感器发出命令或动作: EdgeX Foundry中的其他微服务(例如,本地边缘分析或规则引擎微服务)EdgeX Foundry与同一系统上可能存在的其他应用程序…

【LeetCode】94.二叉树的中序遍历

题目链接&#xff1a; 94.二叉树的中序遍历 题目描述&#xff1a; 题解&#xff1a;&#xff08;递归算法实现二叉树中序遍历&#xff09; 二叉树的中序遍历&#xff1a;按照访问左子树——根节点——右子树的方式遍历这棵树&#xff0c;而在访问左子树或者右子树的时候我们按…

LeetCode:404.左叶子之和

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;404.左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: …

AI对话机器人简单实现--智谱BigModel+SpringBoot+Vue2+ElementUI

成品展示 一、首先去注册个账号然后申请个API keys 二、引入依赖 <dependency><groupId>cn.bigmodel.openapi</groupId><artifactId>oapi-java-sdk</artifactId><version>release-V4-2.3.0</version></dependency><depend…

每天40分玩转Django:Django静态文件

Django静态文件 一、今日学习内容概述 学习模块重要程度主要内容静态文件配置⭐⭐⭐⭐⭐基础设置、路径配置CDN集成⭐⭐⭐⭐⭐CDN配置、资源优化静态文件处理⭐⭐⭐⭐压缩、版本控制部署优化⭐⭐⭐⭐性能优化、缓存策略 二、基础配置 # settings.py import os# 静态文件配置…

改进爬山算法之一:随机化爬山法(Stochastic Hill Climbing,SHC)

随机化爬山法(Stochastic Hill Climbing),也被称为随机爬山法,是一种基于搜索算法的优化方法,是爬山算法的一个变种,它通过引入随机性来减少算法陷入局部最优解的风险,并增加搜索解空间的能力。这种方法特别适合于解决那些具有多个局部最优解的优化问题。 一、算法思想 …

农家乐系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

探究音频丢字位置和丢字时间对pesq分数的影响

丢字的本质 丢字的本质是在一段音频中一小段数据变为0 丢字对主观感受的影响 1. 丢字位置 丢字的位置对感知效果有很大影响。如果丢字发生在音频信号的静音部分或低能量部分&#xff0c;感知可能不明显&#xff1b;而如果丢字发生在高能量部分或关键音素上&#xff0c;感知…

《Java源力物语》-3.空值猎手

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” \quad 夜色渐深&#xff0c;在一处偏僻小径上&#xff0c;月光透过浓密的源力云层&#xff0c;在地面上投下斑驳的光影。String正独自练习着刚从…

产品初探Devops!以及AI如何赋能Devops?

DevOps源自Development&#xff08;开发&#xff09;和Operations&#xff08;运维&#xff09;的组合&#xff0c;是一种新的软件工程理念&#xff0c;旨在打破传统软件工程方法中“开发->测试->运维”的割裂模式&#xff0c;强调端到端高效一致的交付流程&#xff0c;实…