|
|
|
@ -21,6 +21,7 @@ import com.palnet.comn.utils.AreaUtils;
|
|
|
|
|
import com.palnet.comn.utils.DateUtils; |
|
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
|
import org.locationtech.jts.geom.Coordinate; |
|
|
|
|
import org.locationtech.jts.geom.GeometryFactory; |
|
|
|
|
import org.slf4j.Logger; |
|
|
|
|
import org.slf4j.LoggerFactory; |
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
@ -91,6 +92,12 @@ public class CtrCntrlService {
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* TODO 관제 상세 조회 |
|
|
|
|
* |
|
|
|
|
* @param controlId |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
public CtrCntrlDtlModel getDetail(String controlId) { |
|
|
|
|
|
|
|
|
|
CtrCntrlDtlModel result = new CtrCntrlDtlModel(); |
|
|
|
@ -134,15 +141,33 @@ public class CtrCntrlService {
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* TODO 관제 이력 조회 |
|
|
|
|
* |
|
|
|
|
* @param controlId |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
public List<GPHistoryModel> getHistory(String controlId) { |
|
|
|
|
return query.getDroneHistory(controlId); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* TODO 사용자가 속한 그룹 정보 조회 |
|
|
|
|
* |
|
|
|
|
* @param cstmrSno |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
public List<AcntCstmrGroupModel> getGroupAuthInfo(Integer cstmrSno) { |
|
|
|
|
List<AcntCstmrGroupModel> list = query.findByGroupInfo(cstmrSno); |
|
|
|
|
return list; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* TODO 비정상 상황 이력 조회 |
|
|
|
|
* |
|
|
|
|
* @param controlId |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
public List<CtrCntrlWarnLogModel> getWarnLog(String controlId) { |
|
|
|
|
List<CtrCntrlWarnLog> logs = warnLogRepository.findAllByCntrlId(controlId); |
|
|
|
|
List<CtrCntrlWarnLogModel> warnLog = new ArrayList<CtrCntrlWarnLogModel>(); |
|
|
|
@ -160,6 +185,12 @@ public class CtrCntrlService {
|
|
|
|
|
return warnLog; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* TODO 식별 번호에 해당되는 비행구역 조회 |
|
|
|
|
* |
|
|
|
|
* @param idntfNum |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
@Transactional(readOnly = true) |
|
|
|
|
public List<BasFlightPlanModel> getFlightPlan(String idntfNum) { |
|
|
|
|
List<BasFlightPlanModel> rs = new ArrayList<>(); |
|
|
|
@ -209,8 +240,12 @@ public class CtrCntrlService {
|
|
|
|
|
// Buffer 영역 생성 저장
|
|
|
|
|
if("LINE".equals(area.getAreaType())) { |
|
|
|
|
List<Coordinate> convertCoordinates = areaUtils.convertCoordinates(areaMapping.getCoordList()); |
|
|
|
|
List<Coordinate> bufferList = areaUtils.buffer(convertCoordinates, areaMapping.getBufferZone()); |
|
|
|
|
List<BasFlightPlanAreaCoordModel> bufferCoordList = areaUtils.convertModel(bufferList); |
|
|
|
|
List<Coordinate> transCoordList = areaUtils.transform(convertCoordinates, "EPSG:4326", "EPSG:5181"); |
|
|
|
|
|
|
|
|
|
List<Coordinate> bufferList = areaUtils.buffer(transCoordList, areaMapping.getBufferZone()); |
|
|
|
|
List<Coordinate> transBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); // buffer 영역 좌표계 변환
|
|
|
|
|
|
|
|
|
|
List<BasFlightPlanAreaCoordModel> bufferCoordList = areaUtils.convertModel(transBufferList); |
|
|
|
|
|
|
|
|
|
areaMapping.setBufferCoordList(bufferCoordList); |
|
|
|
|
} |
|
|
|
@ -232,6 +267,12 @@ public class CtrCntrlService {
|
|
|
|
|
return rs; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* TODO 비행 관제 비정상 상황 판별 |
|
|
|
|
* |
|
|
|
|
* @param rq |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
public CtrCntrlPlanContainsRs checkPlanContains(CtrCntrlPlanContainsRq rq) { |
|
|
|
|
CtrCntrlPlanContainsRs rs = new CtrCntrlPlanContainsRs(); |
|
|
|
|
|
|
|
|
@ -241,31 +282,42 @@ public class CtrCntrlService {
|
|
|
|
|
for(BasFlightPlanModel plan : rq.getPlanList()) { |
|
|
|
|
for(BasFlightPlanAreaModel area : plan.getAreaList()) { |
|
|
|
|
List<Coordinate> planArea = areaUtils.convertCoordinates(area.getCoordList()); |
|
|
|
|
//드론 위치
|
|
|
|
|
|
|
|
|
|
// 드론 위치
|
|
|
|
|
Coordinate targetCoord = new Coordinate(rq.getLon(), rq.getLat()); |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 1. 비행 구역에 벗어나면 모든 경우의 수는 비정상 상황으로 판단 |
|
|
|
|
* 2. 비정상 상황 TYPE(비행구역, 공역)에 따라 구분 (미적용) |
|
|
|
|
*/ |
|
|
|
|
boolean areaContains = true; |
|
|
|
|
boolean airspaceContains = false; |
|
|
|
|
// boolean airspaceContains = false;
|
|
|
|
|
if("LINE".equals(area.getAreaType())) { |
|
|
|
|
List<Coordinate> planBuffer = areaUtils.buffer(planArea, area.getBufferZone()); |
|
|
|
|
List<Coordinate> transPlanArea = areaUtils.transform(planArea, "EPSG:4326", "EPSG:5181"); |
|
|
|
|
|
|
|
|
|
areaContains = areaUtils.contains(planBuffer, targetCoord); |
|
|
|
|
airspaceContains = areaUtils.contains(targetCoord); |
|
|
|
|
List<Coordinate> planBuffer = areaUtils.buffer(transPlanArea, area.getBufferZone()); |
|
|
|
|
List<Coordinate> transPlanBuffer = areaUtils.transform(planBuffer, "EPSG:5181", "EPSG:4326"); |
|
|
|
|
|
|
|
|
|
areaContains = areaUtils.contains(transPlanBuffer, targetCoord); |
|
|
|
|
// airspaceContains = areaUtils.contains(targetCoord);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if("POLYGON".equals(area.getAreaType())) { |
|
|
|
|
planArea.add(planArea.get(0)); |
|
|
|
|
areaContains = areaUtils.contains(planArea, targetCoord); |
|
|
|
|
airspaceContains = areaUtils.contains(targetCoord); |
|
|
|
|
// airspaceContains = areaUtils.contains(targetCoord);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if("CIRCLE".equals(area.getAreaType())) { |
|
|
|
|
List<Coordinate> circle = areaUtils.createCircle(planArea.get(0), area.getBufferZone()); |
|
|
|
|
// List<Coordinate> transCircle = areaUtils.transform(circle, "EPSG:5181", "EPSG:4326");
|
|
|
|
|
|
|
|
|
|
areaContains = areaUtils.contains(circle, targetCoord); |
|
|
|
|
airspaceContains = areaUtils.contains(targetCoord); |
|
|
|
|
// airspaceContains = areaUtils.contains(targetCoord);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(areaContains || !airspaceContains) countSuccess++; |
|
|
|
|
// if(areaContains || !airspaceContains) countSuccess++;
|
|
|
|
|
if(areaContains) countSuccess++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|