From dcbf072d5aa8c75f185736a45e63aeb32f68d9bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Fri, 13 Sep 2024 11:08:35 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=93=9C=EB=A1=A0=EC=9B=90=EC=8A=A4?= =?UTF-8?q?=ED=86=B1=20=EC=A0=95=EB=B3=B4=20=EB=B0=9B=EC=9D=84=EC=8B=9C=20?= =?UTF-8?q?=EB=B6=80=EC=84=9C=EA=B5=AC=EB=B3=84=20(=EB=8B=A8,=20=EA=B4=80?= =?UTF-8?q?=EC=A0=9C=EA=B6=8C=EA=B3=BC=20=EB=8B=B4=EB=8B=B9=EA=B5=AC?= =?UTF-8?q?=EC=97=AD=EC=9D=B4=20=EB=8B=A4=EB=A5=BC=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EC=9E=88=EC=96=B4=20=ED=99=95=EC=9D=B8=20=ED=95=84=EC=9A=94)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/external/model/DosCptAuthResult.java | 17 +++++ .../external/service/DronOneStopService.java | 57 +++++++++++++++-- .../com/palnet/comn/utils/AirspaceUtils.java | 62 +------------------ 3 files changed, 72 insertions(+), 64 deletions(-) create mode 100644 pav-server/src/main/java/com/palnet/biz/api/external/model/DosCptAuthResult.java diff --git a/pav-server/src/main/java/com/palnet/biz/api/external/model/DosCptAuthResult.java b/pav-server/src/main/java/com/palnet/biz/api/external/model/DosCptAuthResult.java new file mode 100644 index 00000000..adb6515e --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/external/model/DosCptAuthResult.java @@ -0,0 +1,17 @@ +package com.palnet.biz.api.external.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class DosCptAuthResult { + private List cptCode; + private List controlCptCode; +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/external/service/DronOneStopService.java b/pav-server/src/main/java/com/palnet/biz/api/external/service/DronOneStopService.java index 6810b921..ba592dfc 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/external/service/DronOneStopService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/external/service/DronOneStopService.java @@ -1,11 +1,11 @@ package com.palnet.biz.api.external.service; import com.palnet.biz.api.bas.dos.model.LimitZoneType; +import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityItemRS; +import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityRQ; +import com.palnet.biz.api.comn.coordinate.service.ComnCoordinateService; import com.palnet.biz.api.comn.share.ShareService; -import com.palnet.biz.api.external.model.ApprovalCd; -import com.palnet.biz.api.external.model.DosApprovalResult; -import com.palnet.biz.api.external.model.DosPlanRq; -import com.palnet.biz.api.external.model.DosPlanRs; +import com.palnet.biz.api.external.model.*; import com.palnet.biz.jpa.entity.*; import com.palnet.biz.jpa.entity.type.ReviewedType; import com.palnet.biz.jpa.repository.dos.*; @@ -26,6 +26,7 @@ import java.time.Instant; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; @Slf4j @@ -41,6 +42,8 @@ public class DronOneStopService { private final DosFltPlanPilotRepository dosFltPlanPilotRepository; private final ShareService shareService; private final AreaUtils areaUtils; + private final ComnCoordinateService comnCoordinateService; + private final List PASS_PURPOSES = List.of("수색구조", "인명구조", "시설정검"); public DosPlanRs saveDosPlan(DosPlanRq rq) { @@ -130,6 +133,7 @@ public class DronOneStopService { // 검토결과 - approvalCd가 비대상일 경우 검토불필요 그외 대기 ReviewedType reviewedType = saveApprovalCd == ApprovalCd.UNTARGETED_AREA ? ReviewedType.UNNECESSARY : ReviewedType.WAIT; + DosCptAuthResult cptAuth = this.getCptAuth(centerCoordinate, area.getRadius()); // area save DosFltPlanArea dosFltPlanAreaInsert = DosFltPlanArea.builder() .planSno(saveDosFltPlanBas.getPlanSno()) @@ -144,6 +148,8 @@ public class DronOneStopService { .limitZone(approvalResult.getLimitZone()) .reviewedType(reviewedType) .reqElev(reqElev) + .cptCd(cptAuth.getCptCode()) + .innerCptCd(cptAuth.getControlCptCode()) .updateDt(Instant.now()) .createDt(Instant.now()) .build(); @@ -352,4 +358,47 @@ public class DronOneStopService { return distance; } + public DosCptAuthResult getCptAuth(Coordinate centerCoordinate, Double radius) { + List targetCoordinate = areaUtils.createCircle(centerCoordinate, radius); + List rq = targetCoordinate.stream().map(coordinate -> CompotentAuthorityRQ.builder() + .lat(coordinate.y) + .lon(coordinate.x) + .build()).collect(Collectors.toList()); + List competentAuthority = comnCoordinateService.getCompetentAuthority(rq); + DosCptAuthResult result = new DosCptAuthResult(); + if (competentAuthority != null && !competentAuthority.isEmpty()) { + List cptCode = competentAuthority.stream().map(CompotentAuthorityItemRS::getCptAuthCode).distinct().collect(Collectors.toList()); + result.setCptCode(cptCode); + } + // TODO 관제권 체크 후 결과 반환 + // 관제권 airspaces + Map airspaceParamMap = Map.of( + AirspaceUtils.AirspaceType.C_CONTROL_GIMPO, "F0002", // 김포항공관리사무소(안전운항과) + AirspaceUtils.AirspaceType.C_CONTROL_ULSAN, "C0001" // 울산공항출장소 +// AirspaceUtils.AirspaceType.C_CONTROL_JEJU, "F0008", // 제주지방항공청(안전운항과) + + ); + List controlCptCode = new ArrayList<>(); + AirspaceUtils airspaceUtils = AirspaceUtils.getInstance(); + Geometry targetGeometry = airspaceUtils.createGeometryByCoordinate(targetCoordinate); + for (AirspaceUtils.AirspaceType airspaceType : airspaceParamMap.keySet()) { + List airspaces = airspaceUtils.getAirspaces(airspaceType); + if (airspaces == null || airspaces.isEmpty()) { + continue; + } + String innerCptCode = airspaceParamMap.get(airspaceType); + for (AirspaceUtils.FeatureInfo airspace : airspaces) { + if (airspace.getGeometry().intersects(targetGeometry)) { + controlCptCode.add(innerCptCode); + break; + } + } + } + if (!controlCptCode.isEmpty()) { + result.setControlCptCode(controlCptCode); + } + + return result; + } + } diff --git a/pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java b/pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java index 58294446..5ce73aee 100644 --- a/pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java +++ b/pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java @@ -33,10 +33,8 @@ public class AirspaceUtils { private final String CLASS_PATH = "air" + File.separator + "airspace"; private final GeometryFactory geometryFactory = new GeometryFactory(); - // private List airspaces; private Map> airspaceMap; - private AirspaceUtils() { // 초기화 log.info("===== AirspaceUtils init ====="); @@ -77,7 +75,6 @@ public class AirspaceUtils { }); } - // 공역 중복 검사 public boolean isDuplicatedAirspaceElev(FeatureInfo target) { @@ -238,68 +235,13 @@ public class AirspaceUtils { // get geometry public List getAirspaces(AirspaceType airspaceType) { - return this.airspaceMap.get(airspaceType.name()); + return this.airspaceMap.get(airspaceType); } - /* - // 파일에서 공역 데이터 가져와서 geometry로 변환 - 초기화. - private void loadResourceAirspace() { - - Map> featureInfoMap = new HashMap<>(); - ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); - Resource[] resources = null; - try { - resources = resolver.getResources("classpath:" + CLASS_PATH + "/*-elev.json"); - } catch (IOException e) { - log.warn("airspaces load error : {}", e.getMessage()); - } - - if (resources == null) { - log.info("airspace resources is null"); - return; - } - - for (Resource resource : resources) { - log.info(">>> resource name : {}", resource.getFilename()); - try (InputStream is = resource.getInputStream()) { - BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); - JSONParser jsonParser = new JSONParser(); - JSONObject jsonObject = (JSONObject) jsonParser.parse(reader); - List fis = this.convertGeoJsonToGeometry(jsonObject); - - String airspaceType = AirspaceType.ETC.name(); - if (resource.getFilename().contains("gimpo-airport-2d-elev.json")) { - airspaceType = AirspaceType.GIMPO.name(); - } - - List featureInfos = featureInfoMap.get(airspaceType); - if (featureInfos == null) { - featureInfos = new ArrayList<>(); - } - featureInfos.addAll(fis); - featureInfoMap.put(airspaceType, featureInfos); - - } catch (Exception e) { - log.warn("airspace resource read error : {}", e.getMessage()); - } - } - - for (Map.Entry> entry : featureInfoMap.entrySet()) { - log.info(">>> key : {}, size : {}", entry.getKey(), entry.getValue().size()); - } - - this.airspaceMap = featureInfoMap; - } - */ // 파일에서 공역 데이터 가져와서 geometry로 변환 - 초기화. private void loadResourceAirspace() { -// D_NO_FLY_ZONE, // 비행금지구역 -// D_RESTRICTED_FLIGHT_AREA, // 비행제한구역 -// D_CONTROL_AIRPORT, // 관제권(공항) -// D_CONTROL_MILITARY_CIVILIAN, // 관제권(군사/민간) -// D_LIGHT_AIRCRAFT, // 경량항공기이착륙장 -// D_ULTRA_LIGHT_AIRCRAFT, // 초경량비행장치공역 + Map resourceInfo = Map.of( AirspaceType.D_NO_FLY_ZONE, "default_airspace/_prohibitedArea.json", AirspaceType.D_RESTRICTED_FLIGHT_AREA, "default_airspace/_restrictedArea.json",