Browse Source

Merge commit '0c1111c6575d0291b7d0e43e49255a4b6866afeb' into feature/lannc/pdf-create

pull/3/head
lkd9125 1 year ago
parent
commit
0adb107151
  1. 178
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java
  2. 26
      pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRq.java
  3. 30
      pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRs.java
  4. 41
      pav-server/src/main/java/com/palnet/biz/api/external/service/TsService.java
  5. 5
      pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java
  6. 456
      pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java
  7. 6
      pav-server/src/main/java/com/palnet/comn/utils/AreaUtils.java
  8. 14781
      pav-server/src/main/resources/air/airgeo.json
  9. 25326
      pav-server/src/main/resources/air/elev2d/airgeo-elev.json
  10. 5891
      pav-server/src/main/resources/air/elev2d/gimpo-airport-2d-elev.json
  11. 5
      pav-server/src/main/resources/air/sample/airgeo-3d.json
  12. 1820
      pav-server/src/main/resources/air/sample/airgeo-gimpo-airport.json
  13. 14786
      pav-server/src/main/resources/air/sample/gimpo-airport-2d-square.json
  14. 5
      pav-server/src/main/resources/air/sample/gimpo-airport-3d.json

178
pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java

@ -1,24 +1,30 @@
package com.palnet.biz.api.bas.flight.service;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.bas.flight.model.*;
import com.palnet.biz.api.bas.group.model.BasGroupJoinModel;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.api.external.model.PilotValidRq;
import com.palnet.biz.api.external.model.PilotValidRs;
import com.palnet.biz.api.external.service.TsService;
import com.palnet.biz.jpa.entity.*;
import com.palnet.biz.jpa.repository.flt.*;
import com.palnet.biz.jpa.repository.pty.PtyGroupQueryRepository;
import com.palnet.biz.scheduler.ctr.model.CtrTrnsLctnModel;
import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService;
import com.palnet.comn.utils.AirspaceUtils;
import com.palnet.comn.utils.AreaUtils;
import com.palnet.comn.utils.EncryptUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
@ -26,40 +32,27 @@ import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.bas.group.model.BasGroupJoinModel;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.jpa.entity.FltPlanArcrft;
import com.palnet.biz.jpa.entity.FltPlanArea;
import com.palnet.biz.jpa.entity.FltPlanAreaCoord;
import com.palnet.biz.jpa.entity.FltPlanBas;
import com.palnet.biz.jpa.entity.FltPlanPilot;
import com.palnet.biz.jpa.repository.flt.FltPlanArcrftRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanAreaCoordRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanAreaRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanPilotRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanQueryRepository;
import com.palnet.biz.jpa.repository.pty.PtyGroupQueryRepository;
import com.palnet.biz.scheduler.ctr.model.CtrTrnsLctnModel;
import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService;
import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.AreaUtils;
import com.palnet.comn.utils.EncryptUtils;
import lombok.extern.log4j.Log4j2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Log4j2
@Slf4j
@RequiredArgsConstructor
@Service
@Transactional(readOnly = true)
public class BasFlightService {
@Autowired
private CtrTrnsLctnService ctrTrnsLctnService;
private final CtrTrnsLctnService ctrTrnsLctnService;
private final FltPlanBasRepository fltPlanBasRepository;
private final FltPlanArcrftRepository fltPlanArcrftRepository;
private final FltPlanAreaRepository fltPlanAreaRepository;
@ -67,28 +60,10 @@ public class BasFlightService {
private final FltPlanPilotRepository fltPlanPilotRepository;
private final FltPlanQueryRepository fltPlanQueryRepository;
private final PtyGroupQueryRepository ptyPlanQueryRepository;
private final TsService tsService;
private final JwtTokenUtil jwtTokenUtil;
private final AreaUtils areaUtils;
public BasFlightService(FltPlanBasRepository fltPlanBasRepository,
FltPlanArcrftRepository fltPlanArcrftRepository,
FltPlanAreaRepository fltPlanAreaRepository,
FltPlanAreaCoordRepository fltPlanAreaCoordRepository,
FltPlanPilotRepository fltPlanPilotRepository,
FltPlanQueryRepository fltPlanQueryRepository,
PtyGroupQueryRepository ptyPlanQueryRepository,
JwtTokenUtil jwtTokenUtil,
AreaUtils areaUtils) {
this.fltPlanBasRepository = fltPlanBasRepository;
this.fltPlanArcrftRepository = fltPlanArcrftRepository;
this.fltPlanAreaRepository = fltPlanAreaRepository;
this.fltPlanAreaCoordRepository = fltPlanAreaCoordRepository;
this.fltPlanPilotRepository = fltPlanPilotRepository;
this.fltPlanQueryRepository = fltPlanQueryRepository;
this.ptyPlanQueryRepository = ptyPlanQueryRepository;
this.jwtTokenUtil = jwtTokenUtil;
this.areaUtils = areaUtils;
}
// 비행계획서 조회
public ComnPagingRs<BasFlightPlanModel> listPlan(BasFlightPlanListRq rq) {
@ -181,6 +156,7 @@ public class BasFlightService {
.planAreaDuplicatdYn("N")
.build();
boolean isEqualsFltElev = false;
List<BasFlightPlanAreaModel> rqAreaList = rq.getAreaList();
String rqFltElev = rqAreaList.get(0).getFltElev();
@ -293,6 +269,35 @@ public class BasFlightService {
}
}
// 공역 중복 확인
for (BasFlightPlanAreaModel rqArea : rq.getAreaList()) {
List<Coordinate> rqCoord = new ArrayList<>();
List<Coordinate> rqCoordBufferList = new ArrayList<>();
//rq로 들어온 좌표로 버퍼좌표 생성
for (BasFlightPlanAreaCoordModel coord : rqArea.getCoordList()) {
Coordinate coords = new Coordinate(coord.getLon(), coord.getLat());
rqCoord.add(coords);
}
if ("LINE".equals(rqArea.getAreaType())) {
List<Coordinate> trans = areaUtils.transform(rqCoord, "EPSG:4326", "EPSG:5181");
List<Coordinate> bufferList = areaUtils.buffer(trans, rqArea.getBufferZone());
rqCoordBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326");
} else if ("POLYGON".equals(rqArea.getAreaType())) {
rqCoordBufferList.addAll(rqCoord);
} else if ("CIRCLE".equals(rqArea.getAreaType())) {
rqCoordBufferList = areaUtils.createCircle(rqCoord.get(0), rqArea.getBufferZone());
}
AirspaceUtils airspaceUtils = AirspaceUtils.getInstance();
Geometry rqGeometry = airspaceUtils.createGeometryByCoordinate(rqCoordBufferList);
Integer fltElev = Integer.valueOf(rqArea.getFltElev());
if(fltElev == null) fltElev = 0;
AirspaceUtils.FeatureInfo featureInfo = new AirspaceUtils.FeatureInfo(null, null, 0, fltElev, rqGeometry);
boolean duplicatedAirspace = airspaceUtils.isDuplicatedAirspace(featureInfo);
rs.setAirspaceDuplicatedYn(duplicatedAirspace ? "Y" : "N");
}
return rs;
}
@ -302,12 +307,22 @@ public class BasFlightService {
// 비행계획서 유효성 검사.
BasFlightPlanLaancRs rs = this.planValid(rq);
// TODO 공역 중복 확인
rs.setAirspaceDuplicatedYn("N");
// TODO 조종사 자격 및 기체보험 확인
rs.setPilotQlfcYn("Y");
rs.setAcrftInsuranceYn("Y");
PilotValidRq pilotValidRq = PilotValidRq.builder()
.pilotci("조종사CI")
.declarationnum("기체신고번호")
.build();
PilotValidRs pilotValidRs = tsService.callPilotValid(pilotValidRq);
if(pilotValidRs == null){
rs.setPilotQlfcYn("N");
rs.setAcrftInsuranceYn("N");
} else {
rs.setPilotQlfcYn(pilotValidRs.getPilotcredentialyn());
rs.setAcrftInsuranceYn(pilotValidRs.getArcrftinsuranceyn());
}
// TODO LAANC가 검증된것들만 DB저장 - LAANC가 미승인이라도 저장해야하는지 확인 필요
if(!rs.isValid()) return rs;
// 비행계획서
@ -317,6 +332,10 @@ public class BasFlightService {
basEntity.setAprvlYn("N");
basEntity.setCreateUserId(userId);
basEntity.setUpdateUserId(userId);
// 사업자 유무 - TS 데이터
basEntity.setCorpRegYn(pilotValidRs.getCorpregyn()); // 사업자유무
basEntity.setServiceType("PAV-KAC");
FltPlanBas rBasEntity = fltPlanBasRepository.save(basEntity);
Integer planSno = rBasEntity.getPlanSno();
// 비행구역
@ -327,6 +346,7 @@ public class BasFlightService {
areaEntity.setPlanSno(planSno);
areaEntity.setCreateUserId(userId);
areaEntity.setUpdateUserId(userId);
FltPlanArea rAreaEntity = fltPlanAreaRepository.save(areaEntity);
Integer planAreaSno = rAreaEntity.getPlanAreaSno();
List<BasFlightPlanAreaCoordModel> coordModelList = areaModel.getCoordList();
@ -362,6 +382,10 @@ public class BasFlightService {
arcrftEntity.setPlanSno(planSno);
arcrftEntity.setCreateUserId(userId);
arcrftEntity.setUpdateUserId(userId);
// 추가 필드
arcrftEntity.setAcrftInsuranceYn(pilotValidRs.getArcrftinsuranceyn()); // 보험여부
// arcrftEntity.setInsuranceExperiod(null); // 보헌 유효기간
// arcrftEntity.setCorporationNm(null); // 법인명
fltPlanArcrftRepository.save(arcrftEntity);
}
}
@ -372,15 +396,24 @@ public class BasFlightService {
@Transactional
public BasFlightPlanLaancRs updatePlan(BasFlightPlanModel rq) {
// 비행계획서 유효성 검사.
// 비행계획서 유효성 검사.
BasFlightPlanLaancRs rs = this.planValid(rq);
// TODO 공역 중복 확인
rs.setAirspaceDuplicatedYn("N");
// TODO 조종사 자격 및 기체보험 확인
rs.setPilotQlfcYn("Y");
rs.setAcrftInsuranceYn("Y");
PilotValidRq pilotValidRq = PilotValidRq.builder()
.pilotci("조종사CI")
.declarationnum("기체신고번호")
.build();
PilotValidRs pilotValidRs = tsService.callPilotValid(pilotValidRq);
if(pilotValidRs == null){
rs.setPilotQlfcYn("N");
rs.setAcrftInsuranceYn("N");
} else {
rs.setPilotQlfcYn(pilotValidRs.getPilotcredentialyn());
rs.setAcrftInsuranceYn(pilotValidRs.getArcrftinsuranceyn());
}
// LAANC가 검증된것들만 DB저장
if(!rs.isValid()) return rs;
if (rq != null && rq.getPlanSno() != null) {
@ -390,6 +423,10 @@ public class BasFlightService {
FltPlanBas planEntity = fltPlanBasRepository.findById(planSno).orElseThrow();
BasFlightMapper.mapper.updateEntityByModel(planEntity, rq);
planEntity.setUpdateUserId(userId);
// 사업자 유무 - TS 데이터
planEntity.setCorpRegYn(pilotValidRs.getCorpregyn()); // 사업자유무
// planEntity.setServiceType("PAV-KAC");
fltPlanBasRepository.save(planEntity);
// 비행구역
@ -406,6 +443,7 @@ public class BasFlightService {
BasFlightMapper.mapper.updateEntityByModel(areaEntity, areaModel);
}
areaEntity.setUpdateUserId(userId);
fltPlanAreaRepository.save(areaEntity);
@ -487,6 +525,8 @@ public class BasFlightService {
} else {
BasFlightMapper.mapper.updateEntityByModel(arcrftEntity, arcrftModel);
}
// 추가 필드
arcrftEntity.setAcrftInsuranceYn(pilotValidRs.getArcrftinsuranceyn()); // 보험여부
fltPlanArcrftRepository.save(arcrftEntity);
}
List<FltPlanArcrft> deleteArcrftEntity = arcrftEntityList.stream().filter(fltPlanArcrft -> {

26
pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRq.java vendored

@ -0,0 +1,26 @@
package com.palnet.biz.api.external.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* packageName : com.palnet.biz.api.external.model
* fileName : PilotValidRq
* author : dhji
* date : 2023-09-21(021)
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2023-09-21(021) dhji 최초 생성
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PilotValidRq {
private String pilotci; // 조종사 ci - 본인인증
private String declarationnum; // 기체신고번호
}

30
pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRs.java vendored

@ -0,0 +1,30 @@
package com.palnet.biz.api.external.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* packageName : com.palnet.biz.api.external.model
* fileName : PilotValidRq
* author : dhji
* date : 2023-09-21(021)
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2023-09-21(021) dhji 최초 생성
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PilotValidRs {
private String rspCode; // 결과코드
private String rspMessage; // 결과메시지
private String pilotcredentialyn; // 조종사자격증명여부
private String arcrftinsuranceyn; // 기체보험가입여부
private String arcrftdeclaration; // 기체신고여부
private String corpregyn; // 사업자유무
}

41
pav-server/src/main/java/com/palnet/biz/api/external/service/TsService.java vendored

@ -0,0 +1,41 @@
package com.palnet.biz.api.external.service;
import com.palnet.biz.api.external.model.PilotValidRq;
import com.palnet.biz.api.external.model.PilotValidRs;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* packageName : com.palnet.biz.api.external.service
* fileName : TsService
* author : dhji
* date : 2023-09-21(021)
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2023-09-21(021) dhji 최초 생성
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class TsService {
public PilotValidRs callPilotValid(PilotValidRq rq) {
// if(rq.getPilotci() == null || rq.getDeclarationnum() == null) {
// return null;
// }
// TODO: call pilot valid api
// RS 임시코드 - 추후 조건에 따른 TRUE/FALSE 처리 필요
PilotValidRs pilotValidRs = new PilotValidRs();
pilotValidRs.setRspCode("200");
pilotValidRs.setRspMessage("success");
pilotValidRs.setPilotcredentialyn("Y");
pilotValidRs.setArcrftinsuranceyn("Y");
pilotValidRs.setArcrftdeclaration("Y");
pilotValidRs.setCorpregyn("Y");
return pilotValidRs;
}
}

5
pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java

@ -10,8 +10,9 @@ public enum ErrorCode {
DATA_NO("DT003", "데이터 미존재"),
DB_ERROR("DB001" , "디비 처리중 오류"),
PLAN_DATA_DUPLICATE("FT500", "이미 등록된 비행계획서의 비행구역과 비행시간이 일치합니다.\n비행시간 또는 비행구역을 수정하여 주십시오."),
ARCRFT_DATA_DUPLICATE("FT500", "해당 기체는 다른 비행계획서에서 이미 등록된 기체입니다.\n비행시간 또는 기체 정보를 확인하여 주십시오.");
ARCRFT_DATA_DUPLICATE("FT500", "해당 기체는 다른 비행계획서에서 이미 등록된 기체입니다.\n비행시간 또는 기체 정보를 확인하여 주십시오."),
EXTERNAL_API_ERROR("EA500", "외부서버 호출에 실패하였습니다.");
private final String code;

456
pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java

@ -0,0 +1,456 @@
package com.palnet.comn.utils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.geotools.geojson.feature.FeatureJSON;
import org.geotools.geojson.geom.GeometryJSON;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.locationtech.jts.geom.*;
import org.opengis.feature.simple.SimpleFeature;
import org.springframework.core.io.ClassPathResource;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* packageName : com.palnet.comn.utils
* fileName : AirspaceUtils
* author : dhji
* date : 2023-09-20(020)
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2023-09-20(020) dhji 최초 생성
*/
@Slf4j
public class AirspaceUtils {
private final String CLASS_PATH = "air/elev2d";
private final GeometryFactory geometryFactory = new GeometryFactory();
private List<FeatureInfo> airspaces;
private AirspaceUtils() {
log.info(">>> AirspaceUtils init...");
// 초기화
this.getResourceAirspace();
}
public static AirspaceUtils getInstance() {
return LazyHolder.INSTANCE;
}
private static class LazyHolder {
private static final AirspaceUtils INSTANCE = new AirspaceUtils();
}
// 공역 중복 검사
public boolean isDuplicatedAirspace(FeatureInfo target) {
if (this.airspaces == null || this.airspaces.isEmpty()) return true;
Integer targetHighElev = target.getHighElev();
if (targetHighElev == null) targetHighElev = 0;
Geometry targetGeometry = target.getGeometry();
for (FeatureInfo airspace : this.airspaces) {
Integer airspaceHighElev = airspace.getHighElev();
Geometry airspaceGeometry = airspace.getGeometry();
// 임시로 0~최대고도 기준으로 검증
if(airspaceHighElev <= targetHighElev) {
if (airspaceGeometry.intersects(targetGeometry)) {
return true;
}
}
}
return false;
}
public Geometry createGeometryByCoordinate(List<Coordinate> target) {
return this.createGeometryByCoordinate(target, "Polygon");
}
public Geometry createGeometryByCoordinate(List<Coordinate> target, String type) {
Geometry geometry = null;
if ("Polygon".equals(type)) {
geometry = this.geometryFactory.createPolygon(target.toArray(new Coordinate[0]));
} else if ("LineString".equals(type)) {
geometry = this.geometryFactory.createLineString(target.toArray(new Coordinate[0]));
} else if ("Point".equals(type)) {
geometry = this.geometryFactory.createPoint(target.get(0));
}
return geometry;
}
// get geometry
private List<Geometry> getAirspaceGeometry() {
return this.airspaces.stream().map(FeatureInfo::getGeometry).collect(Collectors.toList());
}
// 파일에서 공역 데이터 가져와서 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")) {
log.debug(">>> {}", file.getName());
geoJsonFiles.add(file);
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
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);
List<FeatureInfo> convertFeatureInfos = convertGeoJsonToGeometry(jsonObject);
featureInfos.addAll(convertFeatureInfos);
} catch (Exception e) {
log.error("ERROR : ", e);
featureInfos = null;
}
if (featureInfos != null && featureInfos.isEmpty()) {
featureInfos = null;
}
}
this.airspaces = featureInfos;
}
private List<FeatureInfo> convertGeoJsonToGeometry(JSONObject jsonObject) {
List<FeatureInfo> featureInfos = new ArrayList<>();
String type = (String) jsonObject.get("type");
if ("FeatureCollection".equals(type)) {
List<JSONObject> features = (List<JSONObject>) jsonObject.get("features");
// log.debug(">>> features size : {}", features.size());
for (JSONObject feature : features) {
JSONObject geometryObject = (JSONObject) feature.get("geometry");
String geometryType = String.valueOf(geometryObject.get("type"));
List<JSONObject> coordinatesObject = (List<JSONObject>) geometryObject.get("coordinates");
if ("Polygon".equals(geometryType)) {
List<JSONArray> innerObject = (List<JSONArray>) coordinatesObject.get(0);
JSONArray firstCoords = innerObject.get(0);
JSONArray lastCoords = innerObject.get(innerObject.size() - 1);
BigDecimal ff = new BigDecimal(String.valueOf(firstCoords.get(0)));
BigDecimal fl = new BigDecimal(String.valueOf(firstCoords.get(1)));
BigDecimal lf = new BigDecimal(String.valueOf(lastCoords.get(0)));
BigDecimal ll = new BigDecimal(String.valueOf(lastCoords.get(1)));
if (!ff.equals(lf) || !fl.equals(ll)) {
JSONObject propertiesObject = (JSONObject) feature.get("properties");
// String nameObject = String.valueOf(propertiesObject.get("name"));
// String descriptionObject = String.valueOf(propertiesObject.get("description"));
// log.info("coords first and last coords not eqauls : name/descriion = {}/{}", nameObject, descriptionObject);
innerObject.add(firstCoords);
}
}
try {
FeatureJSON featureJSON = new FeatureJSON();
SimpleFeature simpleFeature = null;
simpleFeature = featureJSON.readFeature(feature.toJSONString());
Boolean use = Boolean.valueOf(String.valueOf(simpleFeature.getAttribute("use")));
if (use) {
String name = String.valueOf(simpleFeature.getAttribute("name"));
String description = String.valueOf(simpleFeature.getAttribute("description"));
Integer lowElev = Integer.parseInt(String.valueOf(simpleFeature.getAttribute("lowElev")));
Integer highElev = Integer.parseInt(String.valueOf(simpleFeature.getAttribute("highElev")));
Geometry geometry = (Geometry) simpleFeature.getDefaultGeometry();
// log.debug(">>> name, description, use, lowElev, highElev : {}, {}, {}, {}, {}", name, description, use, lowElev, highElev);
FeatureInfo info = new FeatureInfo(name, description, lowElev, highElev, geometry);
featureInfos.add(info);
}
} catch (IOException e) {
log.error("geometry json read error : {}", e.getMessage());
}
}
} else if ("Feature".equals(type)) {
FeatureJSON featureJSON = new FeatureJSON();
try {
SimpleFeature simpleFeature = featureJSON.readFeature(jsonObject.toJSONString());
Boolean use = Boolean.valueOf(String.valueOf(simpleFeature.getAttribute("use")));
if (use) {
String name = String.valueOf(simpleFeature.getAttribute("name"));
String description = String.valueOf(simpleFeature.getAttribute("description"));
Integer lowElev = Integer.parseInt(String.valueOf(simpleFeature.getAttribute("lowElev")));
Integer highElev = Integer.parseInt(String.valueOf(simpleFeature.getAttribute("highElev")));
Geometry geometry = (Geometry) simpleFeature.getDefaultGeometry();
FeatureInfo info = new FeatureInfo(name, description, lowElev, highElev, geometry);
featureInfos.add(info);
}
} catch (IOException e) {
log.error("geometry json read error : {}", e.getMessage());
}
} else {
GeometryJSON geoJson = new GeometryJSON();
try {
Geometry geometry = geoJson.read(jsonObject.toJSONString());
FeatureInfo info = new FeatureInfo(null, null, null, null, geometry);
} catch (IOException e) {
log.error("geometry json read error : {}", e.getMessage());
}
}
return featureInfos;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class FeatureInfo {
private String name;
private String description;
private Integer lowElev;
private Integer highElev;
private Geometry geometry;
}
public static void main(String[] args) {
AirspaceUtils airspaceUtils = AirspaceUtils.getInstance();
GeometryFactory geometryFactory = new GeometryFactory();
/*
126.6186219,37.4260888
126.7662507,37.4473521
126.7223054,37.3578964
126.6186219,37.4260888
126.6828233,37.4553499
126.7456514,37.5082038
126.7796403,37.4414491
126.6828233,37.4553499
126.6750825,37.5134229
126.7804826,37.5168269
126.7679513,37.4853679
126.6750825,37.5134229
126.7679513,37.4853679
126.8074335,37.5572547
126.9097436,37.4477632
126.7679513,37.4853679
*/
log.info("=== 김포 정상 ===");
Coordinate[] polygonCoordinates6 = new Coordinate[]{
new Coordinate(126.6186219,37.4260888),
new Coordinate(126.7662507,37.4473521),
new Coordinate(126.7223054,37.3578964),
new Coordinate(126.6186219,37.4260888)
};
LinearRing linearRing6 = geometryFactory.createLinearRing(polygonCoordinates6);
Polygon polygon6 = geometryFactory.createPolygon(linearRing6);
FeatureInfo target6 = new FeatureInfo();
target6.setHighElev(0);
target6.setLowElev(0);
target6.setGeometry(polygon6);
boolean duplicatedAirspace6 = airspaceUtils.isDuplicatedAirspace(target6);
log.info(">>> duplicatedAirspace : {}", duplicatedAirspace6);
log.info("=== 김포 120m 걸침 - 100 ===");
Coordinate[] polygonCoordinates7 = new Coordinate[]{
new Coordinate(126.6828233,37.4553499),
new Coordinate(126.7456514,37.5082038),
new Coordinate(126.7796403,37.4414491),
new Coordinate(126.6828233,37.4553499)
};
LinearRing linearRing7 = geometryFactory.createLinearRing(polygonCoordinates7);
Polygon polygon7 = geometryFactory.createPolygon(linearRing7);
FeatureInfo target7 = new FeatureInfo();
target7.setHighElev(100);
target7.setLowElev(0);
target7.setGeometry(polygon7);
boolean duplicatedAirspace7 = airspaceUtils.isDuplicatedAirspace(target7);
log.info(">>> duplicatedAirspace : {}", duplicatedAirspace7);
log.info("=== 김포 120m 걸침 - 150 ===");
Coordinate[] polygonCoordinates8 = new Coordinate[]{
new Coordinate(126.6828233,37.4553499),
new Coordinate(126.7456514,37.5082038),
new Coordinate(126.7796403,37.4414491),
new Coordinate(126.6828233,37.4553499)
};
LinearRing linearRing8 = geometryFactory.createLinearRing(polygonCoordinates8);
Polygon polygon8 = geometryFactory.createPolygon(linearRing8);
FeatureInfo target8 = new FeatureInfo();
target8.setHighElev(150);
target8.setLowElev(0);
target8.setGeometry(polygon8);
boolean duplicatedAirspace8 = airspaceUtils.isDuplicatedAirspace(target8);
log.info(">>> duplicatedAirspace : {}", duplicatedAirspace8);
log.info("=== 김포 120m 걸침 - 120 ===");
Coordinate[] polygonCoordinates9 = new Coordinate[]{
new Coordinate(126.6828233,37.4553499),
new Coordinate(126.7456514,37.5082038),
new Coordinate(126.7796403,37.4414491),
new Coordinate(126.6828233,37.4553499)
};
LinearRing linearRing9 = geometryFactory.createLinearRing(polygonCoordinates9);
Polygon polygon9 = geometryFactory.createPolygon(linearRing9);
FeatureInfo target9 = new FeatureInfo();
target9.setHighElev(120);
target9.setLowElev(0);
target9.setGeometry(polygon9);
boolean duplicatedAirspace9 = airspaceUtils.isDuplicatedAirspace(target9);
log.info(">>> duplicatedAirspace : {}", duplicatedAirspace9);
log.info("=== 김포 40m 걸침 - 20 ===");
Coordinate[] polygonCoordinates10 = new Coordinate[]{
new Coordinate(126.6750825,37.5134229),
new Coordinate(126.7804826,37.5168269),
new Coordinate(126.7679513,37.4853679),
new Coordinate(126.6750825,37.5134229)
};
LinearRing linearRing10 = geometryFactory.createLinearRing(polygonCoordinates10);
Polygon polygon10 = geometryFactory.createPolygon(linearRing10);
FeatureInfo target10 = new FeatureInfo();
target10.setHighElev(20);
target10.setLowElev(0);
target10.setGeometry(polygon10);
boolean duplicatedAirspace10 = airspaceUtils.isDuplicatedAirspace(target10);
log.info(">>> duplicatedAirspace : {}", duplicatedAirspace10);
log.info("=== 김포 40m 걸침 - 100 ===");
Coordinate[] polygonCoordinates11 = new Coordinate[]{
new Coordinate(126.6750825,37.5134229),
new Coordinate(126.7804826,37.5168269),
new Coordinate(126.7679513,37.4853679),
new Coordinate(126.6750825,37.5134229)
};
LinearRing linearRing11 = geometryFactory.createLinearRing(polygonCoordinates11);
Polygon polygon11 = geometryFactory.createPolygon(linearRing11);
FeatureInfo target11 = new FeatureInfo();
target11.setHighElev(100);
target11.setLowElev(0);
target11.setGeometry(polygon11);
boolean duplicatedAirspace11 = airspaceUtils.isDuplicatedAirspace(target11);
log.info(">>> duplicatedAirspace : {}", duplicatedAirspace11);
log.info("=== 김포 40m 걸침 - 40 ===");
Coordinate[] polygonCoordinates12 = new Coordinate[]{
new Coordinate(126.6750825,37.5134229),
new Coordinate(126.7804826,37.5168269),
new Coordinate(126.7679513,37.4853679),
new Coordinate(126.6750825,37.5134229)
};
LinearRing linearRing12 = geometryFactory.createLinearRing(polygonCoordinates12);
Polygon polygon12 = geometryFactory.createPolygon(linearRing12);
FeatureInfo target12 = new FeatureInfo();
target12.setHighElev(40);
target12.setLowElev(0);
target12.setGeometry(polygon12);
boolean duplicatedAirspace12 = airspaceUtils.isDuplicatedAirspace(target12);
log.info(">>> duplicatedAirspace : {}", duplicatedAirspace12);
log.info("=== 김포 0 ===");
Coordinate[] polygonCoordinates13 = new Coordinate[]{
new Coordinate(126.7679513,37.4853679),
new Coordinate(126.8074335,37.5572547),
new Coordinate(126.9097436,37.4477632),
new Coordinate(126.7679513,37.4853679)
};
LinearRing linearRing13 = geometryFactory.createLinearRing(polygonCoordinates13);
Polygon polygon13 = geometryFactory.createPolygon(linearRing13);
FeatureInfo target13 = new FeatureInfo();
target13.setHighElev(0);
target13.setLowElev(0);
target13.setGeometry(polygon13);
boolean duplicatedAirspace13 = airspaceUtils.isDuplicatedAirspace(target13);
log.info(">>> duplicatedAirspace : {}", duplicatedAirspace13);
// 김포
// log.info("=== 김포 걸침 ===");
// Coordinate[] polygonCoordinates = new Coordinate[]{
// new Coordinate(126.6932891, 37.4789188),
// new Coordinate(126.7343162, 37.4989414),
// new Coordinate(126.729853, 37.4676111),
// new Coordinate(126.6932891, 37.4789188)
// };
// LinearRing linearRing = geometryFactory.createLinearRing(polygonCoordinates);
// Polygon polygon = geometryFactory.createPolygon(linearRing);
// FeatureInfo target = new FeatureInfo();
// target.setHighElev(0);
// target.setLowElev(0);
// target.setGeometry(polygon);
// boolean duplicatedAirspace = airspaceUtils.isDuplicatedAirspace(target);
// log.info(">>> duplicatedAirspace : {}", duplicatedAirspace);
//
// // 인천공항
// log.info("=== 인천공항 걸침 ===");
// Coordinate[] polygonCoordinates2 = new Coordinate[]{
// new Coordinate(126.57605, 37.3278721),
// new Coordinate(126.4181215, 37.4691545),
// new Coordinate(126.6351015, 37.5203648),
// new Coordinate(126.57605, 37.3278721)
// };
// LinearRing linearRing2 = geometryFactory.createLinearRing(polygonCoordinates2);
// Polygon polygon2 = geometryFactory.createPolygon(linearRing2);
// FeatureInfo target2 = new FeatureInfo();
// target2.setHighElev(0);
// target2.setLowElev(0);
// target2.setGeometry(polygon2);
// boolean duplicatedAirspace2 = airspaceUtils.isDuplicatedAirspace(target2);
// log.info(">>> duplicatedAirspace : {}", duplicatedAirspace2);
//
//
//
// // 정상
// log.info("=== 정상(안겹침) ===");
// Coordinate[] polygonCoordinates3 = new Coordinate[]{
// new Coordinate(126.6879518, 37.4444476),
// new Coordinate(126.6179139, 37.3462549),
// new Coordinate(126.7820222, 37.3528051),
// new Coordinate(126.6879518, 37.4444476)
// };
// LinearRing linearRing3 = geometryFactory.createLinearRing(polygonCoordinates3);
// Polygon polygon3 = geometryFactory.createPolygon(linearRing3);
// FeatureInfo target3 = new FeatureInfo();
// target3.setHighElev(0);
// target3.setLowElev(0);
// target3.setGeometry(polygon3);
// boolean duplicatedAirspace3 = airspaceUtils.isDuplicatedAirspace(target3);
// log.info(">>> duplicatedAirspace : {}", duplicatedAirspace3);
//
//
// // 수원 완전 포함
// log.info("=== 수원 포함 ===");
// Coordinate[] polygonCoordinates4 = new Coordinate[]{
// new Coordinate(126.9475038,37.2212829),
// new Coordinate(127.0226914,37.2857752),
// new Coordinate(127.0525605,37.192845),
// new Coordinate(126.9475038,37.2212829)
// };
// LinearRing linearRing4 = geometryFactory.createLinearRing(polygonCoordinates4);
// Polygon polygon4 = geometryFactory.createPolygon(linearRing4);
// FeatureInfo target4 = new FeatureInfo();
// target4.setHighElev(0);
// target4.setLowElev(0);
// target4.setGeometry(polygon4);
// boolean duplicatedAirspace4 = airspaceUtils.isDuplicatedAirspace(target4);
// log.info(">>> duplicatedAirspace : {}", duplicatedAirspace4);
}
}

6
pav-server/src/main/java/com/palnet/comn/utils/AreaUtils.java

@ -6,7 +6,6 @@ import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
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;
@ -16,10 +15,11 @@ import org.locationtech.proj4j.CoordinateReferenceSystem;
import org.locationtech.proj4j.ProjCoordinate;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
import java.io.*;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

14781
pav-server/src/main/resources/air/airgeo.json

File diff suppressed because it is too large Load Diff

25326
pav-server/src/main/resources/air/elev2d/airgeo-elev.json

File diff suppressed because it is too large Load Diff

5891
pav-server/src/main/resources/air/elev2d/gimpo-airport-2d-elev.json

File diff suppressed because it is too large Load Diff

5
pav-server/src/main/resources/air/sample/airgeo-3d.json

@ -0,0 +1,5 @@
{
"type": "FeatureCollection",
"features": [
]
}

1820
pav-server/src/main/resources/air/sample/airgeo-gimpo-airport.json

File diff suppressed because it is too large Load Diff

14786
pav-server/src/main/resources/air/sample/gimpo-airport-2d-square.json

File diff suppressed because it is too large Load Diff

5
pav-server/src/main/resources/air/sample/gimpo-airport-3d.json

@ -0,0 +1,5 @@
{
"type": "FeatureCollection",
"features": [
]
}
Loading…
Cancel
Save