diff --git a/src/main/java/com/gunshi/project/xyt/controller/WeatherController.java b/src/main/java/com/gunshi/project/xyt/controller/WeatherController.java new file mode 100644 index 0000000..c2e7047 --- /dev/null +++ b/src/main/java/com/gunshi/project/xyt/controller/WeatherController.java @@ -0,0 +1,45 @@ +package com.gunshi.project.xyt.controller; + +import com.gunshi.core.annotation.Post; +import com.gunshi.core.result.R; +import com.gunshi.project.xyt.entity.so.ShortWeatherSo; +import com.gunshi.project.xyt.entity.so.WeatherSo; +import com.gunshi.project.xyt.entity.vo.ForeRainVo; +import com.gunshi.project.xyt.service.ForecastService; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * Description: + * Created by wanyan on 2024/3/11 + * + * @author wanyan + * @version 1.0 + */ +@RestController +@RequestMapping("/weather") +@Tag(name = "天气预报") +public class WeatherController { + + + @Resource + private ForecastService forecastService; + + + @Post(path = "/fore", summary = "24小时") + public R> fore(@RequestBody WeatherSo weatherSo) { + return R.ok(forecastService.fore(weatherSo)); + } + + + @Post(path = "/short/fore", summary = "短临预报") + public R> shortFore(@RequestBody ShortWeatherSo weatherSo) { + return R.ok(forecastService.shortFore(weatherSo)); + } + +} diff --git a/src/main/java/com/gunshi/project/xyt/entity/so/ShortWeatherSo.java b/src/main/java/com/gunshi/project/xyt/entity/so/ShortWeatherSo.java new file mode 100644 index 0000000..2cd0b98 --- /dev/null +++ b/src/main/java/com/gunshi/project/xyt/entity/so/ShortWeatherSo.java @@ -0,0 +1,18 @@ +package com.gunshi.project.xyt.entity.so; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Pattern; +import lombok.Data; + + +@Data +public class ShortWeatherSo { + + + @Schema(description = "时间点(格式YYYYMMDDHHmm,mm只能取00和30)", example = "202402251100") + @NotEmpty(message = "时间点不能为空") + @Pattern(regexp = "^20[0-9]{6}[0-2][0-9]00|20[0-9]{6}[0-2][0-9]30", message = "时间格式应为:YYYYMMDDHHmm其中mm只能取00和30") + private String tm; + +} diff --git a/src/main/java/com/gunshi/project/xyt/entity/so/WeatherSo.java b/src/main/java/com/gunshi/project/xyt/entity/so/WeatherSo.java new file mode 100644 index 0000000..10ae5c7 --- /dev/null +++ b/src/main/java/com/gunshi/project/xyt/entity/so/WeatherSo.java @@ -0,0 +1,18 @@ +package com.gunshi.project.xyt.entity.so; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Pattern; +import lombok.Data; + + +@Data +public class WeatherSo { + + + @Schema(description = "时间点(tm格式YYYYMMDDHH,HH只能取08和20)",example = "2023062908") + @NotEmpty(message = "时间点不能为空") + @Pattern(regexp = "^20[0-9]{6}08|20[0-9]{6}20", message = "时间格式应为:YYYYMMDDHH其中HH只能为08或20") + private String tm; + +} diff --git a/src/main/java/com/gunshi/project/xyt/entity/vo/ForeRainTimeVo.java b/src/main/java/com/gunshi/project/xyt/entity/vo/ForeRainTimeVo.java new file mode 100644 index 0000000..f9cb9d9 --- /dev/null +++ b/src/main/java/com/gunshi/project/xyt/entity/vo/ForeRainTimeVo.java @@ -0,0 +1,31 @@ +package com.gunshi.project.xyt.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.gunshi.core.dateformat.DateFormatString; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 天气预报-水库统计 + * Created by wanyan on 2024/3/13 + * + * @author wanyan + * @version 1.0 + */ +@Data +@Builder +public class ForeRainTimeVo { + + @Schema(description = "时间") + @JsonFormat(pattern = DateFormatString.YYYY_MM_DD_HH_MM_SS, timezone = "GMT+8") + private Date tm; + + + @Schema(description = "雨量") + private BigDecimal drp; + +} diff --git a/src/main/java/com/gunshi/project/xyt/entity/vo/ForeRainVo.java b/src/main/java/com/gunshi/project/xyt/entity/vo/ForeRainVo.java new file mode 100644 index 0000000..3e8de23 --- /dev/null +++ b/src/main/java/com/gunshi/project/xyt/entity/vo/ForeRainVo.java @@ -0,0 +1,40 @@ +package com.gunshi.project.xyt.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + + +@Data +public class ForeRainVo { + private String stcd; + + private String stnm; + + private String lgtd; + private String lttd; + + @Schema(description = "1h(mm)") + private BigDecimal h1; + + @Schema(description = "3h(mm)") + private BigDecimal h3; + + @Schema(description = "6h(mm)") + private BigDecimal h6; + + @Schema(description = "12h(mm)") + private BigDecimal h12; + + @Schema(description = "24h(mm)") + private Double h24; + + @Schema(description = "2h(mm)") + private Double h2; + + @Schema(description = "逐小时雨量") + private List timeRainVos; + +} diff --git a/src/main/java/com/gunshi/project/xyt/grb/RainGrib2Layer.java b/src/main/java/com/gunshi/project/xyt/grb/RainGrib2Layer.java new file mode 100644 index 0000000..8f5f273 --- /dev/null +++ b/src/main/java/com/gunshi/project/xyt/grb/RainGrib2Layer.java @@ -0,0 +1,155 @@ +package com.gunshi.project.xyt.grb; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * Description: + * Created by wanyan on 2024/2/23 + * + * @author wanyan + * @version 1.0 + */ +@Data +public class RainGrib2Layer { + + @Schema(description = "tmRange") + private TmRange tmRange; + + @Schema(description = "data") + public BigDecimal[][] data; + + @Schema(description = "图片base64数据") + private String base64; + + @Schema(description = "x1") + private BigDecimal x1; + + @Schema(description = "x2") + private BigDecimal x2; + + @Schema(description = "y1") + private BigDecimal y1; + + @Schema(description = "y2") + private BigDecimal y2; + + @Schema(description = "dw") + private BigDecimal dw; + + @Schema(description = "dh") + private BigDecimal dh; + + @Schema(description = "nw") + private int nw; + + @Schema(description = "nh") + private int nh; + +// public RainGrib2Layer createSubset(Double bx1, Double by1, Double bx2, Double by2) { +// int ix1 = 0, ix2 = nw - 1, iy1 = 0, iy2 = nh - 1; +// if (bx1 != null && bx1 > x1) { +// ix1 = (int)((nw - 1) * (bx1 - x1) / (x2 - x1)); +// } +// if (by1 != null && by1 > y1) { +// iy1 = (int)((nh - 1) * (by1 - y1) / (y2 - y1)); +// } +// if (bx2 != null && bx2 < x2) { +// ix2 = (int)Math.ceil((nw - 1) * (bx2 - x1) / (x2 - x1)); +// } +// if (by2 != null && by2 < y2) { +// iy2 = (int)Math.ceil((nh - 1) * (by2 - y1) / (y2 - y1)); +// } +// +// RainGrib2Layer ret = new RainGrib2Layer(); +// +// ret.tmRange = (TmRange) tmRange.clone(); +// ret.x1 = x1 + ix1 * dw; +// ret.y1 = y1 + iy1 * dh; +// ret.x2 = x1 + ix2 * dw; +// ret.y2 = y1 + iy2 * dh; +// ret.nw = ix2 - ix1 + 1; +// ret.nh = iy2 - iy1 + 1; +// ret.dw = dw; +// ret.dh = dh; +// ret.data = new float[ret.nh][ret.nw]; +// for (int iy = iy1; iy <= iy2; iy += 1) { +// for (int ix = ix1; ix <= ix2; ix += 1) { +// ret.data[iy - iy1][ix - ix1] = data[iy][ix]; +// } +// } +// +// return ret; +// } +// +// boolean setContent(Grib2FrameParams frame, Grib2LayerParams layer, byte[] bin) { +// if (layer.calDataLen() != bin.length) { +// return false; +// } +// +// x1 = frame.x1; +// x2 = frame.x2; +// y1 = frame.y1; +// y2 = frame.y2; +// nw = frame.nw; +// nh = frame.nh; +// dw = frame.dw; +// dh = frame.dh; +// tmRange = (TmRange) layer.tmRange.clone(); +// data = new float[nh][nw]; +// +// float decimalScale = layer.getDecimalScale(); +// float binaryScale = layer.getBinaryScale(); +// +// boolean constValue = layer.numBits == 0; +// float RValue = layer.R; +// +// try { +// BitInputStream bis = new BitInputStream(new ByteArrayInputStream(bin),null); +// for (int iy = 0; iy < nh; iy++) { +// for (int ix = 0; ix < nw; ix++) { +// if (constValue) { +// data[iy][ix] = RValue; +// } else { +// long v = bis.readBits(layer.numBits); +// double value = decimalScale * (layer.R + v * binaryScale); +// +// data[iy][ix] = (float)value; +// } +// } +// } +// bis.close(); +// return true; +// } catch (Exception e) { +// e.printStackTrace(); +// return false; +// } +// } +// +// @Override +// public Object clone() { +// RainGrib2Layer ret = new RainGrib2Layer(); +// +// ret.tmRange = (TmRange) tmRange.clone(); +// ret.x1 = x1; +// ret.y1 = y1; +// ret.x2 = x2; +// ret.y2 = y2; +// ret.nw = nw; +// ret.nh = nh; +// ret.dw = dw; +// ret.dh = dh; +// ret.data = new float[nh][nw]; +// for (int iy = 0; iy < nh; iy += 1) { +// for (int ix = 0; ix < nw; ix += 1) { +// ret.data[iy][ix] = data[iy][ix]; +// } +// } +// +// return ret; +// } + + +} diff --git a/src/main/java/com/gunshi/project/xyt/grb/TmRange.java b/src/main/java/com/gunshi/project/xyt/grb/TmRange.java new file mode 100644 index 0000000..e81b57d --- /dev/null +++ b/src/main/java/com/gunshi/project/xyt/grb/TmRange.java @@ -0,0 +1,53 @@ +package com.gunshi.project.xyt.grb; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +/** + * Description: + * Created by wanyan on 2024/2/23 + * + * @author wanyan + * @version 1.0 + */ +@Data +public class TmRange { + + public static final String TM_FORMAT = "yyyyMMddHH"; + + public static final String TM_FORMAT_RADAR = "yyyyMMddHHmm"; + + @Schema(description = "startTm") + private Date startTm; + + @Schema(description = "offset") + private int offset; + + @Schema(description = "interval") + private int interval; + + @Schema(description = "tm1") + private Date tm1; + + @Schema(description = "tm2") + private Date tm2; + + @Schema(description = "key") + private String key; + + + @Override + public Object clone() { + TmRange ret = new TmRange(); + ret.startTm = (Date)startTm.clone(); + ret.offset = offset; + ret.tm1 = (Date)tm1.clone(); + ret.tm2 = (Date)tm2.clone(); + ret.interval = interval; + ret.key = key; + return ret; + } + +} diff --git a/src/main/java/com/gunshi/project/xyt/mapper/RealRainMapper.java b/src/main/java/com/gunshi/project/xyt/mapper/RealRainMapper.java index 0205888..4de16a4 100644 --- a/src/main/java/com/gunshi/project/xyt/mapper/RealRainMapper.java +++ b/src/main/java/com/gunshi/project/xyt/mapper/RealRainMapper.java @@ -1,5 +1,6 @@ package com.gunshi.project.xyt.mapper; +import com.gunshi.project.xyt.entity.vo.ForeRainVo; import com.gunshi.project.xyt.entity.vo.RealRainListVo; import com.gunshi.project.xyt.entity.vo.StPptnVo; import com.gunshi.project.xyt.model.StPptnRD; @@ -119,4 +120,16 @@ public interface RealRainMapper { """) StPptnRReal queryPptnByStcd(@Param("stcd") String stcd); + + @Select(""" + + """) + List querySttpList(); } diff --git a/src/main/java/com/gunshi/project/xyt/model/RescueTeamB.java b/src/main/java/com/gunshi/project/xyt/model/RescueTeamB.java index 4cadb8d..c408083 100644 --- a/src/main/java/com/gunshi/project/xyt/model/RescueTeamB.java +++ b/src/main/java/com/gunshi/project/xyt/model/RescueTeamB.java @@ -15,6 +15,7 @@ import jakarta.validation.constraints.Size; import lombok.Data; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; import java.util.List; @@ -60,14 +61,14 @@ public class RescueTeamB implements Serializable, AbstractModelWithAttachService */ @TableField(value="lgtd") @Schema(description="经度 (°)") - private String lgtd; + private BigDecimal lgtd; /** * 纬度 (°) */ @TableField(value="lttd") @Schema(description="纬度 (°)") - private String lttd; + private BigDecimal lttd; /** * 管理单位 @@ -98,7 +99,7 @@ public class RescueTeamB implements Serializable, AbstractModelWithAttachService */ @TableField(value="register_date") @Schema(description="登记日期") - @JsonFormat(pattern = DateFormatString.YYYY_MM_DD_HH_MM_SS, timezone = "GMT+8") + @JsonFormat(pattern = DateFormatString.YYYY_MM_DD, timezone = "GMT+8") private Date registerDate; /** @@ -106,7 +107,7 @@ public class RescueTeamB implements Serializable, AbstractModelWithAttachService */ @TableField(value="valid_start_date") @Schema(description="有效期开始时间") - @JsonFormat(pattern = DateFormatString.YYYY_MM_DD_HH_MM_SS, timezone = "GMT+8") + @JsonFormat(pattern = DateFormatString.YYYY_MM_DD, timezone = "GMT+8") private Date validStartDate; /** @@ -114,7 +115,7 @@ public class RescueTeamB implements Serializable, AbstractModelWithAttachService */ @TableField(value="valid_end_date") @Schema(description="有效期结束时间") - @JsonFormat(pattern = DateFormatString.YYYY_MM_DD_HH_MM_SS, timezone = "GMT+8") + @JsonFormat(pattern = DateFormatString.YYYY_MM_DD, timezone = "GMT+8") private Date validEndDate; /** diff --git a/src/main/java/com/gunshi/project/xyt/service/ForecastService.java b/src/main/java/com/gunshi/project/xyt/service/ForecastService.java new file mode 100644 index 0000000..423204b --- /dev/null +++ b/src/main/java/com/gunshi/project/xyt/service/ForecastService.java @@ -0,0 +1,247 @@ +package com.gunshi.project.xyt.service; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.gunshi.project.xyt.entity.so.ShortWeatherSo; +import com.gunshi.project.xyt.entity.so.WeatherSo; +import com.gunshi.project.xyt.entity.vo.ForeRainTimeVo; +import com.gunshi.project.xyt.entity.vo.ForeRainVo; +import com.gunshi.project.xyt.grb.RainGrib2Layer; +import com.gunshi.project.xyt.mapper.RealRainMapper; +import jakarta.annotation.Resource; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.stream.Collectors; + +/** + * Description: + * Created by wanyan on 2024/3/13 + * + * @author wanyan + * @version 1.0 + */ +@Service +@Data +@Slf4j +public class ForecastService { + + @Value("${shqxjsCloudowrCnPath}") + private String shqxjsCloudowrCnPath;//获取气象预报文件名接口 http://shqxjs.cloudowr.cn/service/ + + + public static String grbgetName = "grb/get"; + + public static String radargetName = "radar/get"; + + public static String getData = "res/grblayerset"; + + public static String getRadarData = "res/radarlayer"; + + public static Double x1 = 108.62318959955861; + public static Double y1 = 29.328651167767397; + public static Double x2 = 109.33730092768361; + public static Double y2 = 30.04791233720099; + + public static String totalLayers = "00.24";//只取24小时每个网格的总量 + + public static String detailLayers = "00.24,00.01,01.01,02.01,03.01,04.01,05.01,06.01,07.01,08.01,09.01,10.01,11.01,12.01,13.01,14.01,15.01,16.01,17.01,18.01,19.01,20.01,21.01,22.01,23.01,24.01"; + + @Resource + private RealRainMapper realRainMapper; + + + + private List calcDrp(List gribList,List rainLevelVos){ + if(CollectionUtils.isEmpty(gribList)){ + throw new IllegalArgumentException("该时间无预报数据"); + } + RainGrib2Layer layer = gribList.get(0); + BigDecimal dh = layer.getDh(); + BigDecimal dw = layer.getDw(); + int nh = layer.getNh();//横向格子数 + int nw = layer.getNw();//纵向格子数 + //网格左下角经纬度 + BigDecimal x11 = layer.getX1(); + BigDecimal y11 = layer.getY1(); + harry : for(ForeRainVo vo : rainLevelVos){ + BigDecimal lgtd = new BigDecimal(vo.getLgtd()); + BigDecimal lttd = new BigDecimal(vo.getLttd()); + for(int i = 0;i < nh;i++){ + for(int j=0;j< nw;j++){ + BigDecimal xMin = x11.add(dh.multiply(BigDecimal.valueOf(i))); + BigDecimal xMax = x11.add(dh.multiply(BigDecimal.valueOf(i+1))); + BigDecimal yMin = y11.add(dw.multiply(BigDecimal.valueOf(j))); + BigDecimal yMax = y11.add(dw.multiply(BigDecimal.valueOf(j+1))); + if(lgtd.compareTo(xMin)>=0 && lgtd.compareTo(xMax)<0 && lttd.compareTo(yMin)>=0 && lttd.compareTo(yMax)<0){ + vo.setH2(layer.data[j][i].doubleValue()); + continue harry; + } + } + } + } + + return rainLevelVos; + } + + /** + * 获取24小时气象的网格数据 + * @param tm + * @return + */ + private List getGribData(String tm,Boolean isOnlyQueryTotal){ + List list = new ArrayList<>(); + String grbLatestUrl = shqxjsCloudowrCnPath + grbgetName + "?tm=" + tm; + HttpClient httpClient = HttpClientBuilder.create().build(); + HttpGet httpGet = new HttpGet(grbLatestUrl); + try { + HttpResponse httpResponse = httpClient.execute(httpGet); + HttpEntity entity = httpResponse.getEntity(); + JSONObject jsonObject = JSONUtil.parseObj(EntityUtils.toString(entity)); + JSONObject data = jsonObject.getJSONObject("data"); + if (data == null) { + throw new IllegalArgumentException("该时间无预报数据"); + }; + String rainFile = data.getStr("rainFile"); + String layers = detailLayers; + if(isOnlyQueryTotal){ + layers = totalLayers; + } + String grblayersetUrl = shqxjsCloudowrCnPath + getData + "?filename="+rainFile + "&x1=" + x1+ "&y1=" + y1+ "&x2=" + x2+ "&y2=" + y2+"&layers="+layers; + HttpGet grbData = new HttpGet(grblayersetUrl); + HttpResponse responseForGrb = httpClient.execute(grbData); + HttpEntity entityForGrb = responseForGrb.getEntity(); + + JSONObject grbObject = JSONUtil.parseObj(EntityUtils.toString(entityForGrb)); + + JSONArray grbArrData = grbObject.getJSONArray("data"); + if (grbArrData == null) return list; + list = grbArrData.toList(RainGrib2Layer.class); + + } catch (IOException e) { + e.printStackTrace(); + } + return list; + } + + + /** + * 获取短临气象的网格数据 + * @param tm + * @return + */ + private RainGrib2Layer getRadarData(String tm){ + RainGrib2Layer rainGrib2Layer = new RainGrib2Layer(); + String radarLatestUrl = shqxjsCloudowrCnPath + radargetName + "?tm=" + tm; + HttpClient httpClient = HttpClientBuilder.create().build(); + HttpGet httpGet = new HttpGet(radarLatestUrl); + try { + HttpResponse httpResponse = httpClient.execute(httpGet); + HttpEntity entity = httpResponse.getEntity(); + JSONObject jsonObject = JSONUtil.parseObj(EntityUtils.toString(entity)); + JSONObject data = jsonObject.getJSONObject("data"); + if (data == null) { + throw new IllegalArgumentException("该时间无预报数据"); + }; + String rainFile = data.getStr("rainFile"); + String radarUrl = shqxjsCloudowrCnPath + getRadarData + "?filename="+rainFile + "&x1=" + x1+ "&y1=" + y1+ "&x2=" + x2+ "&y2=" + y2; + HttpGet radarData = new HttpGet(radarUrl); + HttpResponse responseForRadar = httpClient.execute(radarData); + HttpEntity entityForRadar = responseForRadar.getEntity(); + JSONObject radarObject = JSONUtil.parseObj(EntityUtils.toString(entityForRadar)); + rainGrib2Layer = radarObject.get("data",RainGrib2Layer.class); + } catch (IOException e) { + e.printStackTrace(); + } + return rainGrib2Layer; + } + + + public List shortFore(ShortWeatherSo weatherSo) { + List rainLevelVos = realRainMapper.querySttpList(); + List gribList = Arrays.asList(getRadarData(weatherSo.getTm())); + return calcDrp(gribList,rainLevelVos); + } + + public List fore(WeatherSo weatherSo) { + List rainLevelVos = realRainMapper.querySttpList(); + return commonDataHandle(weatherSo,rainLevelVos); + } + + private List commonDataHandle(WeatherSo weatherSo,List list){ + List gribList = getGribData(weatherSo.getTm(),false); + if(CollectionUtils.isEmpty(list)){ + return list; + } + //24小时每个网格的总量 + List total = gribList.stream().filter(o -> o.getTmRange().getInterval() == 24).collect(Collectors.toList()); + //24小时每个网格的逐小时雨量 + List detail = gribList.stream().filter(o -> o.getTmRange().getInterval() == 1).collect(Collectors.toList()); + for(ForeRainVo vo : list){ + List resultList = getData(vo,total,detail); + vo.setTimeRainVos(resultList); + vo.setH1(resultList.get(0).getDrp()); + List list3=resultList.subList(0, Math.min(3, list.size())); + vo.setH3(list3.stream().map(ForeRainTimeVo::getDrp).reduce(BigDecimal.ZERO, BigDecimal::add)); + List list6=resultList.subList(0, Math.min(6, list.size())); + vo.setH6(list6.stream().map(ForeRainTimeVo::getDrp).reduce(BigDecimal.ZERO, BigDecimal::add)); + List list12=resultList.subList(0, Math.min(12, list.size())); + vo.setH12(list12.stream().map(ForeRainTimeVo::getDrp).reduce(BigDecimal.ZERO, BigDecimal::add)); + } + return list.stream().sorted(Comparator.comparing(ForeRainVo::getH24).reversed()).collect(Collectors.toList()); + } + + private List getData(ForeRainVo vo, List total,List detail) { + List result = new ArrayList<>(); + RainGrib2Layer layer = total.get(0); + BigDecimal dh = layer.getDh(); + BigDecimal dw = layer.getDw(); + int nh = layer.getNh();//横向格子数 + int nw = layer.getNw();//纵向格子数 + //网格左下角经纬度 + BigDecimal x11 = layer.getX1(); + BigDecimal y11 = layer.getY1(); + BigDecimal lgtd = new BigDecimal(vo.getLgtd()); + BigDecimal lttd = new BigDecimal(vo.getLttd()); + int rownum = 0; + int colnum = 0; + for(int i = 0;i < nh;i++){ + for(int j=0;j< nw;j++){ + BigDecimal xMin = x11.add(dh.multiply(BigDecimal.valueOf(i))); + BigDecimal xMax = x11.add(dh.multiply(BigDecimal.valueOf(i+1))); + BigDecimal yMin = y11.add(dw.multiply(BigDecimal.valueOf(j))); + BigDecimal yMax = y11.add(dw.multiply(BigDecimal.valueOf(j+1))); + if(lgtd.compareTo(xMin)>=0 && lgtd.compareTo(xMax)<0 && lttd.compareTo(yMin)>=0 && lttd.compareTo(yMax)<0){ + rownum = j; + colnum = i; + vo.setH24(layer.data[rownum][colnum].doubleValue()); + break; + } + } + } + for(RainGrib2Layer lay : detail){ + result.add(ForeRainTimeVo.builder().tm(lay.getTmRange().getTm2()).drp(lay.data[rownum][colnum]).build()); + } + Map sumByGroup = result.stream() + .collect(Collectors.groupingBy(ForeRainTimeVo::getTm, Collectors.mapping(ForeRainTimeVo::getDrp, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)))); + List resultList = sumByGroup.entrySet().stream() + .map(entry -> ForeRainTimeVo.builder().tm(entry.getKey()).drp(entry.getValue().divide(new BigDecimal(1),1, RoundingMode.UP)).build()) + .sorted(Comparator.comparing(ForeRainTimeVo::getTm)) + .collect(Collectors.toList()); + return resultList; + } +} diff --git a/src/main/resources/config-common.yml b/src/main/resources/config-common.yml index aebabcd..697792f 100644 --- a/src/main/resources/config-common.yml +++ b/src/main/resources/config-common.yml @@ -25,3 +25,5 @@ gunshi: publicBucket: test.by-lyf.tmp loginBucket: test.by-lyf.tmp privateBucket: test.by-lyf.tmp + +shqxjsCloudowrCnPath: http://shqxjs.cloudowr.cn/service/