大眼pro 发表于 2022-4-16 20:16

JAVA获取广西水利各个水文站点水位和流量,各个站点的降雨量并生成Excel保存本地

本帖最后由 大眼pro 于 2022-4-16 20:27 编辑

JAVA获取广西水利各个水文站点水位和流量,各个站点的降雨量并生成Excel保存本地


继上篇 JAVA爬虫获取气象数据 一位朋友联系我帮忙做一个小工具
打开网页 http://slt.gxzf.gov.cn/page/index.html?act=3
点击水情,点击查询

打开控制台(按F12)找到需要的接口

写一个水情实体类方便之后使用

/**
* 水情
*/
@Data
public class Water{
    /**编号*/
    private String ADDVCD;
    /**站点编号*/
    private String STCD;
    /**测站名称 */
    private String STNM;
    /**流域名称*/
    private String BSNM;
    /**水系名称*/
    private String HNNM;
    /**经度*/
    private String LGTD;
    /**纬度*/
    private String LTTD;
    /**流量(m3/s) */
    private String Q;
    /**河流名称 */
    private String RVNM;
    /**三聚磷酸钠 */
    private String STTP;
    /**时间*/
    private String TM;
    /**警戒水位(m) */
    private String WRZ;
    /**水位(m) */
    private String Z;
    /**超警戒(m)*/
    private String ZWRNDLT;
}

复制数据包导入到postman中

不会导入数据包的可以看上一篇

生成java代码放入项目中
雨情同理
点击雨情,选择条件查询

找到需要的接口


雨情实体类
/**
* 雨情
*/
@Data
public class Rain {
    /**编号*/
    private String STCD;
    /**测站名称 */
    private String STNM;
    /**雨量(mm) */
    private String ACCP;
    /**站址 */
    private String STLC;
    /**经度 */
    private String LGTD;
    /**纬度 */
    private String LTTD;
    /**查询时间 */
    private String TIME;
}
需要注意的是雨情是需要传入参数

将数据包复制导入postman


java业务代码
    @Value("${rain.startTime}")
    String startTime;
    @Value("${rain.endTime}")
    String endTime;
    @Value("${rain.range1}")
    boolean range1;
    @Value("${rain.range2}")
    boolean range2;
    @Value("${rain.range3}")
    boolean range3;
    @Value("${rain.range4}")
    boolean range4;
    @Value("${rain.range5}")
    boolean range5;
    @Value("${rain.range6}")
    boolean range6;
    @Value("${rain.range7}")
    boolean range7;

    /**
   * 雨情执行
   */
    @SneakyThrows
    @Scheduled(cron = "${rain.cron}")
    private void rain(){
      Date d = new Date();
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      SimpleDateFormat sdf0 = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
      SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
      System.out.println("执行雨情,时间:"+ sdf.format(d));
      OkHttpClient client = new OkHttpClient().newBuilder()
                .build();
      MediaType mediaType = MediaType.parse("application/json");
      /** 设置查询参数开始可在yml文件定义*/
      JSONObject jsonObject = new JSONObject();
      String startTimes;
      String endTimes;
      if (startTime.isEmpty()){
            startTimes = sdf0.format(d);
      }else {
            startTimes = startTime;
      }
      if(endTime.isEmpty()){
            endTimes = sdf.format(d);
      }else {
            endTimes = endTime;
      }
      jsonObject.put("startTime",startTimes);
      jsonObject.put("endTime",endTimes);
      if(range1){
            jsonObject.put("range1","0");
      }
      if(range2){
            jsonObject.put("range2","0.1");
      }
      if(range3){
            jsonObject.put("range3","10");
      }
      if(range4){
            jsonObject.put("range4","25");
      }
      if(range5){
            jsonObject.put("range5","50");
      }
      if(range6){
            jsonObject.put("range6","100");
      }
      if(range7){
            jsonObject.put("range7","250");
      }
      /** 设置查询参数结束*/
      RequestBody body = RequestBody.create(mediaType, jsonObject.toJSONString());
      Request request = new Request.Builder()
                .url("http://slt.gxzf.gov.cn/gxsl/api/sl323/realtime/rain/history")
                .method("POST", body)
                .addHeader("Content-Type", "application/json")
                .build();
      okhttp3.Response response = client.newCall(request).execute();
      String string = response.body().string();
      JSONObject parseObject = JSONObject.parseObject(string);
      JSONArray result = parseObject.getJSONArray("result");
      //生成EXCEl
      List<Rain> list = new ArrayList<Rain>(JSONArray.parseArray(result.toJSONString(), Rain.class));
      list.stream().forEach(s->s.setTIME(startTimes + "至" + endTimes));
      String[] header = {"编号", "测站名称", "雨量(mm)", "站址", "经度", "纬度", "查询时间"};
      export(list,header,"雨情\\执行雨情,时间:"+ sdf1.format(d),Rain.class);
    }

    /**
   * 水情执行
   */
    @SneakyThrows
    @Scheduled(cron = "${water.cron}")
    private void water(){
      Date d = new Date();
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
      System.out.println("执行水情,时间:"+ sdf.format(d));
      OkHttpClient client = new OkHttpClient().newBuilder()
                .build();
      Request request = new Request.Builder()
                .url("http://slt.gxzf.gov.cn/gxsl/api/sl323/realtime/river/")
                .method("GET", null)
                .build();
      okhttp3.Response response = client.newCall(request).execute();
      String body = response.body().string();
      JSONObject jsonObject = JSONObject.parseObject(body);
      JSONArray result = jsonObject.getJSONArray("result");
      //生成EXCEl
      List<Water> list = new ArrayList<Water>(JSONArray.parseArray(result.toJSONString(), Water.class));
      list.stream().forEach(s->s.setTM(stampToTime(s.getTM())));
      String[] header = {"编号", "站点编号", "测站名称", "流域名称", "水系名称", "经度", "纬度", "流量(m3/s) "
                , "河流名称", "三聚磷酸钠", "时间", "警戒水位(m)", "水位(m)","超警戒(m)"};
      export(list,header,"水情\\执行水情,时间:"+ sdf1.format(d),Water.class);
    }

    /**
   * 将时间戳转换为时间
   * @param s 时间戳
   * @return
   */
    private static String stampToTime(String s){
      String res;
      SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      long lt = new Long(s);
      //将时间戳转换为时间
      Date date = new Date(lt);
      //将时间调整为yyyy-MM-dd HH:mm:ss时间样式
      res = simpleDateFormat.format(date);
      return res;
    }

    /**
   * 导出
   * @param data list数据
   * @param header 头部
   * @param fileName 文件名
   * @param c 泛型类
   */
    private static void export(List<?> data, String[] header, String fileName, Class c) {
      String[] fieldNames = fieldName(c);
      Workbook wb = new HSSFWorkbook();
      int rowSize = 0;
      Sheet sheet = wb.createSheet();
      for (int i = 0; i < header.length; i++) {
            sheet.setColumnWidth(i,5000);
      }
      Row row = sheet.createRow(rowSize);
      row.setHeight((short)(30*20));
      for (int i = 0; i < header.length; i++) {
            row.createCell(i).setCellValue(header);
      }

      try {
            for (int x = 0; x < data.size(); x++) {
                rowSize = 1;
                Row rowNew = sheet.createRow(rowSize + x);
                rowNew.setHeight((short)(25*20));
                for (int i = 0; i < header.length; i++) {
                  Object o = data.get(x);
                  for (int i1 = 0; i1 < fieldNames.length; i1++) {
                        String methodName = "get" + fieldNames.substring(0,             1).toUpperCase() + fieldNames.substring(1);//获取属性的get方法名
                        Method method = o.getClass().getMethod(methodName);
                        Object invoke = method.invoke(o);//获取属性值
                        if(invoke != null){
                            rowNew.createCell(i).setCellValue(invoke.toString());
                        }else {
                            rowNew.createCell(i).setCellValue("");
                        }

                  }
                }
            }
      } catch (Exception e) {

      }
      OutputStream outputStream = null;
      try {
            outputStream = new FileOutputStream(fileName+".xls");
            wb.write(outputStream);
      } catch (Exception e) {

      } finally {
            try {
                if (outputStream != null) {
                  outputStream.flush();
                  outputStream.close();
                }
            } catch (Exception e) {

            }
            try{
                if(wb != null){
                  wb.close();
                }
            } catch (Exception e){

            }
      }

    }

    private static String[] fieldName(Class clazz) {
      Field[] declaredFields = clazz.getDeclaredFields();
      String[] fieldNames = new String;
      for (int i = 0; i < declaredFields.length; i++) {
            fieldNames = declaredFields.getName(); //通过反射获取属性名
      }
      return fieldNames;



    }

配置文件
server:
port: 8088
rain:
cron: 0 0 * * * ? #(每小时执行一次)
startTime: # 格式 2022-04-14 08:00:00(不填默认今日0点)
endTime: # 格式 2022-04-14 08:00:00(不填默认当前时间)
range1: false #是否查询 0 (true 查询,false 不查询)
range2: true #是否查询 0.1(true 查询,false 不查询)
range3: true #是否查询 10(true 查询,false 不查询)
range4: true #是否查询 25(true 查询,false 不查询)
range5: true #是否查询 50(true 查询,false 不查询)
range6: true #是否查询 100(true 查询,false 不查询)
range7: true #是否查询 250(true 查询,false 不查询)
water:
cron: 0 0 * * * ? #(每小时执行一次)
cron表达式是设置定时任务的,不会的可以直接在线生成
一个比较好用的在线在线生成器 https://www.bejson.com/othertools/cron/

最后生成jar包

点击开始(这个弹框不要关闭,关闭了说明就不会再执行)

定时任务默认每小时执行一次,也可以点击执行一次水情

查看水情目录文件

打开文件

点击执行一次雨情

查看雨情目录文件

打开文件

修改雨情查询参数在目录 获取数据\target\classes\application.yml

可以用记事本打开并进行修改(注意需要关闭并重启开始.bat)


最后 有需要帮做小工具或者小项目的朋友可以联系我

sanyuebeichen 发表于 2022-4-17 00:56

来学习一下

无限苦肉盖神 发表于 2022-4-17 13:37

之前毕设做过类似的

lipr_ren 发表于 2022-4-18 09:41

学习学习

smallyz 发表于 2023-10-11 14:32

太厉害了 学习
页: [1]
查看完整版本: JAVA获取广西水利各个水文站点水位和流量,各个站点的降雨量并生成Excel保存本地