From a2ee6e0dcdcfd9d1b8011a3cecb4e0fc4f6eeea3 Mon Sep 17 00:00:00 2001 From: dcb <xgybdcb@163.com> Date: 星期五, 06 六月 2025 18:10:32 +0800 Subject: [PATCH] 实时模拟功能实现 --- src/main/java/com/se/nsl/controller/SimuController.java | 94 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 92 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/se/nsl/controller/SimuController.java b/src/main/java/com/se/nsl/controller/SimuController.java index 51e9489..8477d8b 100644 --- a/src/main/java/com/se/nsl/controller/SimuController.java +++ b/src/main/java/com/se/nsl/controller/SimuController.java @@ -1,20 +1,31 @@ package com.se.nsl.controller; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.se.nsl.domain.po.Simu; import com.se.nsl.domain.po.SimuData; import com.se.nsl.domain.vo.R; +import com.se.nsl.domain.vo.RealTimeInput; +import com.se.nsl.domain.vo.SimuResult; import com.se.nsl.domain.vo.SimuVo; import com.se.nsl.service.ResolveService; import com.se.nsl.service.SimuService; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.gdal.ogr.Geometry; +import org.gdal.ogr.ogr; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; import java.util.List; @Api(tags = "03锛嶆帹婕旀ā鎷�") @@ -85,10 +96,22 @@ SimuData data = JSON.parseObject(simu.getData(), SimuData.class); if (null == data) return fail("data鏁版嵁鏍煎紡(JSON)涓嶆纭�"); + if (StringUtils.isEmpty(simu.getGeom())) return fail("geom瀛楃涓蹭笉鏄疻KT鏍煎紡"); + + Geometry geom = Geometry.CreateFromWkt(simu.getGeom()); + if (!(geom.GetGeometryType() == ogr.wkbMultiPolygon || geom.GetGeometryType() == ogr.wkbPolygon)) + return fail("geom瀵硅薄涓嶆槸澶氳竟褰�"); int rows = simuService.insert(simu); + System.out.println(String.format("id:%s", simu.getId())); - return success(rows); + if (rows > 0 && (null == data.getRainfalls() || data.getRainfalls().size() < 2)) { + resolveService.createRainfall(simu); + simuService.updateById(simu); + } + JSONObject json = new JSONObject(); + json.put("id", simu.getId()); + return success(json); } catch (Exception ex) { return fail(ex, null); } @@ -107,7 +130,7 @@ SimuData data = JSON.parseObject(simu.getData(), SimuData.class); if (null == data) return fail("鏂规鏁版嵁鏍煎紡(JSON)涓嶆纭�"); - if (simu.getStatus() != 0) return fail("鏂规姝e湪杩愯鎴栧凡瀹屾垚"); + //if (simu.getStatus() != 0) return fail("鏂规姝e湪杩愯鎴栧凡瀹屾垚"); if (StringUtils.isEmpty(simu.getGeom())) return fail("鏂规鐨勫浘褰负绌�"); int rows = resolveService.start(simu); @@ -128,9 +151,76 @@ @PutMapping(value = "/updateById", produces = "application/json; charset=UTF-8") public R<Object> updateById(@RequestBody Simu simu) { try { + if (StringUtils.isEmpty(simu.getData())) return fail("data涓虹┖"); + + SimuData data = JSON.parseObject(simu.getData(), SimuData.class); + if (null == data) return fail("data鏁版嵁鏍煎紡(JSON)涓嶆纭�"); + if (StringUtils.isEmpty(simu.getGeom())) return fail("geom瀛楃涓蹭笉鏄疻KT鏍煎紡"); + + Geometry geom = Geometry.CreateFromWkt(simu.getGeom()); + if (!(geom.GetGeometryType() == ogr.wkbMultiPolygon || geom.GetGeometryType() == ogr.wkbPolygon)) + return fail("geom瀵硅薄涓嶆槸澶氳竟褰�"); + + if (null == data.getRainfalls() || data.getRainfalls().size() < 2) resolveService.createRainfall(simu); + return success(simuService.updateById(simu)); } catch (Exception ex) { return fail(ex, null); } } + + @ApiOperation(value = "position") + @GetMapping("/position") + public R<Object> queryByPosition(double lon, double lat, Long time, String serviceName) { + if (lon > 180 || lon < -180) { + return clientError("缁忓害鑼冨洿搴旇鍦�-180鍒�180"); + } + if (lat > 90 || lat < -90) { + return clientError("绾害鑼冨洿搴旇鍦�-90鍒�90"); + } + if (time == null) { + return clientError("鏃堕棿鎴充笉鑳戒负绌�"); + } + if (serviceName == null || serviceName.trim().isEmpty()) { + return clientError("鏈嶅姟鍚嶄笉鑳戒负绌�"); + } + SimuResult result = simuService.queryByPosition(lon, lat, time, serviceName); + if (result == null) { + return notFound("鏈煡鎵惧埌鐩稿叧鏁版嵁"); + } + return success(result); + } + + @ApiOperation(value = "realTime") + @ApiImplicitParams({ + @ApiImplicitParam(name = "date1", value = "5鍒嗛挓鍓嶇殑鏃堕棿锛屾牸寮忎负2025-05-31 14:15:20"), + @ApiImplicitParam(name = "rainfall1", value = "5鍒嗛挓鍓嶇殑闄嶉洦寮哄害"), + @ApiImplicitParam(name = "date2", value = "褰撳墠鏃堕棿锛屾牸寮忎负2025-05-31 14:20:20"), + @ApiImplicitParam(name = "rainfall2", value = "褰撳墠鐨勯檷闆ㄥ己搴�"), + @ApiImplicitParam(name = "serviceName", value = "鏈嶅姟鍚�") + }) + @GetMapping("/realTime") + public R<Object> realTimeSimulate(String date1, double rainfall1, + String date2, double rainfall2, String serviceName) { + RealTimeInput input = new RealTimeInput(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime t1 = LocalDateTime.parse(date1, formatter); + LocalDateTime t2 = LocalDateTime.parse(date2, formatter); + RealTimeInput.RealTimeData d1 = new RealTimeInput.RealTimeData(); + d1.setDateTime(t1); + d1.setIntensity(rainfall1); + RealTimeInput.RealTimeData d2 = new RealTimeInput.RealTimeData(); + d2.setDateTime(t2); + d2.setIntensity(rainfall2); + input.setData(Arrays.asList(d1, d2)); + input.setServiceName(serviceName); + + try { + String layerJsonName = resolveService.realTimeSimulate(input); + return success(layerJsonName); + } catch (IOException e) { + log.error("real-time simulate exception:", e); + return fail("瀹炴椂妯℃嫙寮傚父"); + } + } } -- Gitblit v1.9.3