Browse Source

[비행관제] 비정상 상황 작업

feature/auth
노승철 2 years ago
parent
commit
167347b6db
  1. 40
      src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java
  2. 22
      src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlFlightPlanRq.java
  3. 18
      src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlPlanContainsRq.java
  4. 12
      src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlPlanContainsRs.java
  5. 48
      src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java
  6. 11
      src/main/java/com/palnet/biz/message/service/impl/MessageServiceImpl.java
  7. 53
      src/main/java/com/palnet/comn/utils/AreaUtils.java

40
src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java

@ -1,14 +1,12 @@
package com.palnet.biz.api.ctr.cntrl.controller;
import java.util.ArrayList;
import java.util.List;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrGroupModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel;
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlFlightPlanRq;
import com.palnet.biz.jpa.entity.CtrCntrlHstry;
import com.palnet.biz.jpa.repository.ctr.CtrCntrlHstryRepository;
import org.springframework.beans.factory.annotation.Autowired;
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlPlanContainsRq;
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlPlanContainsRs;
import com.palnet.comn.model.GPModel;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@ -19,11 +17,8 @@ import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlDtlModel;
import com.palnet.biz.api.ctr.cntrl.service.CtrCntrlService;
import com.palnet.biz.sample.entity.SampleEntity;
import com.palnet.biz.sample.service.SampleService;
import com.palnet.comn.model.GPHistoryModel;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@ -126,15 +121,15 @@ public class CtrCntrlController {
/**
* TODO 비행 관제 사용자 비행 계획서 정보
*
* @param rq
* @param idntfNum
* @return
*/
@GetMapping("/flight_plan")
public ResponseEntity<? extends BasicResponse> findFlightPlan(CtrCntrlFlightPlanRq rq) {
@GetMapping("/flight_plan/{idntfNum}")
public ResponseEntity<? extends BasicResponse> findFlightPlan(@PathVariable("idntfNum") String idntfNum) {
List<BasFlightPlanModel> list;
try {
list = service.getFlightPlan(rq);
list = service.getFlightPlan(idntfNum);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
@ -144,4 +139,25 @@ public class CtrCntrlController {
return ResponseEntity.ok().body(new SuccessResponse<List>(list));
}
/**
* TODO 비행 관제 구역 비정상 상황 체크
*
* @param rq
* @return
*/
@PostMapping("/contains")
public ResponseEntity<? extends BasicResponse> checkPlanContains(@RequestBody CtrCntrlPlanContainsRq rq) {
CtrCntrlPlanContainsRs rs;
try {
rs = service.checkPlanContains(rq);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse(rs));
}
}

22
src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlFlightPlanRq.java

@ -1,22 +0,0 @@
package com.palnet.biz.api.ctr.cntrl.model;
import lombok.Data;
import java.util.Date;
@Data
public class CtrCntrlFlightPlanRq {
private String groupId;
private String groupNm;
private Integer cstmrSno;
private Integer arctftSno;
private String idntfNum;
private String aprvlYn;
private Date srvrRcvDt;
}

18
src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlPlanContainsRq.java

@ -0,0 +1,18 @@
package com.palnet.biz.api.ctr.cntrl.model;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaCoordModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class CtrCntrlPlanContainsRq {
private String idntfNum; // 드론 식별번호.
private double lat; // 드론 위도 좌표
private double lon; // 드론 경도 좌표
private List<BasFlightPlanModel> planList; // 비행계획서
}

12
src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlPlanContainsRs.java

@ -0,0 +1,12 @@
package com.palnet.biz.api.ctr.cntrl.model;
import lombok.Data;
@Data
public class CtrCntrlPlanContainsRs {
private boolean contains = false;
private String idntfNum;
private String planSno;
}

48
src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java

@ -1,25 +1,26 @@
package com.palnet.biz.api.ctr.cntrl.service;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrGroupModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaCoordModel;
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.service.BasFlightMapper;
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlFlightPlanRq;
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlPlanContainsRq;
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlPlanContainsRs;
import com.palnet.biz.jpa.entity.*;
import com.palnet.biz.jpa.repository.com.ComArcrftBasRepository;
import com.palnet.biz.jpa.repository.com.ComIdntBasRepository;
import com.palnet.biz.jpa.repository.flt.*;
import com.palnet.comn.model.GPModel;
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;
@ -139,13 +140,13 @@ public class CtrCntrlService {
return list;
}
public List<BasFlightPlanModel> getFlightPlan(CtrCntrlFlightPlanRq rq) {
public List<BasFlightPlanModel> getFlightPlan(String idntfNum) {
List<BasFlightPlanModel> rs = new ArrayList<>();
Date fltNowDt = DateUtils.nowDate();
// 기체 식별 정보 조회
ComIdntfBas idntfBas = idntfRepository.findById(rq.getIdntfNum()).orElse(null);
ComIdntfBas idntfBas = idntfRepository.findById(idntfNum).orElse(null);
if(idntfBas != null) {
ComArcrftBas arcrftBas = arcrftRepository.findById(idntfBas.getArcrftSno()).orElse(null);
@ -153,7 +154,7 @@ public class CtrCntrlService {
if(arcrftBas != null) {
// 비행 계획 기체 조회
List<FltPlanArcrft> arcrftList = planArcrftRepository.
findByIdntfNumAndArcrftSnoOrderByPlanArcrftSnoAsc(rq.getIdntfNum(), arcrftBas.getArcrftSno());
findByIdntfNumAndArcrftSnoOrderByPlanArcrftSnoAsc(idntfNum, arcrftBas.getArcrftSno());
if (arcrftList != null && !arcrftList.isEmpty()) {
arcrftList.forEach(arcrft -> {
@ -209,4 +210,39 @@ public class CtrCntrlService {
return rs;
}
public CtrCntrlPlanContainsRs checkPlanContains(CtrCntrlPlanContainsRq rq) {
CtrCntrlPlanContainsRs rs = new CtrCntrlPlanContainsRs();
if(rq.getIdntfNum() != null) {
rq.getPlanList().forEach(plan -> {
plan.getAreaList().forEach(area -> {
List<Coordinate> planArea = areaUtils.convertCoordinates(area.getCoordList());
//드론 위치
Coordinate targetCoord = new Coordinate(rq.getLon(), rq.getLat());
boolean result = true;
if("LINE".equals(area.getAreaType())) {
List<Coordinate> planBuffer = areaUtils.buffer(planArea, area.getBufferZone());
result = areaUtils.contains(planBuffer, targetCoord);
}
if("POLYGON".equals(area.getAreaType())) {
result = areaUtils.contains(planArea, targetCoord);
}
if("CIRCLE".equals(area.getAreaType())) {
List<Coordinate> circle = areaUtils.createCircle(planArea.get(0), area.getBufferZone());
result = areaUtils.contains(circle, targetCoord);
}
rs.setContains(result);
});
});
}
rs.setIdntfNum(rq.getIdntfNum());
return rs;
}
}

11
src/main/java/com/palnet/biz/message/service/impl/MessageServiceImpl.java

@ -2,8 +2,6 @@ package com.palnet.biz.message.service.impl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel;
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlFlightPlanRq;
import com.palnet.biz.api.ctr.cntrl.service.CtrCntrlService;
import com.palnet.biz.jpa.entity.CtrCntrlHstry;
import com.palnet.biz.jpa.repository.pty.PtyDronQueryRepository;
@ -14,14 +12,12 @@ import com.palnet.comn.model.GPDatabaseModel;
import com.palnet.comn.utils.AreaUtils;
import com.palnet.comn.utils.DateUtils;
import com.palnet.comn.utils.JsonUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
@ -78,15 +74,8 @@ public class MessageServiceImpl implements MessageService {
}
/* Websocket Model 메세지 서버로 위임 */
CtrCntrlFlightPlanRq rq = new CtrCntrlFlightPlanRq();
rq.setIdntfNum(model.getObjectId());
// 비정상 상황 체크.
List<BasFlightPlanModel> flightPlan = ctrCntrlService.getFlightPlan(rq);
this.sendToWebsocket(model);
if(model.getTypeCd().equals("01")) {
//마스터 정보에저장
//식별번호로 제작번호 알아오기

53
src/main/java/com/palnet/comn/utils/AreaUtils.java

@ -9,6 +9,7 @@ import org.locationtech.jts.geom.*;
import org.locationtech.jts.geom.impl.CoordinateArraySequence;
import org.locationtech.jts.operation.buffer.BufferOp;
import org.locationtech.jts.operation.buffer.BufferParameters;
import org.locationtech.jts.util.GeometricShapeFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
@ -26,6 +27,8 @@ public class AreaUtils {
private List<Polygon> polygons = new ArrayList<>();
private List<Point> points = new ArrayList<>();
private GeometryFactory geometryFactory = new GeometryFactory();
public AreaUtils() throws Exception {
this.init();
}
@ -39,7 +42,7 @@ public class AreaUtils {
public boolean overlaps(List<Coordinate> targetCoordList) {
boolean result = false;
GeometryFactory geometryFactory = new GeometryFactory();
// GeometryFactory geometryFactory = new GeometryFactory();
Polygon targetPolygon = geometryFactory.createPolygon(targetCoordList.toArray(new Coordinate[]{}));
@ -62,24 +65,26 @@ public class AreaUtils {
}
/**
* TODO 드론 관제시 정상 비행 체크
* TODO 드론 관제시 정상 비행 체크 (Line, Polygon)
*
* @param areaCoordList - 비행 구역 좌표 리스트
* @param targetCoordinate - 드론 좌표 정보
* @return boolean - true(비정상), false(정상)
*/
public boolean contains(List<Coordinate> areaCoordList, Coordinate targetCoordinate) {
GeometryFactory geometryFactory = new GeometryFactory();
// CoordinateSequence coordinateSequence = new CoordinateArraySequence((CoordinateSequence) targetCoordinate);
// GeometryFactory geometryFactory = new GeometryFactory();
LineString line = new GeometryFactory().createLineString(areaCoordList.toArray(new Coordinate[]{}));
boolean result = false;
if(targetCoordinate != null) {
Point point = new Point((CoordinateSequence) targetCoordinate, geometryFactory);
Polygon plan = geometryFactory.createPolygon(areaCoordList.toArray(new Coordinate[]{})); // 비행 구역
// Point target = new Point((CoordinateSequence) targetCoordinate, geometryFactory); // 드론 위치
Point target = geometryFactory.createPoint(targetCoordinate);
boolean contains = line.contains(point);
result = plan.contains(target);
}
return contains;
return result;
}
/**
@ -91,7 +96,7 @@ public class AreaUtils {
*/
public List<Coordinate> buffer(List<Coordinate> coordList, Integer bufferZone) {
List<Coordinate> bufferList = new ArrayList<>();
GeometryFactory geometryFactory = new GeometryFactory();
// GeometryFactory geometryFactory = new GeometryFactory();
LineString line = geometryFactory.createLineString(coordList.toArray(new Coordinate[] {}));
Geometry geometry = geometryFactory.createGeometry(line);
@ -113,6 +118,32 @@ public class AreaUtils {
return bufferList;
}
public List<Coordinate> createCircle(Coordinate CircleCoord, Integer BufferZone) {
List<Coordinate> coordList = new ArrayList<>();
GeometricShapeFactory shapeFactory = new GeometricShapeFactory();
// GeometryFactory geometryFactory = new GeometryFactory();
double lng = CircleCoord.x;
double lat = CircleCoord.y;
double diameterInMeters = BufferZone;
shapeFactory.setCentre(new Coordinate(lng , lat));
shapeFactory.setHeight((diameterInMeters * 2) / 111320d);
shapeFactory.setWidth((diameterInMeters * 2) / (40075000 * Math.cos(Math.toRadians(lat)) / 360));
shapeFactory.setNumPoints(64);
final Polygon circle = shapeFactory.createEllipse();
circle.setSRID(4326);
Geometry geometry = geometryFactory.createGeometry(circle);
Coordinate[] coords = geometry.getCoordinates();
coordList.addAll(Arrays.asList(coords));
return coordList;
}
public List<Coordinate> convertCoordinates(List<BasFlightPlanAreaCoordModel> coordList) {
List<Coordinate> coordinates = new ArrayList<>();
@ -143,7 +174,7 @@ public class AreaUtils {
}
public void init() throws Exception {
GeometryFactory geometryFactory = new GeometryFactory();
// GeometryFactory geometryFactory = new GeometryFactory();
// 1. file read
Resource resource = new ClassPathResource("air/airgeo.json");

Loading…
Cancel
Save