diff --git a/src/main/java/com/kamco/cd/kamcoback/changedetection/ChangeDetectionApiController.java b/src/main/java/com/kamco/cd/kamcoback/changedetection/ChangeDetectionApiController.java index 72cb5e24..4b816ea4 100644 --- a/src/main/java/com/kamco/cd/kamcoback/changedetection/ChangeDetectionApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/changedetection/ChangeDetectionApiController.java @@ -11,7 +11,10 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.transaction.Transactional; import java.util.List; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; @Tag(name = "변화탐지", description = "변화탐지 API") @RequiredArgsConstructor @@ -43,7 +46,7 @@ public class ChangeDetectionApiController { @Operation(summary = "변화탐지 분류별 건수", description = "변화탐지 분류별 건수") @GetMapping("/class-count") public ApiResponseDto> getChangeDetectionClassCount( - @Parameter(description = "변화탐지 년도(차수) /year-list 의 analUid", example = "1") @RequestParam + @Parameter(description = "변화탐지 년도(차수) /year-list 의 analUid", example = "53") @RequestParam Long id, @Parameter(description = "탐지된 도엽번호", example = "34602060") @RequestParam String mapSheetNum) { return ApiResponseDto.ok(changeDetectionService.getChangeDetectionClassCount(id, mapSheetNum)); @@ -54,7 +57,7 @@ public class ChangeDetectionApiController { public ApiResponseDto getChangeDetectionCogUrl( @Parameter(description = "이전 년도", example = "2023") @RequestParam Integer beforeYear, @Parameter(description = "이후 년도", example = "2024") @RequestParam Integer afterYear, - @Parameter(description = "도엽번호(5k)", example = "36809010") @RequestParam String mapSheetNum) { + @Parameter(description = "도엽번호(5k)", example = "35905086") @RequestParam String mapSheetNum) { ChangeDetectionDto.CogUrlReq req = new ChangeDetectionDto.CogUrlReq(beforeYear, afterYear, mapSheetNum); return ApiResponseDto.ok(changeDetectionService.getChangeDetectionCogUrl(req)); @@ -69,15 +72,15 @@ public class ChangeDetectionApiController { @Operation(summary = "변화탐지 탐지된 도엽 목록", description = "변화탐지 탐지된 도엽 목록") @GetMapping("/map-list") public ApiResponseDto> getChangeDetectionMapSheetList( - @Parameter(description = "년도목록 id", example = "1") @RequestParam Long analUid) { + @Parameter(description = "도엽목록 그룹id", example = "1") @RequestParam Long analUid) { return ApiResponseDto.ok(changeDetectionService.getChangeDetectionMapSheetList(analUid)); } @Operation(summary = "변화탐지 결과 Polygon", description = "변화탐지 결과 Polygon") @GetMapping("/polygon") public ApiResponseDto getChangeDetectionPolygonList( - @Parameter(description = "년도목록 id", example = "1") @RequestParam Long analUid, - @Parameter(description = "도엽번호", example = "34602060") @RequestParam String mapSheetNum) { + @Parameter(description = "년도목록 id", example = "53") @RequestParam Long analUid, + @Parameter(description = "도엽번호", example = "35905086") @RequestParam String mapSheetNum) { return ApiResponseDto.ok( changeDetectionService.getChangeDetectionPolygonList(analUid, mapSheetNum)); } @@ -85,8 +88,8 @@ public class ChangeDetectionApiController { @Operation(summary = "변화탐지 결과 Point", description = "변화탐지 결과 Point") @GetMapping("/point") public ApiResponseDto getChangeDetectionPointList( - @Parameter(description = "년도목록 id", example = "1") @RequestParam Long analUid, - @Parameter(description = "도엽번호", example = "34602060") @RequestParam String mapSheetNum) { + @Parameter(description = "년도목록 id", example = "53") @RequestParam Long analUid, + @Parameter(description = "도엽번호", example = "35905086") @RequestParam String mapSheetNum) { return ApiResponseDto.ok( changeDetectionService.getChangeDetectionPointList(analUid, mapSheetNum)); } diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java b/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java index 58a0aa3e..610fd364 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java @@ -75,7 +75,7 @@ public class InferenceResultApiController { }) @GetMapping("/summary/{id}") public ApiResponseDto getInferenceResultSummary( - @Parameter(description = "목록 id", example = "1") @PathVariable Long id) { + @Parameter(description = "목록 id", example = "53") @PathVariable Long id) { return ApiResponseDto.ok(inferenceResultService.getInferenceResultSummary(id)); } @@ -94,7 +94,7 @@ public class InferenceResultApiController { }) @GetMapping("/detail/{id}") public ApiResponseDto getInferenceDetail( - @Parameter(description = "목록 id", example = "1") @PathVariable Long id) { + @Parameter(description = "목록 id", example = "53") @PathVariable Long id) { return ApiResponseDto.ok(inferenceResultService.getDetail(id)); } @@ -113,7 +113,7 @@ public class InferenceResultApiController { }) @GetMapping("/geom/{id}") public ApiResponseDto> getInferenceResultGeomList( - @Parameter(description = "분석결과 id", example = "1") @PathVariable Long id, + @Parameter(description = "분석결과 id", example = "53") @PathVariable Long id, @Parameter(description = "기준년도 분류", example = "land") @RequestParam(required = false) String targetClass, @Parameter(description = "비교년도 분류", example = "waste") @RequestParam(required = false) diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java b/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java index ed45f97a..7f6300ea 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java @@ -2,6 +2,9 @@ package com.kamco.cd.kamcoback.inference.dto; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import com.kamco.cd.kamcoback.common.enums.DetectionClassification; import com.kamco.cd.kamcoback.common.utils.interfaces.JsonFormatDttm; import io.swagger.v3.oas.annotations.media.Schema; @@ -12,7 +15,6 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import org.locationtech.jts.geom.Geometry; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; @@ -58,7 +60,6 @@ public class InferenceResultDto { private Long id; private String analTitle; - private String analMapSheet; private Long detectingCnt; @JsonFormatDttm private ZonedDateTime analStrtDttm; @JsonFormatDttm private ZonedDateTime analEndDttm; @@ -71,7 +72,6 @@ public class InferenceResultDto { public AnalResList( Long id, String analTitle, - String analMapSheet, Long detectingCnt, ZonedDateTime analStrtDttm, ZonedDateTime analEndDttm, @@ -82,7 +82,6 @@ public class InferenceResultDto { String gukyuinUsed) { this.id = id; this.analTitle = analTitle; - this.analMapSheet = analMapSheet; this.detectingCnt = detectingCnt; this.analStrtDttm = analStrtDttm; this.analEndDttm = analEndDttm; @@ -103,7 +102,6 @@ public class InferenceResultDto { private String modelInfo; private Integer targetYyyy; private Integer compareYyyy; - private String analMapSheet; @JsonFormatDttm private ZonedDateTime analStrtDttm; @JsonFormatDttm private ZonedDateTime analEndDttm; private Long analSec; @@ -120,7 +118,6 @@ public class InferenceResultDto { String modelInfo, Integer targetYyyy, Integer compareYyyy, - String analMapSheet, ZonedDateTime analStrtDttm, ZonedDateTime analEndDttm, Long analSec, @@ -135,7 +132,6 @@ public class InferenceResultDto { this.modelInfo = modelInfo; this.targetYyyy = targetYyyy; this.compareYyyy = compareYyyy; - this.analMapSheet = analMapSheet; this.analStrtDttm = analStrtDttm; this.analEndDttm = analEndDttm; this.analSec = analSec; @@ -304,8 +300,10 @@ public class InferenceResultDto { String classAfterName; Double classAfterProb; Long mapSheetNum; - Geometry gemo; - Geometry geomCenter; + @JsonIgnore String gemoStr; + @JsonIgnore String geomCenterStr; + JsonNode gemo; + JsonNode geomCenter; public Geom( Integer compareYyyy, @@ -315,8 +313,8 @@ public class InferenceResultDto { String classAfterCd, Double classAfterProb, Long mapSheetNum, - Geometry gemo, - Geometry geomCenter) { + String gemoStr, + String geomCenterStr) { this.compareYyyy = compareYyyy; this.targetYyyy = targetYyyy; this.classBeforeCd = classBeforeCd; @@ -326,8 +324,20 @@ public class InferenceResultDto { this.classAfterName = DetectionClassification.fromString(classAfterCd).getDesc(); this.classAfterProb = classAfterProb; this.mapSheetNum = mapSheetNum; - this.gemo = gemo; - this.geomCenter = geomCenter; + this.gemoStr = gemoStr; + this.geomCenterStr = geomCenterStr; + + ObjectMapper mapper = new ObjectMapper(); + JsonNode geomJson; + JsonNode geomCenterJson; + try { + geomJson = mapper.readTree(gemoStr); + geomCenterJson = mapper.readTree(geomCenterStr); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + this.gemo = geomJson; + this.geomCenter = geomCenterJson; } } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/InferenceResultRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/InferenceResultRepositoryImpl.java index 2ea1a66a..559243f2 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/InferenceResultRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/InferenceResultRepositoryImpl.java @@ -142,6 +142,7 @@ public class InferenceResultRepositoryImpl implements InferenceResultRepositoryC class_after_cd, class_after_prob, geom, + geom_center, area, data_uid, file_created_yn, @@ -160,6 +161,7 @@ public class InferenceResultRepositoryImpl implements InferenceResultRepositoryC x.class_after_cd, x.class_after_prob, x.geom, + ST_Centroid(x.geom), x.area, x.data_uid, false, diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetAnalDataInferenceRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetAnalDataInferenceRepositoryImpl.java index abb351ef..0e465402 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetAnalDataInferenceRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetAnalDataInferenceRepositoryImpl.java @@ -1,5 +1,7 @@ package com.kamco.cd.kamcoback.postgres.repository.Inference; +import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalInferenceEntity.mapSheetAnalInferenceEntity; + import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.AnalResList; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.AnalResSummary; @@ -9,7 +11,6 @@ import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalDataInferenceEntity; import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalDataInferenceGeomEntity; import com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalDataInferenceEntity; import com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalDataInferenceGeomEntity; -import com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalInferenceEntity; import com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalSttcEntity; import com.kamco.cd.kamcoback.postgres.entity.QModelMngBakEntity; import com.kamco.cd.kamcoback.postgres.entity.QModelVerEntity; @@ -41,8 +42,8 @@ public class MapSheetAnalDataInferenceRepositoryImpl private final JPAQueryFactory queryFactory; private final QModelMngBakEntity tmm = QModelMngBakEntity.modelMngBakEntity; private final QModelVerEntity tmv = QModelVerEntity.modelVerEntity; - private final QMapSheetAnalInferenceEntity mapSheetAnalEntity = - QMapSheetAnalInferenceEntity.mapSheetAnalInferenceEntity; + // private final QMapSheetAnalEntity mapSheetAnalEntity = + // mapSheetAnalEntity; private final QMapSheetAnalDataInferenceEntity MapSheetAnalDataInferenceEntity = QMapSheetAnalDataInferenceEntity.mapSheetAnalDataInferenceEntity; private final QMapSheetAnalDataInferenceGeomEntity MapSheetAnalDataInferenceGeomEntity = @@ -62,12 +63,12 @@ public class MapSheetAnalDataInferenceRepositoryImpl // "0000" 전체조회 BooleanBuilder builder = new BooleanBuilder(); if (searchReq.getStatCode() != null && !"0000".equals(searchReq.getStatCode())) { - builder.and(mapSheetAnalEntity.analState.eq(searchReq.getStatCode())); + builder.and(mapSheetAnalInferenceEntity.analState.eq(searchReq.getStatCode())); } // 제목 if (searchReq.getTitle() != null) { - builder.and(mapSheetAnalEntity.analTitle.like("%" + searchReq.getTitle() + "%")); + builder.and(mapSheetAnalInferenceEntity.analTitle.like("%" + searchReq.getTitle() + "%")); } List content = @@ -75,28 +76,28 @@ public class MapSheetAnalDataInferenceRepositoryImpl .select( Projections.constructor( InferenceResultDto.AnalResList.class, - mapSheetAnalEntity.id, - mapSheetAnalEntity.analTitle, - mapSheetAnalEntity.detectingCnt, - mapSheetAnalEntity.analStrtDttm, - mapSheetAnalEntity.analEndDttm, - mapSheetAnalEntity.analSec, - mapSheetAnalEntity.analPredSec, - mapSheetAnalEntity.analState, + mapSheetAnalInferenceEntity.id, + mapSheetAnalInferenceEntity.analTitle, + mapSheetAnalInferenceEntity.detectingCnt, + mapSheetAnalInferenceEntity.analStrtDttm, + mapSheetAnalInferenceEntity.analEndDttm, + mapSheetAnalInferenceEntity.analSec, + mapSheetAnalInferenceEntity.analPredSec, + mapSheetAnalInferenceEntity.analState, Expressions.stringTemplate( - "fn_code_name({0}, {1})", "0002", mapSheetAnalEntity.analState), - mapSheetAnalEntity.gukyuinUsed)) - .from(mapSheetAnalEntity) + "fn_code_name({0}, {1})", "0002", mapSheetAnalInferenceEntity.analState), + mapSheetAnalInferenceEntity.gukyuinUsed)) + .from(mapSheetAnalInferenceEntity) .where(builder) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) - .orderBy(mapSheetAnalEntity.id.desc()) + .orderBy(mapSheetAnalInferenceEntity.id.desc()) .fetch(); long total = queryFactory - .select(mapSheetAnalEntity.id) - .from(mapSheetAnalEntity) + .select(mapSheetAnalInferenceEntity.id) + .from(mapSheetAnalInferenceEntity) .where(builder) .fetchCount(); @@ -122,27 +123,28 @@ public class MapSheetAnalDataInferenceRepositoryImpl .select( Projections.constructor( InferenceResultDto.AnalResSummary.class, - mapSheetAnalEntity.id, - mapSheetAnalEntity.analTitle, + mapSheetAnalInferenceEntity.id, + mapSheetAnalInferenceEntity.analTitle, tmm.modelNm.concat(" ").concat(tmv.modelVer).as("modelInfo"), - mapSheetAnalEntity.targetYyyy, - mapSheetAnalEntity.compareYyyy, - mapSheetAnalEntity.analStrtDttm, - mapSheetAnalEntity.analEndDttm, - mapSheetAnalEntity.analSec, - mapSheetAnalEntity.analPredSec, - mapSheetAnalEntity.resultUrl, - mapSheetAnalEntity.detectingCnt, - mapSheetAnalEntity.accuracy, - mapSheetAnalEntity.analState, + mapSheetAnalInferenceEntity.targetYyyy, + mapSheetAnalInferenceEntity.compareYyyy, + mapSheetAnalInferenceEntity.analStrtDttm, + mapSheetAnalInferenceEntity.analEndDttm, + mapSheetAnalInferenceEntity.analSec, + mapSheetAnalInferenceEntity.analPredSec, + mapSheetAnalInferenceEntity.resultUrl, + mapSheetAnalInferenceEntity.detectingCnt, + mapSheetAnalInferenceEntity.accuracy, + mapSheetAnalInferenceEntity.analState, Expressions.stringTemplate( - "fn_code_name({0}, {1})", "0002", mapSheetAnalEntity.analState))) - .from(mapSheetAnalEntity) + "fn_code_name({0}, {1})", + "0002", mapSheetAnalInferenceEntity.analState))) + .from(mapSheetAnalInferenceEntity) .leftJoin(tmm) - .on(mapSheetAnalEntity.modelUid.eq(tmm.id)) + .on(mapSheetAnalInferenceEntity.modelUid.eq(tmm.id)) .leftJoin(tmv) .on(tmv.modelUid.eq(tmm.id).and(tmv.id.eq(latestVerUidSub))) - .where(mapSheetAnalEntity.id.eq(id)) + .where(mapSheetAnalInferenceEntity.id.eq(id)) .fetchOne()); return content; } @@ -231,7 +233,7 @@ public class MapSheetAnalDataInferenceRepositoryImpl BooleanBuilder builder = new BooleanBuilder(); // 추론결과 id - builder.and(mapSheetAnalEntity.id.eq(id)); + builder.and(mapSheetAnalInferenceEntity.id.eq(id)); // 기준년도 분류 if (searchGeoReq.getTargetClass() != null && !searchGeoReq.getTargetClass().equals("")) { @@ -267,11 +269,16 @@ public class MapSheetAnalDataInferenceRepositoryImpl MapSheetAnalDataInferenceGeomEntity.classAfterCd, MapSheetAnalDataInferenceGeomEntity.classAfterProb, MapSheetAnalDataInferenceGeomEntity.mapSheetNum, - MapSheetAnalDataInferenceGeomEntity.geom, - MapSheetAnalDataInferenceGeomEntity.geomCenter)) - .from(mapSheetAnalEntity) + Expressions.stringTemplate( + "ST_AsGeoJSON({0})", MapSheetAnalDataInferenceGeomEntity.geom), + Expressions.stringTemplate( + "ST_AsGeoJSON({0})", MapSheetAnalDataInferenceGeomEntity.geomCenter) + // MapSheetAnalDataInferenceGeomEntity.geom, + // MapSheetAnalDataInferenceGeomEntity.geomCenter) + )) + .from(mapSheetAnalInferenceEntity) .join(MapSheetAnalDataInferenceEntity) - .on(MapSheetAnalDataInferenceEntity.analUid.eq(mapSheetAnalEntity.id)) + .on(MapSheetAnalDataInferenceEntity.analUid.eq(mapSheetAnalInferenceEntity.id)) .join(MapSheetAnalDataInferenceGeomEntity) .on(MapSheetAnalDataInferenceGeomEntity.dataUid.eq(MapSheetAnalDataInferenceEntity.id)) .where(builder) @@ -282,9 +289,9 @@ public class MapSheetAnalDataInferenceRepositoryImpl long total = queryFactory .select(MapSheetAnalDataInferenceGeomEntity.geoUid) - .from(mapSheetAnalEntity) + .from(mapSheetAnalInferenceEntity) .join(MapSheetAnalDataInferenceEntity) - .on(MapSheetAnalDataInferenceEntity.analUid.eq(mapSheetAnalEntity.id)) + .on(MapSheetAnalDataInferenceEntity.analUid.eq(mapSheetAnalInferenceEntity.id)) .join(MapSheetAnalDataInferenceGeomEntity) .on(MapSheetAnalDataInferenceGeomEntity.dataUid.eq(MapSheetAnalDataInferenceEntity.id)) .where(builder) @@ -303,10 +310,10 @@ public class MapSheetAnalDataInferenceRepositoryImpl public List getSheets(Long id) { return queryFactory .select(MapSheetAnalDataInferenceEntity.mapSheetNum) - .from(mapSheetAnalEntity) + .from(mapSheetAnalInferenceEntity) .join(MapSheetAnalDataInferenceEntity) - .on(MapSheetAnalDataInferenceEntity.analUid.eq(mapSheetAnalEntity.id)) - .where(mapSheetAnalEntity.id.eq(id)) + .on(MapSheetAnalDataInferenceEntity.analUid.eq(mapSheetAnalInferenceEntity.id)) + .where(mapSheetAnalInferenceEntity.id.eq(id)) .groupBy(MapSheetAnalDataInferenceEntity.mapSheetNum) .fetch(); } diff --git a/src/main/resources/db/migration/dump-kamco_cds-202601071520.tar.gz b/src/main/resources/db/migration/dump-kamco_cds-202601071520.tar.gz new file mode 100644 index 00000000..ccd78273 Binary files /dev/null and b/src/main/resources/db/migration/dump-kamco_cds-202601071520.tar.gz differ