|
|
|
@ -113,7 +113,8 @@ public class BasFlightService {
|
|
|
|
|
public void planValid(BasFlightPlanModel rq) { |
|
|
|
|
|
|
|
|
|
List<BasFlightPlanModel> effectivePlanList = fltPlanQueryRepository.CoordCheck(rq); |
|
|
|
|
|
|
|
|
|
List<BasFlightPlanAreaCoordRq> effectivePlanCount = fltPlanQueryRepository.CoordCount(rq); |
|
|
|
|
int accuCnt = 0; |
|
|
|
|
if(effectivePlanList != null && !effectivePlanList.isEmpty()) { |
|
|
|
|
for(BasFlightPlanModel plan : effectivePlanList) { |
|
|
|
|
// 1. 구역 조회
|
|
|
|
@ -121,30 +122,70 @@ public class BasFlightService {
|
|
|
|
|
|
|
|
|
|
// 2. 좌표 조회 -> 영역 포함 여부 확인
|
|
|
|
|
for(FltPlanArea area : areaList) { |
|
|
|
|
List<FltPlanAreaCoord> coordList = fltPlanAreaCoordRepository.findByPlanAreaSnoOrderByPlanAreaCoordSnoAsc(area.getPlanAreaSno()); |
|
|
|
|
List<FltPlanAreaCoord> coordLists = fltPlanAreaCoordRepository.findByPlanAreaSnoOrderByPlanAreaCoordSnoAsc(area.getPlanAreaSno()); |
|
|
|
|
|
|
|
|
|
if(coordList != null && !coordList.isEmpty()) { |
|
|
|
|
List<BasFlightPlanAreaCoordModel> coordListMapping = BasFlightMapper.mapper.entityToModelCoordList(coordList); |
|
|
|
|
if(coordLists != null && !coordLists.isEmpty()) { |
|
|
|
|
List<BasFlightPlanAreaCoordModel> coordListMapping = BasFlightMapper.mapper.entityToModelCoordList(coordLists); |
|
|
|
|
|
|
|
|
|
// 2-1 영역 좌표 -> jts model로 mapping
|
|
|
|
|
List<Coordinate> effectiveCoordList = areaUtils.convertCoordinates(coordListMapping); |
|
|
|
|
|
|
|
|
|
List<Coordinate> coordList = new ArrayList<>(); |
|
|
|
|
List<Coordinate> bufferCoordList = new ArrayList<>(); |
|
|
|
|
List<Coordinate> effectiveCntCoordList = new ArrayList<>(); |
|
|
|
|
// 유효한 비행구역 검증하기.
|
|
|
|
|
for(BasFlightPlanAreaModel rqArea : rq.getAreaList()) { |
|
|
|
|
boolean checking = false; |
|
|
|
|
if("LINE".equals(rqArea.getAreaType()) || "POLYGON".equals(rqArea.getAreaType())) { |
|
|
|
|
|
|
|
|
|
boolean checkContains = false; |
|
|
|
|
boolean checkOverlaps = false; |
|
|
|
|
for(BasFlightPlanAreaCoordModel coord : rqArea.getCoordList()) { |
|
|
|
|
Coordinate targetCoord = new Coordinate(coord.getLon(), coord.getLat()); |
|
|
|
|
checking = areaUtils.contains(effectiveCoordList, targetCoord); |
|
|
|
|
Coordinate coords = new Coordinate(coord.getLon(), coord.getLat()); |
|
|
|
|
coordList.add(coords); |
|
|
|
|
} |
|
|
|
|
if("LINE".equals(rqArea.getAreaType())) { |
|
|
|
|
List<Coordinate> transCoordList = areaUtils.transform(coordList, "EPSG:4326", "EPSG:5181"); |
|
|
|
|
List<Coordinate> bufferList = areaUtils.buffer(transCoordList, rqArea.getBufferZone()); // buffer 영역 생성
|
|
|
|
|
bufferCoordList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); // buffer 영역 좌표계 변환
|
|
|
|
|
bufferCoordList.add(bufferCoordList.get(0)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if("CIRCLE".equals(rqArea.getAreaType())) { |
|
|
|
|
checking = areaUtils.overlaps(areaUtils.convertCoordinates(rqArea.getCoordList()), effectiveCoordList); |
|
|
|
|
if("POLYGON".equals(rqArea.getAreaType())) { |
|
|
|
|
for(Coordinate coord : coordList) { |
|
|
|
|
Coordinate targetCoord = new Coordinate(coord.x, coord.y); |
|
|
|
|
bufferCoordList.add(targetCoord); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(checking) { |
|
|
|
|
} |
|
|
|
|
if("CIRCLE".equals(rqArea.getAreaType())) { |
|
|
|
|
bufferCoordList = areaUtils.createCircle(coordList.get(0), rqArea.getBufferZone()); |
|
|
|
|
} |
|
|
|
|
bufferCoordList.add(bufferCoordList.get(0)); |
|
|
|
|
for(int i = 0; i < areaList.size(); i++) { |
|
|
|
|
System.out.println(areaList.size() + "," + coordLists.size()); |
|
|
|
|
List<Coordinate> effectiveBufferCoordList = new ArrayList<>(); |
|
|
|
|
for(int j = 0 ; j < coordLists.size(); j++) { |
|
|
|
|
Double lon = effectiveCoordList.get(accuCnt).getX(); |
|
|
|
|
Double lat = effectiveCoordList.get(accuCnt).getY(); |
|
|
|
|
Coordinate coord = new Coordinate(lon , lat); |
|
|
|
|
effectiveCntCoordList.add(coord); |
|
|
|
|
accuCnt++; |
|
|
|
|
} |
|
|
|
|
if("LINE".equals(effectivePlanCount.get(i).getAreaType())){ |
|
|
|
|
List<Coordinate> transCoordList = areaUtils.transform(effectiveCntCoordList, "EPSG:4326", "EPSG:5181"); |
|
|
|
|
List<Coordinate> bufferList = areaUtils.buffer(transCoordList, effectivePlanCount.get(i).getBufferZone()); // buffer 영역 생성
|
|
|
|
|
effectiveCntCoordList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); // buffer 영역 좌표계 변환
|
|
|
|
|
effectiveBufferCoordList.addAll(effectiveCntCoordList); |
|
|
|
|
} |
|
|
|
|
if("POLYGON".equals(effectivePlanCount.get(i).getAreaType())) { |
|
|
|
|
effectiveBufferCoordList.addAll(effectiveCntCoordList); |
|
|
|
|
effectiveBufferCoordList.add(effectiveBufferCoordList.get(0)); |
|
|
|
|
} |
|
|
|
|
if("CIRCLE".equals(effectivePlanCount.get(i).getAreaType())) { |
|
|
|
|
effectiveBufferCoordList = areaUtils.createCircle(effectiveCntCoordList.get(0), effectivePlanCount.get(i).getBufferZone()); |
|
|
|
|
} |
|
|
|
|
for(Coordinate coord : effectiveBufferCoordList) { |
|
|
|
|
checkContains = areaUtils.contains(bufferCoordList, coord); |
|
|
|
|
} |
|
|
|
|
effectiveBufferCoordList.add(effectiveBufferCoordList.get(0)); |
|
|
|
|
checkOverlaps = FlightUtils.overlaps((bufferCoordList.toArray(new Coordinate[]{})),(effectiveBufferCoordList.toArray(new Coordinate[]{}))); |
|
|
|
|
} |
|
|
|
|
if(checkContains || checkOverlaps) { |
|
|
|
|
throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -152,7 +193,13 @@ public class BasFlightService {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 3. 중복 기체 확인
|
|
|
|
|
|
|
|
|
|
for(BasFlightPlanAreaCoordRq idntfNum : effectivePlanCount) { |
|
|
|
|
for(BasFlightPlanArcrftModel rqArcrft : rq.getArcrftList()) { |
|
|
|
|
if(rqArcrft.getIdntfNum().equals(idntfNum.getIdntfNum())) { |
|
|
|
|
throw new CustomException(ErrorCode.ARCRFT_DATA_DUPLICATE); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|