From 51cffccf4c0c3f1fb5eeb50fa31283817eb60d8b Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Wed, 10 Dec 2025 17:09:43 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B3=80=ED=99=94=ED=83=90=EC=A7=80=20point,?= =?UTF-8?q?=20cogUrl=20API=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/ChangeDetectionDto.java | 28 ++++++- .../ChangeDetectionRepositoryImpl.java | 78 +++++++++++++------ 2 files changed, 82 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/changedetection/dto/ChangeDetectionDto.java b/src/main/java/com/kamco/cd/kamcoback/changedetection/dto/ChangeDetectionDto.java index e045186e..8f546763 100644 --- a/src/main/java/com/kamco/cd/kamcoback/changedetection/dto/ChangeDetectionDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/changedetection/dto/ChangeDetectionDto.java @@ -57,7 +57,19 @@ public class ChangeDetectionDto { private String beforeCogUrl; private String afterCogUrl; - private Geometry bbox; + private JsonNode bbox; + } + + @Schema(name = "CogUrlDto", description = "COG Url 정보") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class CogUrlData { + + private String beforeCogUrl; + private String afterCogUrl; + private String bbox; } @Schema(name = "AnalYearList", description = "년도(차수) 목록") @@ -140,6 +152,18 @@ public class ChangeDetectionDto { private Double cdProb; // 탐지정확도 } + @Schema(name = "PointFeature", description = "Geometry 리턴 객체") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class PointQueryData { + + private String type; + private String geometry; // point + private PointProperties properties; // Point 정보 + } + @Schema(name = "PointFeature", description = "Geometry 리턴 객체") @Getter @Setter @@ -148,7 +172,7 @@ public class ChangeDetectionDto { public static class PointFeature { private String type; - private Geometry geometry; // point + private JsonNode geometry; // point private PointProperties properties; // Point 정보 } 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 cf700729..a3ba077c 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 @@ -19,6 +19,7 @@ import com.querydsl.core.types.dsl.Expressions; import com.querydsl.core.types.dsl.StringExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; @@ -71,24 +72,38 @@ public class ChangeDetectionRepositoryImpl extends QuerydslRepositorySupport @Override public ChangeDetectionDto.CogUrlDto getChangeDetectionCogUrl(ChangeDetectionDto.CogUrlReq req) { - return queryFactory - .select( - Projections.constructor( - ChangeDetectionDto.CogUrlDto.class, - makeCogUrl(req.getBeforeYear()).max().as("beforeCogUrl"), - makeCogUrl(req.getAfterYear()).max().as("afterCogUrl"), - mapInkx5kEntity.geom.as("bbox"))) - .from(imageryEntity) - .innerJoin(mapInkx5kEntity) - .on(imageryEntity.scene5k.eq(mapInkx5kEntity.mapidcdNo)) - .where( - imageryEntity - .year - .eq(req.getBeforeYear()) - .or(imageryEntity.year.eq(req.getAfterYear())), - imageryEntity.scene5k.eq(req.getMapSheetNum())) - .groupBy(mapInkx5kEntity.geom) - .fetchOne(); + ChangeDetectionDto.CogUrlData data = + queryFactory + .select( + Projections.constructor( + ChangeDetectionDto.CogUrlData.class, + makeCogUrl(req.getBeforeYear()).max().as("beforeCogUrl"), + makeCogUrl(req.getAfterYear()).max().as("afterCogUrl"), + Expressions.stringTemplate("ST_AsGeoJSON({0})", mapInkx5kEntity.geom) + .as("bbox"))) + .from(imageryEntity) + .innerJoin(mapInkx5kEntity) + .on(imageryEntity.scene5k.eq(mapInkx5kEntity.mapidcdNo)) + .where( + imageryEntity + .year + .eq(req.getBeforeYear()) + .or(imageryEntity.year.eq(req.getAfterYear())), + imageryEntity.scene5k.eq(req.getMapSheetNum())) + .groupBy(mapInkx5kEntity.geom) + .fetchOne(); + + ObjectMapper mapper = new ObjectMapper(); + String geoJson = Objects.requireNonNull(data).getBbox(); + JsonNode jsonNode; + try { + jsonNode = mapper.readTree(geoJson); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + return new ChangeDetectionDto.CogUrlDto( + data.getBeforeCogUrl(), data.getAfterCogUrl(), jsonNode); } @Override @@ -177,13 +192,14 @@ public class ChangeDetectionRepositoryImpl extends QuerydslRepositorySupport @Override public ChangeDetectionDto.PointFeatureList getChangeDetectionPointList( Long analUid, String mapSheetNum) { - List list = + List list = queryFactory .select( Projections.constructor( - ChangeDetectionDto.PointFeature.class, + ChangeDetectionDto.PointQueryData.class, Expressions.stringTemplate("{0}", "Feature"), - mapSheetAnalDataGeomEntity.geomCenter, // point + Expressions.stringTemplate( + "ST_AsGeoJSON({0})", mapSheetAnalDataGeomEntity.geomCenter), // point Projections.constructor( ChangeDetectionDto.PointProperties.class, mapSheetAnalDataGeomEntity.id, @@ -198,7 +214,25 @@ public class ChangeDetectionRepositoryImpl extends QuerydslRepositorySupport mapSheetAnalDataGeomEntity.mapSheetNum.eq(Long.valueOf(mapSheetNum))) .fetch(); - return new ChangeDetectionDto.PointFeatureList("FeatureCollection", list); + 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); } @Override