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 f4b756cf..53b4db2b 100644 --- a/src/main/java/com/kamco/cd/kamcoback/changedetection/ChangeDetectionApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/changedetection/ChangeDetectionApiController.java @@ -117,16 +117,18 @@ public class ChangeDetectionApiController { @Parameter(description = "도곽/일반(MAPSHEET/ADDRESS) 검색 타입", required = true) @RequestParam(defaultValue = "MAPSHEET") DetectSearchType type, - @Parameter(description = "5k/50k 구분(SCALE_5K/SCALE_50K))", required = true) - @RequestParam(defaultValue = "SCALE_50K") + @Parameter(description = "5k/50k 구분(SCALE_5K/SCALE_50K))") + @RequestParam(defaultValue = "SCALE_50K", required = false) MapScaleType scale, @Parameter( description = "변화탐지 년도(차수) /year-list 의 uuid", example = "8584e8d4-53b3-4582-bde2-28a81495a626") UUID uuid, - @Parameter(description = "도엽번호", example = "34607") @RequestParam String mapSheetNum) { + @Parameter(description = "도엽번호", example = "34607") @RequestParam(required = false) + String mapSheetNum, + @Parameter(description = "pnu") @RequestParam(required = false) String pnu) { return ApiResponseDto.ok( - changeDetectionService.getChangeDetectionPolygonList(type, scale, uuid, mapSheetNum)); + changeDetectionService.getChangeDetectionPolygonList(type, scale, uuid, mapSheetNum, pnu)); } @Operation(summary = "변화탐지 결과 Point", description = "변화탐지 결과 Point") @@ -135,16 +137,18 @@ public class ChangeDetectionApiController { @Parameter(description = "도곽/일반(MAPSHEET/ADDRESS) 검색 타입", required = true) @RequestParam(defaultValue = "MAPSHEET") DetectSearchType type, - @Parameter(description = "5k/50k 구분(SCALE_5K/SCALE_50K))", required = true) - @RequestParam(defaultValue = "SCALE_50K") + @Parameter(description = "5k/50k 구분(SCALE_5K/SCALE_50K))") + @RequestParam(defaultValue = "SCALE_50K", required = false) MapScaleType scale, @Parameter( description = "변화탐지 년도(차수) /year-list 의 uuid", example = "8584e8d4-53b3-4582-bde2-28a81495a626") UUID uuid, - @Parameter(description = "도엽번호", example = "34607") @RequestParam String mapSheetNum) { + @Parameter(description = "도엽번호", example = "34607") @RequestParam(required = false) + String mapSheetNum, + @Parameter(description = "pnu") @RequestParam(required = false) String pnu) { return ApiResponseDto.ok( - changeDetectionService.getChangeDetectionPointList(type, scale, uuid, mapSheetNum)); + changeDetectionService.getChangeDetectionPointList(type, scale, uuid, mapSheetNum, pnu)); } @Operation(summary = "선택 변화탐지 결과 uuid 조회", description = "선택 변화탐지 결과 uuid 조회") diff --git a/src/main/java/com/kamco/cd/kamcoback/changedetection/service/ChangeDetectionService.java b/src/main/java/com/kamco/cd/kamcoback/changedetection/service/ChangeDetectionService.java index 1f168378..45e932c1 100644 --- a/src/main/java/com/kamco/cd/kamcoback/changedetection/service/ChangeDetectionService.java +++ b/src/main/java/com/kamco/cd/kamcoback/changedetection/service/ChangeDetectionService.java @@ -46,13 +46,13 @@ public class ChangeDetectionService { } public ChangeDetectionDto.PolygonFeatureList getChangeDetectionPolygonList( - DetectSearchType type, MapScaleType scale, UUID uuid, String mapSheetNum) { + DetectSearchType type, MapScaleType scale, UUID uuid, String mapSheetNum, String pnu) { switch (type) { case MAPSHEET -> { return changeDetectionCoreService.getChangeDetectionPolygonList(scale, uuid, mapSheetNum); } case ADDRESS -> { - return new ChangeDetectionDto.PolygonFeatureList(); // TODO: 일반 주소 검색 로직 확인 후 작업 필요 + return changeDetectionCoreService.getChangeDetectionPnuPolygonList(uuid, pnu); } default -> throw new IllegalArgumentException("Unsupported type: " + type); } @@ -60,14 +60,14 @@ public class ChangeDetectionService { // Geometry 객체 순환 참조 문제로 캐싱 불가 public ChangeDetectionDto.PointFeatureList getChangeDetectionPointList( - DetectSearchType type, MapScaleType scale, UUID uuid, String mapSheetNum) { + DetectSearchType type, MapScaleType scale, UUID uuid, String mapSheetNum, String pnu) { switch (type) { case MAPSHEET -> { return changeDetectionCoreService.getChangeDetectionPointList(scale, uuid, mapSheetNum); } case ADDRESS -> { - return new ChangeDetectionDto.PointFeatureList(); // TODO: 일반 주소 검색 로직 확인 후 작업 필요 + return changeDetectionCoreService.getChangeDetectionPnuPointList(uuid, pnu); } default -> throw new IllegalArgumentException("Unsupported type: " + type); } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/ChangeDetectionCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/ChangeDetectionCoreService.java index c67c1af9..f2278ef5 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/core/ChangeDetectionCoreService.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/ChangeDetectionCoreService.java @@ -6,6 +6,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.kamco.cd.kamcoback.changedetection.dto.ChangeDetectionDto; import com.kamco.cd.kamcoback.changedetection.dto.ChangeDetectionDto.MapScaleType; import com.kamco.cd.kamcoback.changedetection.dto.ChangeDetectionDto.MapSheetList; +import com.kamco.cd.kamcoback.changedetection.dto.ChangeDetectionDto.PointFeatureList; +import com.kamco.cd.kamcoback.changedetection.dto.ChangeDetectionDto.PolygonFeatureList; import com.kamco.cd.kamcoback.common.enums.DetectionClassification; import com.kamco.cd.kamcoback.common.exception.CustomApiException; import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalDataInferenceGeomEntity; @@ -136,4 +138,12 @@ public class ChangeDetectionCoreService { .getLearnUuid(chnDtctId) .orElseThrow(() -> new CustomApiException("NOT_FOUND_DATA", HttpStatus.NOT_FOUND)); } + + public PolygonFeatureList getChangeDetectionPnuPolygonList(UUID uuid, String pnu) { + return changeDetectionRepository.getChangeDetectionPnuPolygonList(uuid, pnu); + } + + public PointFeatureList getChangeDetectionPnuPointList(UUID uuid, String pnu) { + return changeDetectionRepository.getChangeDetectionPnuPointList(uuid, pnu); + } } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryCustom.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryCustom.java index 7190ebf9..401527ec 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryCustom.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryCustom.java @@ -3,6 +3,8 @@ package com.kamco.cd.kamcoback.postgres.repository.changedetection; import com.kamco.cd.kamcoback.changedetection.dto.ChangeDetectionDto; import com.kamco.cd.kamcoback.changedetection.dto.ChangeDetectionDto.MapScaleType; import com.kamco.cd.kamcoback.changedetection.dto.ChangeDetectionDto.MapSheetList; +import com.kamco.cd.kamcoback.changedetection.dto.ChangeDetectionDto.PointFeatureList; +import com.kamco.cd.kamcoback.changedetection.dto.ChangeDetectionDto.PolygonFeatureList; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -43,4 +45,8 @@ public interface ChangeDetectionRepositoryCustom { String chnDtctId, String pnu); Optional getLearnUuid(String chnDtctId); + + PolygonFeatureList getChangeDetectionPnuPolygonList(UUID uuid, String pnu); + + PointFeatureList getChangeDetectionPnuPointList(UUID uuid, String pnu); } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryImpl.java index ad9e1720..761001fe 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryImpl.java @@ -700,4 +700,120 @@ public class ChangeDetectionRepositoryImpl extends QuerydslRepositorySupport .where(mapSheetLearnEntity.uid.eq(chnDtctId)) .fetchOne()); } + + @Override + public PolygonFeatureList getChangeDetectionPnuPolygonList(UUID uuid, String pnu) { + List list = + queryFactory + .select( + Projections.constructor( + ChangeDetectionDto.PolygonQueryData.class, + Expressions.stringTemplate("{0}", "Feature"), + Expressions.stringTemplate( + "ST_AsGeoJSON({0})", mapSheetAnalDataInferenceGeomEntity.geom), + mapSheetAnalDataInferenceGeomEntity.geoUid, + mapSheetAnalDataInferenceGeomEntity.area, + mapSheetAnalDataInferenceGeomEntity.compareYyyy, + mapSheetAnalDataInferenceGeomEntity.classBeforeProb, + mapSheetAnalDataInferenceGeomEntity.classBeforeCd.toUpperCase(), + mapSheetAnalDataInferenceGeomEntity.targetYyyy, + mapSheetAnalDataInferenceGeomEntity.classAfterProb, + mapSheetAnalDataInferenceGeomEntity.classAfterCd.toUpperCase(), + mapSheetAnalDataInferenceGeomEntity.cdProb, + mapSheetAnalDataInferenceGeomEntity.uuid, + mapSheetAnalDataInferenceGeomEntity.resultUid)) + .from(mapSheetAnalDataInferenceGeomEntity) + .innerJoin(mapSheetAnalDataInferenceEntity) + .on(mapSheetAnalDataInferenceGeomEntity.dataUid.eq(mapSheetAnalDataInferenceEntity.id)) + .innerJoin(mapSheetAnalInferenceEntity) + .on(mapSheetAnalInferenceEntity.id.eq(mapSheetAnalDataInferenceEntity.analUid)) + .innerJoin(pnuEntity) + .on(mapSheetAnalDataInferenceGeomEntity.geoUid.eq(pnuEntity.geo.geoUid)) + .where(mapSheetAnalInferenceEntity.uuid.eq(uuid), pnuEntity.pnu.eq(pnu)) + .orderBy(mapSheetAnalDataInferenceGeomEntity.mapSheetNum.asc()) + .fetch(); + + ObjectMapper mapper = new ObjectMapper(); + List result = + list.stream() + .map( + data -> { + String geoJson = data.getGeometry(); + JsonNode jsonNode; + try { + jsonNode = mapper.readTree(geoJson); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + ChangeDetectionDto.PolygonProperties properties = + new ChangeDetectionDto.PolygonProperties( + data.getGeoUid(), + data.getArea(), + data.getBeforeYear(), + data.getBeforeConfidence(), + data.getBeforeClass(), + data.getAfterYear(), + data.getAfterConfidence(), + data.getAfterClass(), + data.getCdProb(), + data.getUuid(), + data.getResultUid()); + + return new ChangeDetectionDto.PolygonFeature( + data.getType(), jsonNode, properties); + }) + .collect(Collectors.toList()); + + ChangeDetectionDto.PolygonFeatureList polygonList = new ChangeDetectionDto.PolygonFeatureList(); + polygonList.setType("FeatureCollection"); + polygonList.setFeatures(result); + return polygonList; + } + + @Override + public PointFeatureList getChangeDetectionPnuPointList(UUID uuid, String pnu) { + List list = + queryFactory + .select( + Projections.constructor( + ChangeDetectionDto.PointQueryData.class, + Expressions.stringTemplate("{0}", "Feature"), + Expressions.stringTemplate( + "ST_AsGeoJSON({0})", + mapSheetAnalDataInferenceGeomEntity.geomCenter), // point + Projections.constructor( + ChangeDetectionDto.PointProperties.class, + mapSheetAnalDataInferenceGeomEntity.geoUid, + mapSheetAnalDataInferenceGeomEntity.classAfterCd.toUpperCase()))) + .from(mapSheetAnalDataInferenceGeomEntity) + .innerJoin(mapSheetAnalDataInferenceEntity) + .on(mapSheetAnalDataInferenceGeomEntity.dataUid.eq(mapSheetAnalDataInferenceEntity.id)) + .innerJoin(mapSheetAnalInferenceEntity) + .on(mapSheetAnalInferenceEntity.id.eq(mapSheetAnalDataInferenceEntity.analUid)) + .innerJoin(pnuEntity) + .on(mapSheetAnalDataInferenceGeomEntity.geoUid.eq(pnuEntity.geo.geoUid)) + .where(mapSheetAnalInferenceEntity.uuid.eq(uuid), pnuEntity.pnu.eq(pnu)) + .fetch(); + + ObjectMapper mapper = new ObjectMapper(); + List result = + list.stream() + .map( + data -> { + String geoJson = data.getGeometry(); + JsonNode jsonNode; + try { + jsonNode = mapper.readTree(geoJson); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + return new ChangeDetectionDto.PointFeature( + data.getType(), jsonNode, data.getProperties()); + }) + .collect(Collectors.toList()); + + return new ChangeDetectionDto.PointFeatureList("FeatureCollection", result); + } }