通过百度api处理交通数据

news/2025/1/2 11:06:43/

通过百度api处理交通数据

1、读取excel获取道路数据

  • java">//道路名称@Data
    @EqualsAndHashCode
    public class RoadName {@ExcelProperty("Name")private String name;
    }
    
  • java">/*** 获取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

  • java">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获取每条道路的拥堵信息,并设置定时任务,没半小时请求一次

  • java">//启动类和定时任务上都得加上
    @EnableScheduling
    //提供给spring管理
    @Component
    public class Baidu {
    

定时任务主方法代码

  • 将json映射Java实体类:实体类如下

    • java">//接收返回的百度api数据的总实体类
      @Data
      public class BaiduReturn {private int status;private String message;private String description;private Evaluation evaluation;private List<RoadTraffic> road_traffic;}
      
    • java">//拥堵数据
      @Data
      public class CongestionSection{private String congestion_distance;private String speed;private int status;private String congestion_trend;private String section_desc;
      }
      
    • java">//拥堵状态
      @Data
      public class Evaluation {private int status;private String status_desc;}
      
    • java">//路况数据
      @Data
      public class RoadTraffic {private List<CongestionSection> congestion_sections;private String road_name;
      }
      
  • java">	@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表用的实体类如下

    • java">//用于写入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;
      }
      
  • java"> //将数据写入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的代码

    • java">/*** 将数据写入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);}}
      

http://www.ppmy.cn/news/1559476.html

相关文章

计算机网络:IP地址相关知识总结

目录 一、IP地址的表现形式 1.1 十进制表示形式 1.2 二进制表示形式 1.3 转换示例介绍 二、IP地址的组成 2.1 网络ID 2.2 主机ID 2.3 示例 三、IP地址的分类 3.1 A类地址 3.2 B类地址 3.3 C类地址 3.4 D类地址 3.5 E类地址 四、常见的特殊IP地址 五、IP地址二进…

Leetcode - 146双周赛

目录 一&#xff0c;3392. 统计符合条件长度为 3 的子数组数目 二&#xff0c;3393. 统计异或值为给定值的路径数目 三&#xff0c;3394. 判断网格图能否被切割成块 四&#xff0c;3395. 唯一中间众数子序列 I 一&#xff0c;3392. 统计符合条件长度为 3 的子数组数目 本题…

pytorch torch.nn.LayerNorm类介绍

torch.nn.LayerNorm 是 PyTorch 中的一种标准化层,用于对输入的特征进行归一化。它在自然语言处理和序列建模中非常常见,可以帮助模型更快地收敛,并提高泛化能力。 关于类、层和模块 torch.nn.LayerNorm 是 一个类,它是 PyTorch 中标准化操作的实现,继承自 torch.nn.Modu…

上位机开发 的算法与数据结构

Python基础 Python是一种广泛使用的高级编程语言&#xff0c;以其简单易读的语法和强大的功能赢得了众多开发者的青睐。自1991年首次发布以来&#xff0c;Python已经经历了多个版本的更新&#xff0c;当前最新的稳定版本是Python 3.x。Python不仅适用于web开发、数据分析、人工…

【微服务】整合Nacos注册中心和动态配置

文章目录 1.Docker安装Nacos1.拉取镜像2.启动nacos3.开启8848和9848端口1.88482.9848 4.访问Nacos 2.项目集成Nacos的服务发现1.引入依赖1.sun-dependencies 指定版本2.sun-cloud-nacos引入服务发现依赖和bootstrap依赖3.注意&#xff1a;修改完sun-dependencies的依赖后clean-…

BUUCTF Pwn ciscn_2019_es_2 WP

1.下载 checksec 用IDA32打开 定位main函数 发现了个假的后门函数&#xff1a; 看看vul函数&#xff1a; 使用read读取 想到栈溢出 但是只有48个 只能覆盖EBP和返回地址 长度不够构造 所以使用栈迁移&#xff1a; 栈迁移需要用到leave ret 使用ROPgadget找地址&#xff1a; …

QWidget应用封装为qt插件,供其他qt应用调用

在之前的文章中,有介绍通过QProcess的方式启动QWidget应用,然后将其窗口嵌入到其他的qt应用中,作为子窗口使用.这篇文章主要介绍qt插件的方式将QWidget应用的窗口封装为插件,然后作为其他Qt应用中的子窗口使用. 插件优点: 与主程序为同一个进程,免去了进程间繁琐的通信方式,…

<数据集>风力发电机损伤识别数据集<目标检测>

数据集下载链接 &#xff1c;数据集&#xff1e;风力发电机损伤识别数据集&#xff1c;目标检测&#xff1e;https://download.csdn.net/download/qq_53332949/90187097数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2527张 标注数量(xml文件个数)&#xff1a;252…