Browse Source

드론 관제 시스템 날씨 API 연동 최종

Test
sanguu(박상현) 2 years ago
parent
commit
d987c117ac
  1. 102
      src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java
  2. 13
      src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlWeatherModel.java
  3. 129
      src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java

102
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.HttpURLConnection;
import java.net.URL; import java.net.URL;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.HashMap; import java.text.SimpleDateFormat;
import java.util.List; import java.time.LocalDate;
import java.util.Map; import java.time.LocalTime;
import java.util.*;
import com.palnet.biz.api.ctr.cntrl.model.*; import com.palnet.biz.api.ctr.cntrl.model.*;
import io.swagger.annotations.ApiImplicitParam; 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.JSONObject;
import org.json.simple.parser.JSONParser; import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException; import org.json.simple.parser.ParseException;
import org.locationtech.jts.geom.Coordinate;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@ -121,14 +123,94 @@ public class CtrCntrlController {
@Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API") @Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API")
public ResponseEntity<? extends BasicResponse> restApiGetWeather(CtrCntrlWeatherModel rs) throws IOException, ParseException { public ResponseEntity<? extends BasicResponse> restApiGetWeather(CtrCntrlWeatherModel rs) throws IOException, ParseException {
StringBuilder urlBuilder = new StringBuilder("http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst"); 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<Coordinate> 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("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("pageNo","UTF-8") + "=" + URLEncoder.encode("1","UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode(rs.getNumOfRows(), "UTF-8")); /*한 페이지 결과 수*/ urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("14", "UTF-8")); /*한 페이지 결과 수*/
urlBuilder.append("&" + URLEncoder.encode("dataType","UTF-8") + "=" + URLEncoder.encode(rs.getDataType(), "UTF-8")); /*요청자료형식(XML/JSON) Default: XML*/ 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(rs.getBase_date(), "UTF-8")); /*'21년 6월 28일 발표*/ 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(rs.getBase_time(), "UTF-8")); /*06시 발표(정시단위) */ urlBuilder.append("&" + URLEncoder.encode("base_time","UTF-8") + "=" + URLEncoder.encode(basetime, "UTF-8")); /*06시 발표(정시단위) */
urlBuilder.append("&" + URLEncoder.encode("nx","UTF-8") + "=" + URLEncoder.encode(rs.getNx(), "UTF-8")); /*예보지점의 X 좌표값*/ urlBuilder.append("&" + URLEncoder.encode("nx","UTF-8") + "=" + URLEncoder.encode(Snx, "UTF-8")); /*예보지점의 X 좌표값*/
urlBuilder.append("&" + URLEncoder.encode("ny","UTF-8") + "=" + URLEncoder.encode(rs.getNy(), "UTF-8")); /*예보지점의 Y 좌표값*/ urlBuilder.append("&" + URLEncoder.encode("ny","UTF-8") + "=" + URLEncoder.encode(Sny, "UTF-8")); /*예보지점의 Y 좌표값*/
URL url = new URL(urlBuilder.toString()); URL url = new URL(urlBuilder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET"); conn.setRequestMethod("GET");

13
src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlWeatherModel.java

@ -4,12 +4,9 @@ import lombok.Data;
@Data @Data
public class CtrCntrlWeatherModel { public class CtrCntrlWeatherModel {
private String serviceKey; private double nx;
private String numOfRows; private double ny;
private String pageNo; private String Snx;
private String dataType; private String Sny;
private String base_date;
private String base_time ;
private String nx;
private String ny;
} }

129
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.Map;
import java.util.UUID; import java.util.UUID;
import com.palnet.biz.api.ctr.cntrl.model.*;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Coordinate;
import org.springframework.beans.factory.annotation.Autowired; 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.model.BasFlightPlanModel;
import com.palnet.biz.api.bas.flight.service.BasFlightMapper; import com.palnet.biz.api.bas.flight.service.BasFlightMapper;
import com.palnet.biz.api.comn.model.ControlGpsDataContext; 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.ComArcrftBas;
import com.palnet.biz.jpa.entity.ComIdntfBas; import com.palnet.biz.jpa.entity.ComIdntfBas;
import com.palnet.biz.jpa.entity.CtrCntrlBas; import com.palnet.biz.jpa.entity.CtrCntrlBas;
@ -102,7 +96,7 @@ public class CtrCntrlService {
} }
public List<GPHistoryModel> getListHistory(String objectId){ public List<GPHistoryModel> getListHistory(String objectId) {
List<GPHistoryModel> filterList = new ArrayList<GPHistoryModel>(); List<GPHistoryModel> filterList = new ArrayList<GPHistoryModel>();
// if(cic.getHistoryData(objectId).size() > 0) { // if(cic.getHistoryData(objectId).size() > 0) {
@ -135,30 +129,30 @@ public class CtrCntrlService {
List<CtrCntrlHstryArea> areaList = query.detailArea(controlId); List<CtrCntrlHstryArea> areaList = query.detailArea(controlId);
String stAreaNm = ""; String stAreaNm = "";
if ( result.getHpno() == null || result.getHpno().isEmpty()) { if (result.getHpno() == null || result.getHpno().isEmpty()) {
}else{ } else {
result.setHpno(EncryptUtils.decrypt(result.getHpno())); result.setHpno(EncryptUtils.decrypt(result.getHpno()));
} }
for(CtrCntrlHstryArea data : areaList) { for (CtrCntrlHstryArea data : areaList) {
if(data.getActnType().equals("01")) { if (data.getActnType().equals("01")) {
if(!StringUtils.isEmpty(data.getArea1())) { if (!StringUtils.isEmpty(data.getArea1())) {
stAreaNm = stAreaNm + " " + data.getArea1(); stAreaNm = stAreaNm + " " + data.getArea1();
} }
if(!StringUtils.isEmpty(data.getArea2())) { if (!StringUtils.isEmpty(data.getArea2())) {
stAreaNm = stAreaNm + " " + data.getArea2(); stAreaNm = stAreaNm + " " + data.getArea2();
} }
if(!StringUtils.isEmpty(data.getArea3())) { if (!StringUtils.isEmpty(data.getArea3())) {
stAreaNm = stAreaNm + " " + data.getArea3(); stAreaNm = stAreaNm + " " + data.getArea3();
} }
if(!StringUtils.isEmpty(data.getLandNm())) { if (!StringUtils.isEmpty(data.getLandNm())) {
stAreaNm = stAreaNm + " " + data.getLandNm(); stAreaNm = stAreaNm + " " + data.getLandNm();
} }
if(!StringUtils.isEmpty(data.getLandNum())) { if (!StringUtils.isEmpty(data.getLandNum())) {
stAreaNm = stAreaNm + " " + data.getLandNum(); stAreaNm = stAreaNm + " " + data.getLandNum();
} }
} }
@ -189,14 +183,14 @@ public class CtrCntrlService {
public List<CtrCntrlGroupArcrftModel> getGroupAuthInfo() { public List<CtrCntrlGroupArcrftModel> getGroupAuthInfo() {
List<CtrCntrlGroupModel> list = query.findByGroupInfo(); List<CtrCntrlGroupModel> list = query.findByGroupInfo();
List<CtrCntrlGroupArcrftModel> arcrftList= new ArrayList<>(); List<CtrCntrlGroupArcrftModel> arcrftList = new ArrayList<>();
if(list.size()>0) { if (list.size() > 0) {
for(CtrCntrlGroupModel lists : list) { for (CtrCntrlGroupModel lists : list) {
List<CtrCntrlGroupArcrftModel> groupArcrft = query.findByGroupArcrft(lists.getGroupId()); List<CtrCntrlGroupArcrftModel> groupArcrft = query.findByGroupArcrft(lists.getGroupId());
arcrftList.addAll(groupArcrft); arcrftList.addAll(groupArcrft);
} }
} }
return arcrftList; return arcrftList;
} }
/** /**
@ -227,6 +221,7 @@ public class CtrCntrlService {
/** /**
* TODO 기체 최신 비정상 로그 비정상 로그 전체 개수 * TODO 기체 최신 비정상 로그 비정상 로그 전체 개수
*
* @param id * @param id
* @return * @return
*/ */
@ -237,7 +232,7 @@ public class CtrCntrlService {
if ("".equals(id) || id == null) return null; 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) { for (String cntrlId : ids) {
CtrCntrlArcrftWarnModel model = new CtrCntrlArcrftWarnModel(); CtrCntrlArcrftWarnModel model = new CtrCntrlArcrftWarnModel();
@ -299,7 +294,7 @@ public class CtrCntrlService {
* @param idntfNum * @param idntfNum
* @return * @return
*/ */
public List<BasFlightPlanModel> getFlightPlan(String idntfNum) { public List<BasFlightPlanModel> getFlightPlan(String idntfNum) {
List<BasFlightPlanModel> rs = new ArrayList<>(); List<BasFlightPlanModel> rs = new ArrayList<>();
Date fltNowDt = DateUtils.nowDate(); Date fltNowDt = DateUtils.nowDate();
@ -320,7 +315,7 @@ public class CtrCntrlService {
FltPlanBas plan = planBasRepository. FltPlanBas plan = planBasRepository.
findByGroupFlightPlan(arcrft.getPlanSno(), "Y", fltNowDt).orElse(null); findByGroupFlightPlan(arcrft.getPlanSno(), "Y", fltNowDt).orElse(null);
if (plan != null ) { if (plan != null) {
BasFlightPlanModel planMapping = BasFlightMapper.mapper.entityToModel(plan); BasFlightPlanModel planMapping = BasFlightMapper.mapper.entityToModel(plan);
// 비행 계획서 구역 조회 // 비행 계획서 구역 조회
@ -345,7 +340,7 @@ public class CtrCntrlService {
areaMapping.setCoordList(coordListMapping); areaMapping.setCoordList(coordListMapping);
// Buffer 영역 생성 저장 // Buffer 영역 생성 저장
if("LINE".equals(area.getAreaType())) { if ("LINE".equals(area.getAreaType())) {
List<Coordinate> convertCoordinates = areaUtils.convertCoordinates(areaMapping.getCoordList()); List<Coordinate> convertCoordinates = areaUtils.convertCoordinates(areaMapping.getCoordList());
List<Coordinate> transCoordList = areaUtils.transform(convertCoordinates, "EPSG:4326", "EPSG:5181"); List<Coordinate> transCoordList = areaUtils.transform(convertCoordinates, "EPSG:4326", "EPSG:5181");
@ -386,7 +381,7 @@ public class CtrCntrlService {
int countSuccess = 0; int countSuccess = 0;
if (rq.getIdntfNum() != null) { if (rq.getIdntfNum() != null) {
for (BasFlightPlanModel plan : rq.getPlanList()) { for (BasFlightPlanModel plan : rq.getPlanList()) {
for (BasFlightPlanAreaModel area : plan.getAreaList()) { for (BasFlightPlanAreaModel area : plan.getAreaList()) {
List<Coordinate> planArea = areaUtils.convertCoordinates(area.getCoordList()); List<Coordinate> planArea = areaUtils.convertCoordinates(area.getCoordList());
@ -463,7 +458,7 @@ public class CtrCntrlService {
if ("01".equals(latestControl.getEndTypeCd()) || diffMinute > 5) { if ("01".equals(latestControl.getEndTypeCd()) || diffMinute > 5) {
isControl = false; isControl = false;
} }
if(!"01".equals(latestControl.getEndTypeCd()) && diffMinute < 5) { if (!"01".equals(latestControl.getEndTypeCd()) && diffMinute < 5) {
isControl = true; isControl = true;
} }
} else { } else {
@ -510,4 +505,84 @@ public class CtrCntrlService {
return result; 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;
}
} }

Loading…
Cancel
Save