Browse Source

feat: 드론원스톱 영역 로직 변경

develop
지대한 16 hours ago
parent
commit
89b19689b6
  1. 28
      pav-server/src/main/java/com/palnet/biz/api/external/service/DronOneStopService.java
  2. 25
      pav-server/src/main/java/com/palnet/comn/utils/CoordUtils.java
  3. 77
      pav-server/src/test/java/com/palnet/biz/api/external/service/DronOneStopServiceTest.java

28
pav-server/src/main/java/com/palnet/biz/api/external/service/DronOneStopService.java vendored

@ -23,10 +23,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.Instant;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@ -358,7 +355,11 @@ public class DronOneStopService {
return distance;
}
// CPT_CD - 관리부서 & 관제권 부서
// INNER_CPT_CD - 관제권 부서
public DosCptAuthResult getCptAuth(Coordinate centerCoordinate, Double radius) {
Set<String> cptCodeSet = new HashSet<>();
List<Coordinate> targetCoordinate = areaUtils.createCircle(centerCoordinate, radius);
List<CompotentAuthorityRQ> rq = targetCoordinate.stream().map(coordinate -> CompotentAuthorityRQ.builder()
.lat(coordinate.y)
@ -367,10 +368,9 @@ public class DronOneStopService {
List<CompotentAuthorityItemRS> competentAuthority = comnCoordinateService.getCompetentAuthority(rq);
DosCptAuthResult result = new DosCptAuthResult();
if (competentAuthority != null && !competentAuthority.isEmpty()) {
List<String> cptCode = competentAuthority.stream().map(CompotentAuthorityItemRS::getCptAuthCode).distinct().collect(Collectors.toList());
result.setCptCode(cptCode);
cptCodeSet = competentAuthority.stream().map(CompotentAuthorityItemRS::getCptAuthCode).collect(Collectors.toSet());
}
// TODO 관제권 체크 후 결과 반환
// 관제권 airspaces
Map<AirspaceUtils.AirspaceType, String> airspaceParamMap = Map.of(
AirspaceUtils.AirspaceType.C_CONTROL_GIMPO, "F0002", // 김포항공관리사무소(안전운항과)
@ -378,7 +378,8 @@ public class DronOneStopService {
// AirspaceUtils.AirspaceType.C_CONTROL_JEJU, "F0008", // 제주지방항공청(안전운항과)
);
List<String> controlCptCode = new ArrayList<>();
Set<String> controlCptCodeSet = new HashSet<>();
AirspaceUtils airspaceUtils = AirspaceUtils.getInstance();
Geometry targetGeometry = airspaceUtils.createGeometryByCoordinate(targetCoordinate);
for (AirspaceUtils.AirspaceType airspaceType : airspaceParamMap.keySet()) {
@ -389,13 +390,18 @@ public class DronOneStopService {
String innerCptCode = airspaceParamMap.get(airspaceType);
for (AirspaceUtils.FeatureInfo airspace : airspaces) {
if (airspace.getGeometry().intersects(targetGeometry)) {
controlCptCode.add(innerCptCode);
controlCptCodeSet.add(innerCptCode);
cptCodeSet.add(innerCptCode);
break;
}
}
}
if (!controlCptCode.isEmpty()) {
result.setControlCptCode(controlCptCode);
if (!controlCptCodeSet.isEmpty()) {
result.setControlCptCode(new ArrayList<>(controlCptCodeSet));
}
if (!cptCodeSet.isEmpty()) {
result.setCptCode(new ArrayList<>(cptCodeSet));
}
return result;

25
pav-server/src/main/java/com/palnet/comn/utils/CoordUtils.java

@ -614,7 +614,7 @@ public class CoordUtils {
for (JSONObject properties : firstIntersectList) {
List<JSONObject> subPropertiesList = getSubPropertiesByFile(properties, target);
if(!subPropertiesList.isEmpty()) {
if (!subPropertiesList.isEmpty()) {
result.addAll(subPropertiesList);
}
}
@ -660,7 +660,7 @@ public class CoordUtils {
for (JSONObject subProperties : result) {
List<JSONObject> subSubPropertiesList = getSubPropertiesByFile(subProperties, target);
if(!subSubPropertiesList.isEmpty()) {
if (!subSubPropertiesList.isEmpty()) {
result.addAll(subSubPropertiesList);
}
}
@ -696,15 +696,34 @@ public class CoordUtils {
Polygon polygon = geometryFactory.createPolygon(polygonPaths.toArray(new Coordinate[]{}));
if (!polygon.isEmpty()) {
polygons.add(polygon);
// if(!polygon.isValid()){
// log.info(">>>>>>>>>>>>>>>>> is not valid polygon");
// }
}
}
MultiPolygon multiPolygon = null;
Geometry multiPolygon = null;
if (!polygons.isEmpty()) {
multiPolygon = geometryFactory.createMultiPolygon(polygons.toArray(new Polygon[]{}));
}
if (multiPolygon != null) {
if (!multiPolygon.isValid()) {
// log.debug("====================================");
// log.debug("multiPolygon is not valid");
// log.debug("properties: {}", properties);
// int numGeometries = multiPolygon.getNumGeometries();
// for (int i = 0; i < numGeometries; i++) {
// Geometry geometryN = multiPolygon.getGeometryN(i);
// if (!geometryN.isValid()) {
// log.debug("geometryN is not valid :: {} // {}", i, geometryN);
// }
// }
// log.debug("====================================");
multiPolygon = multiPolygon.buffer(0);
}
boolean isIntersects = multiPolygon.intersects(target);
if (isIntersects) {
intersectRs.add(properties);

77
pav-server/src/test/java/com/palnet/biz/api/external/service/DronOneStopServiceTest.java vendored

@ -11,10 +11,18 @@ import org.junit.jupiter.api.Test;
import org.locationtech.jts.geom.Coordinate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.transaction.annotation.Transactional;
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;
@ActiveProfiles("local")
@ -129,14 +137,73 @@ class DronOneStopServiceTest {
}
// CPT 코드 업데이트 - 전체
@Transactional
@Rollback(false)
@Test
void updateAllCptCode() {
List<DosFltPlanArea> all = dosFltPlanAreaRepository.findAll();
int chunk = 100;
long count = dosFltPlanAreaRepository.count();
List<Map<String, Object>> errorList = new ArrayList<>();
for (int i = 0; i < count / chunk + 1; i++) {
Pageable pageable = PageRequest.of(i, chunk);
List<DosFltPlanArea> all = dosFltPlanAreaRepository.findAll(pageable).getContent();
all.forEach(area -> {
try {
DosCptAuthResult result = dronOneStopService.getCptAuth(new Coordinate(area.getLon(), area.getLat()), area.getBufferZone());
area.setCptCd(result.getCptCode());
area.setInnerCptCd(result.getControlCptCode());
log.debug("area sno: {}", area.getPlanAreaSno());
} catch (Exception e) {
log.error("error: {}", e.getMessage());
Map<String, Object> param = new HashMap<>();
param.put("planSno", area.getPlanSno());
param.put("planAreaSno", area.getPlanAreaSno());
param.put("error", e.getMessage());
errorList.add(param);
}
});
List<DosFltPlanArea> dosFltPlanAreaList = dosFltPlanAreaRepository.saveAllAndFlush(all);
log.info("update count: {}", dosFltPlanAreaList.size());
}
log.info("error : {}", errorList);
}
@Transactional
@Rollback(false)
@Test
void updateRecentCptCode() {
List<Map<String, Object>> errorList = new ArrayList<>();
Pageable pageable = PageRequest.of(0, 40, Sort.by(Sort.Order.desc("planAreaSno")));
List<DosFltPlanArea> all = dosFltPlanAreaRepository.findAll(pageable).getContent();
all.forEach(area -> {
DosCptAuthResult result = dronOneStopService.getCptAuth(new Coordinate(area.getLon(), area.getLat()), area.getBufferZone());
result.setCptCode(result.getCptCode());
result.setControlCptCode(result.getControlCptCode());
try {
DosCptAuthResult result = dronOneStopService.getCptAuth(new Coordinate(area.getLon(), area.getLat()), area.getBufferZone());
area.setCptCd(result.getCptCode());
area.setInnerCptCd(result.getControlCptCode());
log.debug("area sno: {}", area.getPlanAreaSno());
} catch (Exception e) {
log.error("error: {}", e.getMessage());
Map<String, Object> param = new HashMap<>();
param.put("planSno", area.getPlanSno());
param.put("planAreaSno", area.getPlanAreaSno());
param.put("error", e.getMessage());
errorList.add(param);
}
});
dosFltPlanAreaRepository.saveAll(all);
List<DosFltPlanArea> dosFltPlanAreaList = dosFltPlanAreaRepository.saveAllAndFlush(all);
log.info("update count: {}", dosFltPlanAreaList.size());
log.info("error : {}", errorList);
}
@Test
void updateAllCptCodeErrorTest() {
DosFltPlanArea area = dosFltPlanAreaRepository.findById(11014L).orElseThrow();
DosCptAuthResult result = dronOneStopService.getCptAuth(new Coordinate(area.getLon(), area.getLat()), area.getBufferZone());
log.info(result.toString());
}
}
Loading…
Cancel
Save