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)
最后 有需要帮做小工具或者小项目的朋友可以联系我 来学习一下 之前毕设做过类似的 学习学习 太厉害了 学习
页:
[1]