From d987c117ac692e38554ea026029a4bf3b4de862a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?sanguu=28=EB=B0=95=EC=83=81=ED=98=84=29?= Date: Thu, 3 Nov 2022 10:57:25 +0900 Subject: [PATCH] =?UTF-8?q?=EB=93=9C=EB=A1=A0=20=EA=B4=80=EC=A0=9C=20?= =?UTF-8?q?=EC=8B=9C=EC=8A=A4=ED=85=9C=20=EB=82=A0=EC=94=A8=20API=20?= =?UTF-8?q?=EC=97=B0=EB=8F=99=20=EC=B5=9C=EC=A2=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cntrl/controller/CtrCntrlController.java | 102 +++++++++-- .../ctr/cntrl/model/CtrCntrlWeatherModel.java | 13 +- .../ctr/cntrl/service/CtrCntrlService.java | 169 +++++++++++++----- 3 files changed, 219 insertions(+), 65 deletions(-) diff --git a/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java b/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java index a8ef363..d8af247 100644 --- a/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java +++ b/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java @@ -6,9 +6,10 @@ import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.*; import com.palnet.biz.api.ctr.cntrl.model.*; import io.swagger.annotations.ApiImplicitParam; @@ -17,6 +18,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; +import org.locationtech.jts.geom.Coordinate; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -121,14 +123,94 @@ public class CtrCntrlController { @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") public ResponseEntity restApiGetWeather(CtrCntrlWeatherModel rs) throws IOException, ParseException { StringBuilder urlBuilder = new StringBuilder("http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst"); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + Calendar c1 = Calendar.getInstance(); + String strToday = sdf.format(c1.getTime()); + // 현재 시간 + LocalTime now = LocalTime.now(); + + // 현재시간 출력 + + // 시, 분, 초 구하기 + int hour = now.getHour(); + int minute = now.getMinute(); + int length = (int)(Math.log10(minute)+1); + int hourlength = (int)(Math.log10(hour)+1); + String strminute = Integer.toString(minute); + String strhour = Integer.toString(hour); + String basetime = null; + + if(length<=1){ + strminute = 0+Integer.toString(minute); + }if(hourlength<=1){ + strhour = 0+Integer.toString(hour); + } + // 시, 분, 초 출력 + if ((Integer.parseInt(strhour) >= 2 && Integer.parseInt(strminute )> 9) && Integer.parseInt(strhour) <= 5) { + basetime = "0200"; + } + else if ((Integer.parseInt(strhour) >= 5 && Integer.parseInt(strminute ) > 9) && Integer.parseInt(strhour) < 8) { + basetime = "0500"; + } + else if (Integer.parseInt(strhour) >= 8 && Integer.parseInt(strminute ) < 10) { + basetime = "0500"; + } + else if ((Integer.parseInt(strhour) >= 8 && Integer.parseInt(strminute ) > 9) && Integer.parseInt(strhour) < 11) { + basetime = "0800"; + } + else if (Integer.parseInt(strhour) >= 11 && Integer.parseInt(strminute ) < 10) { + basetime = "0800"; + } + else if (Integer.parseInt(strhour) >= 11 && Integer.parseInt(strhour) < 14) { + basetime = "1100"; + } + else if (Integer.parseInt(strhour) >= 14 && Integer.parseInt(strminute ) < 10) { + basetime = "1100"; + } + else if ((Integer.parseInt(strhour) >= 14 && Integer.parseInt(strminute ) > 9) && Integer.parseInt(strhour) < 17) { + basetime = "1400"; + } + else if (Integer.parseInt(strhour) >= 17 && Integer.parseInt(strminute ) < 10) { + basetime = "1400"; + } + else if ((Integer.parseInt(strhour) >= 17 && Integer.parseInt(strminute ) > 9) && Integer.parseInt(strhour) < 20) { + basetime = "1700"; + } + else if (Integer.parseInt(strhour) >= 20 && Integer.parseInt(strminute ) < 10) { + basetime = "2000"; + } + else if ((Integer.parseInt(strhour) >= 20 && Integer.parseInt(strminute ) > 9) && Integer.parseInt(strhour) < 23) { + basetime = "2000"; + } + else if (Integer.parseInt(strhour) >= 23 && Integer.parseInt(strminute ) < 10) { + basetime = "2300"; + } + else if (Integer.parseInt(strhour) >= 23 && Integer.parseInt(strminute ) > 9) { + basetime = "2300"; + } + + + List coordList = new ArrayList<>(); + Coordinate coord = new Coordinate(); + Coordinate returnCoord = new Coordinate(); + coord.setX(rs.getNx()); + coord.setY(rs.getNy()); + returnCoord = service.wheather(coord); + + double nx = returnCoord.getX(); + double ny = returnCoord.getY(); + String Snx = String.format("%.0f",nx); + String Sny = String.format("%.0f",ny); + urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=r6RMUsk3Vtama7D6uq7MiWV9dTC9MwfIIr4%2F45y0uVNw6BaYbgpKmL%2BLUDFVTfIYUmEe4K%2FaniEjdV9mg5t82Q%3D%3D"); - urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode(rs.getPageNo(),"UTF-8")); - urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode(rs.getNumOfRows(), "UTF-8")); /*한 페이지 결과 수*/ - urlBuilder.append("&" + URLEncoder.encode("dataType","UTF-8") + "=" + URLEncoder.encode(rs.getDataType(), "UTF-8")); /*요청자료형식(XML/JSON) Default: XML*/ - urlBuilder.append("&" + URLEncoder.encode("base_date","UTF-8") + "=" + URLEncoder.encode(rs.getBase_date(), "UTF-8")); /*'21년 6월 28일 발표*/ - urlBuilder.append("&" + URLEncoder.encode("base_time","UTF-8") + "=" + URLEncoder.encode(rs.getBase_time(), "UTF-8")); /*06시 발표(정시단위) */ - urlBuilder.append("&" + URLEncoder.encode("nx","UTF-8") + "=" + URLEncoder.encode(rs.getNx(), "UTF-8")); /*예보지점의 X 좌표값*/ - urlBuilder.append("&" + URLEncoder.encode("ny","UTF-8") + "=" + URLEncoder.encode(rs.getNy(), "UTF-8")); /*예보지점의 Y 좌표값*/ + urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1","UTF-8")); + urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("14", "UTF-8")); /*한 페이지 결과 수*/ + urlBuilder.append("&" + URLEncoder.encode("dataType","UTF-8") + "=" + URLEncoder.encode("JSON", "UTF-8")); /*요청자료형식(XML/JSON) Default: XML*/ + urlBuilder.append("&" + URLEncoder.encode("base_date","UTF-8") + "=" + URLEncoder.encode(strToday, "UTF-8")); /*'21년 6월 28일 발표*/ + urlBuilder.append("&" + URLEncoder.encode("base_time","UTF-8") + "=" + URLEncoder.encode(basetime, "UTF-8")); /*06시 발표(정시단위) */ + urlBuilder.append("&" + URLEncoder.encode("nx","UTF-8") + "=" + URLEncoder.encode(Snx, "UTF-8")); /*예보지점의 X 좌표값*/ + urlBuilder.append("&" + URLEncoder.encode("ny","UTF-8") + "=" + URLEncoder.encode(Sny, "UTF-8")); /*예보지점의 Y 좌표값*/ URL url = new URL(urlBuilder.toString()); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); diff --git a/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlWeatherModel.java b/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlWeatherModel.java index 9b0aaac..7b13653 100644 --- a/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlWeatherModel.java +++ b/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlWeatherModel.java @@ -4,12 +4,9 @@ import lombok.Data; @Data public class CtrCntrlWeatherModel { - private String serviceKey; - private String numOfRows; - private String pageNo; - private String dataType; - private String base_date; - private String base_time ; - private String nx; - private String ny; + private double nx; + private double ny; + private String Snx; + private String Sny; + } diff --git a/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java b/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java index 26d166d..791631d 100644 --- a/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java +++ b/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import com.palnet.biz.api.ctr.cntrl.model.*; import org.apache.commons.lang3.StringUtils; import org.locationtech.jts.geom.Coordinate; import org.springframework.beans.factory.annotation.Autowired; @@ -21,13 +22,6 @@ import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel; import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel; import com.palnet.biz.api.bas.flight.service.BasFlightMapper; import com.palnet.biz.api.comn.model.ControlGpsDataContext; -import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlArcrftWarnModel; -import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlDtlModel; -import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlGroupArcrftModel; -import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlGroupModel; -import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlPlanContainsRq; -import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlPlanContainsRs; -import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlWarnLogModel; import com.palnet.biz.jpa.entity.ComArcrftBas; import com.palnet.biz.jpa.entity.ComIdntfBas; import com.palnet.biz.jpa.entity.CtrCntrlBas; @@ -58,10 +52,10 @@ import lombok.extern.log4j.Log4j2; @Service @Log4j2 public class CtrCntrlService { - + @Autowired private JwtTokenUtil jwtTokenUtil; - + private final CtrCntrlQueryRepository query; private final CtrCntrlBasRepository cntrlBasRepository; private final CtrCntrlHstryRepository cntrlHstryRepository; @@ -101,10 +95,10 @@ public class CtrCntrlService { this.shareContext = shareContext; } - - public List getListHistory(String objectId){ + + public List getListHistory(String objectId) { List filterList = new ArrayList(); - + // if(cic.getHistoryData(objectId).size() > 0) { // resultList = cic.getHistoryData(objectId); // @@ -115,9 +109,9 @@ public class CtrCntrlService { // } // } // } - + return filterList; - + } /** @@ -127,46 +121,46 @@ public class CtrCntrlService { * @return */ public CtrCntrlDtlModel getDetail(String controlId) { - + CtrCntrlDtlModel result; - + result = query.detailCntrl(controlId); - + List areaList = query.detailArea(controlId); String stAreaNm = ""; - if ( result.getHpno() == null || result.getHpno().isEmpty()) { - }else{ + if (result.getHpno() == null || result.getHpno().isEmpty()) { + } else { result.setHpno(EncryptUtils.decrypt(result.getHpno())); } - - for(CtrCntrlHstryArea data : areaList) { - if(data.getActnType().equals("01")) { - if(!StringUtils.isEmpty(data.getArea1())) { + + for (CtrCntrlHstryArea data : areaList) { + if (data.getActnType().equals("01")) { + if (!StringUtils.isEmpty(data.getArea1())) { stAreaNm = stAreaNm + " " + data.getArea1(); } - - if(!StringUtils.isEmpty(data.getArea2())) { + + if (!StringUtils.isEmpty(data.getArea2())) { stAreaNm = stAreaNm + " " + data.getArea2(); } - - if(!StringUtils.isEmpty(data.getArea3())) { + + if (!StringUtils.isEmpty(data.getArea3())) { stAreaNm = stAreaNm + " " + data.getArea3(); } - - if(!StringUtils.isEmpty(data.getLandNm())) { + + if (!StringUtils.isEmpty(data.getLandNm())) { stAreaNm = stAreaNm + " " + data.getLandNm(); } - - if(!StringUtils.isEmpty(data.getLandNum())) { + + if (!StringUtils.isEmpty(data.getLandNum())) { stAreaNm = stAreaNm + " " + data.getLandNum(); } } } - + result.setStAreaNm(stAreaNm); - + return result; } @@ -187,16 +181,16 @@ public class CtrCntrlService { * @return */ public List getGroupAuthInfo() { - + List list = query.findByGroupInfo(); - List arcrftList= new ArrayList<>(); - if(list.size()>0) { - for(CtrCntrlGroupModel lists : list) { + List arcrftList = new ArrayList<>(); + if (list.size() > 0) { + for (CtrCntrlGroupModel lists : list) { List groupArcrft = query.findByGroupArcrft(lists.getGroupId()); arcrftList.addAll(groupArcrft); } } - return arcrftList; + return arcrftList; } /** @@ -208,16 +202,16 @@ public class CtrCntrlService { public List getWarnLog(String controlId) { List logs = warnLogRepository.findAllByCntrlId(controlId); List warnLog = new ArrayList<>(); - + for (CtrCntrlWarnLog log : logs) { CtrCntrlWarnLogModel model = new CtrCntrlWarnLogModel(); - + model.setCntrlId(log.getCntrlId()); model.setCreateDt(log.getCreateDt()); model.setWarnLogSno(log.getWarnLogSno()); model.setWarnType(log.getWarnType()); model.setIdntfNum(log.getIdntfNum()); - + warnLog.add(model); } @@ -227,6 +221,7 @@ public class CtrCntrlService { /** * TODO 기체 별 최신 비정상 로그 및 비정상 로그 전체 개수 + * * @param id * @return */ @@ -237,7 +232,7 @@ public class CtrCntrlService { if ("".equals(id) || id == null) return null; - String[] ids = id.indexOf(",") > -1 ? id.split(",") : new String[] {id}; + String[] ids = id.indexOf(",") > -1 ? id.split(",") : new String[]{id}; for (String cntrlId : ids) { CtrCntrlArcrftWarnModel model = new CtrCntrlArcrftWarnModel(); @@ -299,7 +294,7 @@ public class CtrCntrlService { * @param idntfNum * @return */ - public List getFlightPlan(String idntfNum) { + public List getFlightPlan(String idntfNum) { List rs = new ArrayList<>(); Date fltNowDt = DateUtils.nowDate(); @@ -320,7 +315,7 @@ public class CtrCntrlService { FltPlanBas plan = planBasRepository. findByGroupFlightPlan(arcrft.getPlanSno(), "Y", fltNowDt).orElse(null); - if (plan != null ) { + if (plan != null) { BasFlightPlanModel planMapping = BasFlightMapper.mapper.entityToModel(plan); // 비행 계획서 구역 조회 @@ -345,7 +340,7 @@ public class CtrCntrlService { areaMapping.setCoordList(coordListMapping); // Buffer 영역 생성 저장 - if("LINE".equals(area.getAreaType())) { + if ("LINE".equals(area.getAreaType())) { List convertCoordinates = areaUtils.convertCoordinates(areaMapping.getCoordList()); List transCoordList = areaUtils.transform(convertCoordinates, "EPSG:4326", "EPSG:5181"); @@ -386,7 +381,7 @@ public class CtrCntrlService { int countSuccess = 0; if (rq.getIdntfNum() != null) { - for (BasFlightPlanModel plan : rq.getPlanList()) { + for (BasFlightPlanModel plan : rq.getPlanList()) { for (BasFlightPlanAreaModel area : plan.getAreaList()) { List planArea = areaUtils.convertCoordinates(area.getCoordList()); @@ -463,7 +458,7 @@ public class CtrCntrlService { if ("01".equals(latestControl.getEndTypeCd()) || diffMinute > 5) { isControl = false; } - if(!"01".equals(latestControl.getEndTypeCd()) && diffMinute < 5) { + if (!"01".equals(latestControl.getEndTypeCd()) && diffMinute < 5) { isControl = true; } } else { @@ -510,4 +505,84 @@ public class CtrCntrlService { return result; } + + public Coordinate wheather(Coordinate coord) { + double nx; + double ny; + nx = coord.getX(); + ny = coord.getY(); + double RE = 6371.00877; // 지구 반경(km) + double GRID = 5.0; // 격자 간격(km) + double SLAT1 = 30.0; // 투영 위도1(degree) + double SLAT2 = 60.0; // 투영 위도2(degree) + double OLON = 126.0; // 기준점 경도(degree) + double OLAT = 38.0; // 기준점 위도(degree) + double XO = 43; // 기준점 X좌표(GRID) + double YO = 136; // 기1준점 Y좌표(GRID) + + // + // LCC DFS 좌표변환 ( code : "TO_GRID"(위경도->좌표, lat_X:위도, lng_Y:경도), "TO_GPS"(좌표->위경도, lat_X:x, lng_Y:y) ) + // + + double DEGRAD = Math.PI / 180.0; + double RADDEG = 180.0 / Math.PI; + + double re = RE / GRID; + double slat1 = SLAT1 * DEGRAD; + double slat2 = SLAT2 * DEGRAD; + double olon = OLON * DEGRAD; + double olat = OLAT * DEGRAD; + + double sn = Math.tan(Math.PI * 0.25 + slat2 * 0.5) / Math.tan(Math.PI * 0.25 + slat1 * 0.5); + sn = Math.log(Math.cos(slat1) / Math.cos(slat2)) / Math.log(sn); + double sf = Math.tan(Math.PI * 0.25 + slat1 * 0.5); + sf = Math.pow(sf, sn) * Math.cos(slat1) / sn; + double ro = Math.tan(Math.PI * 0.25 + olat * 0.5); + ro = re * sf / Math.pow(ro, sn); + + double theta; + if (true) { + nx = nx; + ny = ny; + double ra = Math.tan(Math.PI * 0.25 + (nx) * DEGRAD * 0.5); + ra = re * sf / Math.pow(ra, sn); + theta = ny * DEGRAD - olon; + if (theta > Math.PI) theta -= 2.0 * Math.PI; + if (theta < -Math.PI) theta += 2.0 * Math.PI; + theta *= sn; + nx = Math.floor(ra * Math.sin(theta) + XO + 0.5); + ny = Math.floor(ro - ra * Math.cos(theta) + YO + 0.5); + } else { + nx = nx; + ny = ny; + double xn = nx - XO; + double yn = ro - ny + YO; + double ra = Math.sqrt(xn * xn + yn * yn); + if (sn < 0.0) { + ra = -ra; + } + + double alat = Math.pow((re * sf / ra), (1.0 / sn)); + alat = 2.0 * Math.atan(alat) - Math.PI * 0.5; + + if (Math.abs(xn) <= 0.0) { + theta = 0.0; + } else { + if (Math.abs(yn) <= 0.0) { + theta = Math.PI * 0.5; + if (xn < 0.0) { + theta = -theta; + } + } else theta = Math.atan2(xn, yn); + } + double alon = theta / sn + olon; + nx = alat * RADDEG; + ny = alon * RADDEG; + } + + Coordinate returnCoord = new Coordinate(); + returnCoord.setX(nx); + returnCoord.setY(ny); + return returnCoord; + } }