diff --git a/.gitignore b/.gitignore index 6bf15c41..55052954 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ out/ ### VS Code ### .vscode/ /files/ +/pav-server/files/ diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java index f24a1dfd..d80513f6 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java @@ -46,17 +46,23 @@ public class BasLaancValidatedRs { && isArcrftInsurance && !isArcrftDuplicated // 기체 중복여부 && !isPlanAreaDuplicatd // 비행구역 중복여부 - && isEvaluatedTargetArea // 관제구역여부 && isFlightArea // 비행가능여부 - && isElev // 150m 이하 - && isArcrftWeight; // 25kg 이하 + && (isEvaluatedTargetArea // 관제구역여부 + || !isElev // 150m 초과 + || !isArcrftWeight); // 25kg 초과 } return !isArcrftDuplicated && !isPlanAreaDuplicatd - && isEvaluatedTargetArea && isFlightArea - && isElev // 150m 이하 - && isArcrftWeight; // 25kg 이하 + && (isEvaluatedTargetArea + || !isElev // 150m 초과 + || !isArcrftWeight); // 25kg 초과 + } + + public boolean isFlight() { + return !isEvaluatedTargetArea + && isElev + && isArcrftWeight; } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java index f0cf3c0f..6ab48e58 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java @@ -109,9 +109,15 @@ public class BasLaancService { boolean isArcrftWeight = rq.getArcrftList().stream().anyMatch(arcrft -> arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO && arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO_TEST); rs.setArcrftWeight(isArcrftWeight); - // 비행구역 중복여부, 기체 중복여부, 판단구역 - 공역과 겹칠 경우, 비행가능여부 - BasLaancValidatedRs validationPlanRs = this.validationPlanAreaAndArcrftAndAirspace(rq); - BasLaancMapper.MAPPER.merge(rs, validationPlanRs); + // 판단구역 - 공역과 겹칠 경우, 비행가능여부 + BasLaancValidatedRs validationPlanAirspaceRs = this.validationPlanAreaAndArcrft(rq); + rs.setEvaluatedTargetArea(validationPlanAirspaceRs.isEvaluatedTargetArea()); + rs.setFlightArea(validationPlanAirspaceRs.isFlightArea()); + + // 비행구역 중복여부, 기체 중복여부 + BasLaancValidatedRs validationPlanDbRs = this.validationPlanAirspace(rq); + rs.setPlanAreaDuplicatd(validationPlanDbRs.isPlanAreaDuplicatd()); + rs.setArcrftDuplicated(validationPlanDbRs.isArcrftDuplicated()); return rs; @@ -122,8 +128,13 @@ public class BasLaancService { public BasLaancLastRs createFlightPlan(BasLaancPlanRq rq) { BasLaancValidatedRs basLaancValidatedRs = rq.getValidatedRs(); - BasLaancValidatedRs validatedRs = this.validationPlanAreaAndArcrftAndAirspace(rq); - BasLaancMapper.MAPPER.merge(basLaancValidatedRs, validatedRs); +// BasLaancValidatedRs validatedAirspaceRs = this.validationPlanAirspace(rq); + + BasLaancValidatedRs validatedDbRs = this.validationPlanAreaAndArcrft(rq); + basLaancValidatedRs.setPlanAreaDuplicatd(validatedDbRs.isPlanAreaDuplicatd()); + basLaancValidatedRs.setArcrftDuplicated(validatedDbRs.isArcrftDuplicated()); + +// BasLaancMapper.MAPPER.merge(basLaancValidatedRs, validatedRs); // LAANC가 검증된것들만 DB저장 if (!basLaancValidatedRs.isValid()) throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE); @@ -240,14 +251,12 @@ public class BasLaancService { } // LAANC 검증 - private BasLaancValidatedRs validationPlanAreaAndArcrftAndAirspace(BasLaancPlanRq rq) { + private BasLaancValidatedRs validationPlanAreaAndArcrft(BasLaancPlanRq rq) { // 초기화 BasLaancValidatedRs rs = BasLaancValidatedRs.builder() .isPlanAreaDuplicatd(false) // 비행구역 중복여부 .isArcrftDuplicated(false) // 기체 중복여부 - .isEvaluatedTargetArea(false) // 판단구역 - 공역과 겹칠 경우 - .isFlightArea(false) // 비행가능여부 .build(); @@ -337,6 +346,59 @@ public class BasLaancService { } +// // 공역 중복 확인 +// for (BasLaancAreaModel basLaancAreaModel : rq.getAreaList()) { +// List rqCoord = new ArrayList<>(); +// List rqCoordBufferList = new ArrayList<>(); +// +// //rq로 들어온 좌표로 버퍼좌표 생성 +// for (BasLaancAreaCoordModel basLaancAreaCoordModel : basLaancAreaModel.getCoordList()) { +// Coordinate coords = new Coordinate(basLaancAreaCoordModel.getLon(), basLaancAreaCoordModel.getLat()); +// rqCoord.add(coords); +// } +// if ("LINE".equals(basLaancAreaModel.getAreaType())) { +// List trans = areaUtils.transform(rqCoord, "EPSG:4326", "EPSG:5181"); +// List bufferList = areaUtils.buffer(trans, basLaancAreaModel.getBufferZone()); +// rqCoordBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); +// } else if ("POLYGON".equals(basLaancAreaModel.getAreaType())) { +// rqCoordBufferList.addAll(rqCoord); +// } else if ("CIRCLE".equals(basLaancAreaModel.getAreaType())) { +// rqCoordBufferList = areaUtils.createCircle(rqCoord.get(0), basLaancAreaModel.getBufferZone()); +// } +// +// AirspaceUtils airspaceUtils = AirspaceUtils.getInstance(); +// Geometry rqGeometry = airspaceUtils.createGeometryByCoordinate(rqCoordBufferList); +// Integer fltElev = basLaancAreaModel.getFltElev() != null ? Integer.valueOf(basLaancAreaModel.getFltElev()) : 0; +// AirspaceUtils.FeatureInfo featureInfo = new AirspaceUtils.FeatureInfo(null, null, 0, fltElev, rqGeometry); +// +// // 평가 가능 지역 판단 +// boolean duplicatedAirspace = airspaceUtils.isDuplicatedAirspace(featureInfo); +// rs.setEvaluatedTargetArea(duplicatedAirspace); +// +// // 비행 가능 지역 판단 +//// if (duplicatedAirspace) { +//// boolean validLaancAirspace = airspaceUtils.isValidLaancAirspace(featureInfo); +//// rs.setFlightAreaYn(validLaancAirspace ? "Y" : "N"); +//// } else { +//// rs.setFlightAreaYn("N"); +//// } +// +// // 비행 가능 지역 판단 +// boolean validLaancAirspace = airspaceUtils.isValidLaancAirspace(featureInfo); +// rs.setFlightArea(validLaancAirspace); +// +// } + return rs; + } + + private BasLaancValidatedRs validationPlanAirspace(BasLaancPlanRq rq) { + + // 초기화 + BasLaancValidatedRs rs = BasLaancValidatedRs.builder() + .isEvaluatedTargetArea(false) // 판단구역 - 공역과 겹칠 경우 + .isFlightArea(false) // 비행가능여부 + .build(); + // 공역 중복 확인 for (BasLaancAreaModel basLaancAreaModel : rq.getAreaList()) { List rqCoord = new ArrayList<>();