|
|
|
@ -4,6 +4,7 @@ import lombok.AllArgsConstructor;
|
|
|
|
|
import lombok.Data; |
|
|
|
|
import lombok.NoArgsConstructor; |
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
import org.apache.tomcat.util.modeler.FeatureInfo; |
|
|
|
|
import org.geotools.geojson.feature.FeatureJSON; |
|
|
|
|
import org.geotools.geojson.geom.GeometryJSON; |
|
|
|
|
import org.json.simple.JSONArray; |
|
|
|
@ -56,8 +57,17 @@ public class AirspaceUtils {
|
|
|
|
|
private static final AirspaceUtils INSTANCE = new AirspaceUtils(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 공역 중복 검사
|
|
|
|
|
// 공영 중복 검사 - 고도x
|
|
|
|
|
public boolean isDuplicatedAirspace(FeatureInfo target) { |
|
|
|
|
Geometry targetGeometry = target.getGeometry(); |
|
|
|
|
return this.airspaces.stream().anyMatch(featureInfo -> { |
|
|
|
|
Geometry featureGeometry = featureInfo.getGeometry(); |
|
|
|
|
return featureGeometry.intersects(targetGeometry); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 공역 중복 검사
|
|
|
|
|
public boolean isDuplicatedAirspaceElev(FeatureInfo target) { |
|
|
|
|
if (this.airspaces == null || this.airspaces.isEmpty()) return true; |
|
|
|
|
Integer targetHighElev = target.getHighElev(); |
|
|
|
|
if (targetHighElev == null) targetHighElev = 0; |
|
|
|
@ -73,11 +83,42 @@ public class AirspaceUtils {
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
LAANC 공역 검사 |
|
|
|
|
- 비행구역이 공역(금지구역)에 접근할 경우만 검사 - 통과 true, 실패 false |
|
|
|
|
- 겹치지 않을 경우는 실패로 처리 - false |
|
|
|
|
*/ |
|
|
|
|
public boolean isValidLaancAirspace(FeatureInfo target) { |
|
|
|
|
if (this.airspaces == null || this.airspaces.isEmpty()) return true; |
|
|
|
|
final int targetHighElev = target.getHighElev() != null ? target.getHighElev() : 0; |
|
|
|
|
Geometry targetGeometry = target.getGeometry(); |
|
|
|
|
|
|
|
|
|
boolean isDuplicated = this.airspaces.stream().anyMatch(featureInfo -> { |
|
|
|
|
Geometry featureGeometry = featureInfo.getGeometry(); |
|
|
|
|
return featureGeometry.intersects(targetGeometry); |
|
|
|
|
}); |
|
|
|
|
// 공역(금지구역)과 겹치지 않을 경우는 실패로 처리
|
|
|
|
|
if (!isDuplicated) return false; |
|
|
|
|
|
|
|
|
|
// 겹칠 경우 공역과 비교
|
|
|
|
|
for (FeatureInfo featureInfo : this.airspaces) { |
|
|
|
|
Geometry airspaceGeometry = featureInfo.getGeometry(); |
|
|
|
|
int airspaceHighElev = featureInfo.getHighElev() != null ? featureInfo.getHighElev() : 0; |
|
|
|
|
// 임시로 0~최대고도 기준으로 검증
|
|
|
|
|
if (airspaceHighElev == 0 || airspaceHighElev < targetHighElev) { |
|
|
|
|
if (airspaceGeometry.intersects(targetGeometry)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Geometry createGeometryByCoordinate(List<Coordinate> target) { |
|
|
|
|
return this.createGeometryByCoordinate(target, "Polygon"); |
|
|
|
|
} |
|
|
|
@ -102,11 +143,9 @@ public class AirspaceUtils {
|
|
|
|
|
// 파일에서 공역 데이터 가져와서 geometry로 변환 - 초기화.
|
|
|
|
|
private void getResourceAirspace() { |
|
|
|
|
ClassPathResource resource = new ClassPathResource(CLASS_PATH); |
|
|
|
|
log.debug(">>> {}", resource); |
|
|
|
|
List<File> geoJsonFiles = new ArrayList<>(); |
|
|
|
|
try { |
|
|
|
|
File folder = resource.getFile(); |
|
|
|
|
log.debug(">>> {}", folder); |
|
|
|
|
File[] files = folder.listFiles(); |
|
|
|
|
for (File file : files) { |
|
|
|
|
if (file.isFile() && file.getName().endsWith("elev.json")) { |
|
|
|
@ -120,7 +159,6 @@ public class AirspaceUtils {
|
|
|
|
|
|
|
|
|
|
List<FeatureInfo> featureInfos = new ArrayList<>(); |
|
|
|
|
for (File file : geoJsonFiles) { |
|
|
|
|
log.debug("============ {} ===================", file.getName()); |
|
|
|
|
try (InputStreamReader isr = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8)) { |
|
|
|
|
JSONParser jsonParser = new JSONParser(); |
|
|
|
|
JSONObject jsonObject = (JSONObject) jsonParser.parse(isr); |
|
|
|
@ -253,6 +291,7 @@ public class AirspaceUtils {
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
log.info("=== 김포 정상 ==="); |
|
|
|
|
Coordinate[] polygonCoordinates6 = new Coordinate[]{ |
|
|
|
|
new Coordinate(126.6186219, 37.4260888), |
|
|
|
@ -266,7 +305,8 @@ public class AirspaceUtils {
|
|
|
|
|
target6.setHighElev(0); |
|
|
|
|
target6.setLowElev(0); |
|
|
|
|
target6.setGeometry(polygon6); |
|
|
|
|
boolean duplicatedAirspace6 = airspaceUtils.isDuplicatedAirspace(target6); |
|
|
|
|
// boolean duplicatedAirspace6 = airspaceUtils.isDuplicatedAirspace(target6);
|
|
|
|
|
boolean duplicatedAirspace6 = airspaceUtils.isValidLaancAirspace(target6); |
|
|
|
|
log.info(">>> duplicatedAirspace : {}", duplicatedAirspace6); |
|
|
|
|
|
|
|
|
|
log.info("=== 김포 120m 걸침 - 100 ==="); |
|
|
|
@ -282,7 +322,8 @@ public class AirspaceUtils {
|
|
|
|
|
target7.setHighElev(100); |
|
|
|
|
target7.setLowElev(0); |
|
|
|
|
target7.setGeometry(polygon7); |
|
|
|
|
boolean duplicatedAirspace7 = airspaceUtils.isDuplicatedAirspace(target7); |
|
|
|
|
// boolean duplicatedAirspace7 = airspaceUtils.isDuplicatedAirspace(target7);
|
|
|
|
|
boolean duplicatedAirspace7 = airspaceUtils.isValidLaancAirspace(target7); |
|
|
|
|
log.info(">>> duplicatedAirspace : {}", duplicatedAirspace7); |
|
|
|
|
|
|
|
|
|
log.info("=== 김포 120m 걸침 - 150 ==="); |
|
|
|
@ -298,7 +339,8 @@ public class AirspaceUtils {
|
|
|
|
|
target8.setHighElev(150); |
|
|
|
|
target8.setLowElev(0); |
|
|
|
|
target8.setGeometry(polygon8); |
|
|
|
|
boolean duplicatedAirspace8 = airspaceUtils.isDuplicatedAirspace(target8); |
|
|
|
|
// boolean duplicatedAirspace8 = airspaceUtils.isDuplicatedAirspace(target8);
|
|
|
|
|
boolean duplicatedAirspace8 = airspaceUtils.isValidLaancAirspace(target8); |
|
|
|
|
log.info(">>> duplicatedAirspace : {}", duplicatedAirspace8); |
|
|
|
|
|
|
|
|
|
log.info("=== 김포 120m 걸침 - 120 ==="); |
|
|
|
@ -314,7 +356,8 @@ public class AirspaceUtils {
|
|
|
|
|
target9.setHighElev(120); |
|
|
|
|
target9.setLowElev(0); |
|
|
|
|
target9.setGeometry(polygon9); |
|
|
|
|
boolean duplicatedAirspace9 = airspaceUtils.isDuplicatedAirspace(target9); |
|
|
|
|
// boolean duplicatedAirspace9 = airspaceUtils.isDuplicatedAirspace(target9);
|
|
|
|
|
boolean duplicatedAirspace9 = airspaceUtils.isValidLaancAirspace(target9); |
|
|
|
|
log.info(">>> duplicatedAirspace : {}", duplicatedAirspace9); |
|
|
|
|
|
|
|
|
|
log.info("=== 김포 40m 걸침 - 20 ==="); |
|
|
|
@ -330,7 +373,8 @@ public class AirspaceUtils {
|
|
|
|
|
target10.setHighElev(20); |
|
|
|
|
target10.setLowElev(0); |
|
|
|
|
target10.setGeometry(polygon10); |
|
|
|
|
boolean duplicatedAirspace10 = airspaceUtils.isDuplicatedAirspace(target10); |
|
|
|
|
// boolean duplicatedAirspace10 = airspaceUtils.isDuplicatedAirspace(target10);
|
|
|
|
|
boolean duplicatedAirspace10 = airspaceUtils.isValidLaancAirspace(target10); |
|
|
|
|
log.info(">>> duplicatedAirspace : {}", duplicatedAirspace10); |
|
|
|
|
|
|
|
|
|
log.info("=== 김포 40m 걸침 - 100 ==="); |
|
|
|
@ -346,7 +390,8 @@ public class AirspaceUtils {
|
|
|
|
|
target11.setHighElev(100); |
|
|
|
|
target11.setLowElev(0); |
|
|
|
|
target11.setGeometry(polygon11); |
|
|
|
|
boolean duplicatedAirspace11 = airspaceUtils.isDuplicatedAirspace(target11); |
|
|
|
|
// boolean duplicatedAirspace11 = airspaceUtils.isDuplicatedAirspace(target11);
|
|
|
|
|
boolean duplicatedAirspace11 = airspaceUtils.isValidLaancAirspace(target11); |
|
|
|
|
log.info(">>> duplicatedAirspace : {}", duplicatedAirspace11); |
|
|
|
|
|
|
|
|
|
log.info("=== 김포 40m 걸침 - 40 ==="); |
|
|
|
@ -362,7 +407,8 @@ public class AirspaceUtils {
|
|
|
|
|
target12.setHighElev(40); |
|
|
|
|
target12.setLowElev(0); |
|
|
|
|
target12.setGeometry(polygon12); |
|
|
|
|
boolean duplicatedAirspace12 = airspaceUtils.isDuplicatedAirspace(target12); |
|
|
|
|
// boolean duplicatedAirspace12 = airspaceUtils.isDuplicatedAirspace(target12);
|
|
|
|
|
boolean duplicatedAirspace12 = airspaceUtils.isValidLaancAirspace(target12); |
|
|
|
|
log.info(">>> duplicatedAirspace : {}", duplicatedAirspace12); |
|
|
|
|
|
|
|
|
|
log.info("=== 김포 0 ==="); |
|
|
|
@ -378,7 +424,8 @@ public class AirspaceUtils {
|
|
|
|
|
target13.setHighElev(0); |
|
|
|
|
target13.setLowElev(0); |
|
|
|
|
target13.setGeometry(polygon13); |
|
|
|
|
boolean duplicatedAirspace13 = airspaceUtils.isDuplicatedAirspace(target13); |
|
|
|
|
// boolean duplicatedAirspace13 = airspaceUtils.isDuplicatedAirspace(target13);
|
|
|
|
|
boolean duplicatedAirspace13 = airspaceUtils.isValidLaancAirspace(target13); |
|
|
|
|
log.info(">>> duplicatedAirspace : {}", duplicatedAirspace13); |
|
|
|
|
|
|
|
|
|
// 김포
|
|
|
|
|