Browse Source

Merge commit '89b19689b6e4c8f6a1b13be0c79199ed5cbf89a1' into feature/dos/statistics

feature/dos/statistics
lkd9125(이경도) 23 hours ago
parent
commit
7fcee082cb
  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 org.springframework.transaction.annotation.Transactional;
import java.time.Instant; import java.time.Instant;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Slf4j @Slf4j
@ -358,7 +355,11 @@ public class DronOneStopService {
return distance; return distance;
} }
// CPT_CD - 관리부서 & 관제권 부서
// INNER_CPT_CD - 관제권 부서
public DosCptAuthResult getCptAuth(Coordinate centerCoordinate, Double radius) { public DosCptAuthResult getCptAuth(Coordinate centerCoordinate, Double radius) {
Set<String> cptCodeSet = new HashSet<>();
List<Coordinate> targetCoordinate = areaUtils.createCircle(centerCoordinate, radius); List<Coordinate> targetCoordinate = areaUtils.createCircle(centerCoordinate, radius);
List<CompotentAuthorityRQ> rq = targetCoordinate.stream().map(coordinate -> CompotentAuthorityRQ.builder() List<CompotentAuthorityRQ> rq = targetCoordinate.stream().map(coordinate -> CompotentAuthorityRQ.builder()
.lat(coordinate.y) .lat(coordinate.y)
@ -367,10 +368,9 @@ public class DronOneStopService {
List<CompotentAuthorityItemRS> competentAuthority = comnCoordinateService.getCompetentAuthority(rq); List<CompotentAuthorityItemRS> competentAuthority = comnCoordinateService.getCompetentAuthority(rq);
DosCptAuthResult result = new DosCptAuthResult(); DosCptAuthResult result = new DosCptAuthResult();
if (competentAuthority != null && !competentAuthority.isEmpty()) { if (competentAuthority != null && !competentAuthority.isEmpty()) {
List<String> cptCode = competentAuthority.stream().map(CompotentAuthorityItemRS::getCptAuthCode).distinct().collect(Collectors.toList()); cptCodeSet = competentAuthority.stream().map(CompotentAuthorityItemRS::getCptAuthCode).collect(Collectors.toSet());
result.setCptCode(cptCode);
} }
// TODO 관제권 체크 후 결과 반환
// 관제권 airspaces // 관제권 airspaces
Map<AirspaceUtils.AirspaceType, String> airspaceParamMap = Map.of( Map<AirspaceUtils.AirspaceType, String> airspaceParamMap = Map.of(
AirspaceUtils.AirspaceType.C_CONTROL_GIMPO, "F0002", // 김포항공관리사무소(안전운항과) AirspaceUtils.AirspaceType.C_CONTROL_GIMPO, "F0002", // 김포항공관리사무소(안전운항과)
@ -378,7 +378,8 @@ public class DronOneStopService {
// AirspaceUtils.AirspaceType.C_CONTROL_JEJU, "F0008", // 제주지방항공청(안전운항과) // AirspaceUtils.AirspaceType.C_CONTROL_JEJU, "F0008", // 제주지방항공청(안전운항과)
); );
List<String> controlCptCode = new ArrayList<>();
Set<String> controlCptCodeSet = new HashSet<>();
AirspaceUtils airspaceUtils = AirspaceUtils.getInstance(); AirspaceUtils airspaceUtils = AirspaceUtils.getInstance();
Geometry targetGeometry = airspaceUtils.createGeometryByCoordinate(targetCoordinate); Geometry targetGeometry = airspaceUtils.createGeometryByCoordinate(targetCoordinate);
for (AirspaceUtils.AirspaceType airspaceType : airspaceParamMap.keySet()) { for (AirspaceUtils.AirspaceType airspaceType : airspaceParamMap.keySet()) {
@ -389,13 +390,18 @@ public class DronOneStopService {
String innerCptCode = airspaceParamMap.get(airspaceType); String innerCptCode = airspaceParamMap.get(airspaceType);
for (AirspaceUtils.FeatureInfo airspace : airspaces) { for (AirspaceUtils.FeatureInfo airspace : airspaces) {
if (airspace.getGeometry().intersects(targetGeometry)) { if (airspace.getGeometry().intersects(targetGeometry)) {
controlCptCode.add(innerCptCode); controlCptCodeSet.add(innerCptCode);
cptCodeSet.add(innerCptCode);
break; break;
} }
} }
} }
if (!controlCptCode.isEmpty()) { if (!controlCptCodeSet.isEmpty()) {
result.setControlCptCode(controlCptCode); result.setControlCptCode(new ArrayList<>(controlCptCodeSet));
}
if (!cptCodeSet.isEmpty()) {
result.setCptCode(new ArrayList<>(cptCodeSet));
} }
return result; 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) { for (JSONObject properties : firstIntersectList) {
List<JSONObject> subPropertiesList = getSubPropertiesByFile(properties, target); List<JSONObject> subPropertiesList = getSubPropertiesByFile(properties, target);
if(!subPropertiesList.isEmpty()) { if (!subPropertiesList.isEmpty()) {
result.addAll(subPropertiesList); result.addAll(subPropertiesList);
} }
} }
@ -660,7 +660,7 @@ public class CoordUtils {
for (JSONObject subProperties : result) { for (JSONObject subProperties : result) {
List<JSONObject> subSubPropertiesList = getSubPropertiesByFile(subProperties, target); List<JSONObject> subSubPropertiesList = getSubPropertiesByFile(subProperties, target);
if(!subSubPropertiesList.isEmpty()) { if (!subSubPropertiesList.isEmpty()) {
result.addAll(subSubPropertiesList); result.addAll(subSubPropertiesList);
} }
} }
@ -696,15 +696,34 @@ public class CoordUtils {
Polygon polygon = geometryFactory.createPolygon(polygonPaths.toArray(new Coordinate[]{})); Polygon polygon = geometryFactory.createPolygon(polygonPaths.toArray(new Coordinate[]{}));
if (!polygon.isEmpty()) { if (!polygon.isEmpty()) {
polygons.add(polygon); polygons.add(polygon);
// if(!polygon.isValid()){
// log.info(">>>>>>>>>>>>>>>>> is not valid polygon");
// }
} }
} }
MultiPolygon multiPolygon = null;
Geometry multiPolygon = null;
if (!polygons.isEmpty()) { if (!polygons.isEmpty()) {
multiPolygon = geometryFactory.createMultiPolygon(polygons.toArray(new Polygon[]{})); multiPolygon = geometryFactory.createMultiPolygon(polygons.toArray(new Polygon[]{}));
} }
if (multiPolygon != null) { 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); boolean isIntersects = multiPolygon.intersects(target);
if (isIntersects) { if (isIntersects) {
intersectRs.add(properties); 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.locationtech.jts.geom.Coordinate;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; 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.test.context.ActiveProfiles;
import org.springframework.transaction.annotation.Transactional;
import java.time.Instant; import java.time.Instant;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ActiveProfiles("local") @ActiveProfiles("local")
@ -129,14 +137,73 @@ class DronOneStopServiceTest {
} }
// CPT 코드 업데이트 - 전체 // CPT 코드 업데이트 - 전체
@Transactional
@Rollback(false)
@Test @Test
void updateAllCptCode() { 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 -> { all.forEach(area -> {
DosCptAuthResult result = dronOneStopService.getCptAuth(new Coordinate(area.getLon(), area.getLat()), area.getBufferZone()); try {
result.setCptCode(result.getCptCode()); DosCptAuthResult result = dronOneStopService.getCptAuth(new Coordinate(area.getLon(), area.getLat()), area.getBufferZone());
result.setControlCptCode(result.getControlCptCode()); 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