Merge remote-tracking branch 'origin/feat/demo-20251205' into feat/demo-20251205

# Conflicts:
#	src/main/java/com/kamco/cd/kamcoback/postgres/core/ChangeDetectionCoreService.java
#	src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryImpl.java
This commit is contained in:
2025-11-28 09:39:29 +09:00
4 changed files with 18 additions and 50 deletions

View File

@@ -39,7 +39,7 @@ dependencies {
implementation 'com.fasterxml.jackson.core:jackson-databind' implementation 'com.fasterxml.jackson.core:jackson-databind'
implementation 'org.locationtech.jts.io:jts-io-common:1.20.0' implementation 'org.locationtech.jts.io:jts-io-common:1.20.0'
implementation 'org.locationtech.jts:jts-core:1.19.0' implementation 'org.locationtech.jts:jts-core:1.19.0'
//implementation 'org.hibernate:hibernate-spatial:6.2.7.Final' implementation 'org.hibernate:hibernate-spatial:6.2.7.Final'
// QueryDSL JPA // QueryDSL JPA
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'

View File

@@ -1,6 +1,5 @@
package com.kamco.cd.kamcoback.changedetection.dto; package com.kamco.cd.kamcoback.changedetection.dto;
import com.fasterxml.jackson.databind.JsonNode;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@@ -53,7 +52,7 @@ public class ChangeDetectionDto {
public static class CogUrlDto { public static class CogUrlDto {
private String beforeCogUrl; private String beforeCogUrl;
private String afterCogUrl; private String afterCogUrl;
private JsonNode bbox; private Geometry bbox;
} }
@Schema(name = "AnalYearList", description = "년도(차수) 목록") @Schema(name = "AnalYearList", description = "년도(차수) 목록")

View File

@@ -56,16 +56,6 @@ public class ChangeDetectionCoreService {
} }
public ChangeDetectionDto.CogUrlDto getChangeDetectionCogUrl(ChangeDetectionDto.CogUrlReq req) { public ChangeDetectionDto.CogUrlDto getChangeDetectionCogUrl(ChangeDetectionDto.CogUrlReq req) {
ObjectMapper mapper = new ObjectMapper();
ChangeDetectionDto.CogUrlDto resultDto =
changeDetectionRepository.getChangeDetectionCogUrl(req);
try {
JsonNode geomNode = mapper.readTree(resultDto.getBbox().toString());
resultDto.setBbox(geomNode);
} catch (Exception e) {
throw new RuntimeException("Failed to parse geom JSON", e);
}
return changeDetectionRepository.getChangeDetectionCogUrl(req); return changeDetectionRepository.getChangeDetectionCogUrl(req);
} }

View File

@@ -7,19 +7,14 @@ import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalDataGeomEntity
import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalEntity.mapSheetAnalEntity; import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalEntity.mapSheetAnalEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalSttcEntity.mapSheetAnalSttcEntity; import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalSttcEntity.mapSheetAnalSttcEntity;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.kamco.cd.kamcoback.changedetection.dto.ChangeDetectionDto; import com.kamco.cd.kamcoback.changedetection.dto.ChangeDetectionDto;
import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalDataGeomEntity; import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalDataGeomEntity;
import com.querydsl.core.Tuple;
import com.querydsl.core.types.Projections; import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.CaseBuilder; import com.querydsl.core.types.dsl.CaseBuilder;
import com.querydsl.core.types.dsl.Expressions; import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.core.types.dsl.StringExpression; import com.querydsl.core.types.dsl.StringExpression;
import com.querydsl.jpa.impl.JPAQueryFactory; import com.querydsl.jpa.impl.JPAQueryFactory;
import java.util.List; import java.util.List;
import java.util.Objects;
import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;
public class ChangeDetectionRepositoryImpl extends QuerydslRepositorySupport public class ChangeDetectionRepositoryImpl extends QuerydslRepositorySupport
@@ -68,12 +63,13 @@ public class ChangeDetectionRepositoryImpl extends QuerydslRepositorySupport
@Override @Override
public ChangeDetectionDto.CogUrlDto getChangeDetectionCogUrl(ChangeDetectionDto.CogUrlReq req) { public ChangeDetectionDto.CogUrlDto getChangeDetectionCogUrl(ChangeDetectionDto.CogUrlReq req) {
Tuple result = return queryFactory
queryFactory
.select( .select(
Projections.constructor(
ChangeDetectionDto.CogUrlDto.class,
makeCogUrl(req.getBeforeYear()).max().as("beforeCogUrl"), makeCogUrl(req.getBeforeYear()).max().as("beforeCogUrl"),
makeCogUrl(req.getAfterYear()).max().as("afterCogUrl"), makeCogUrl(req.getAfterYear()).max().as("afterCogUrl"),
Expressions.stringTemplate("ST_AsGeoJSON({0})", mapInkx5kEntity.geom).as("bbox")) mapInkx5kEntity.geom.as("bbox")))
.from(imageryEntity) .from(imageryEntity)
.innerJoin(mapInkx5kEntity) .innerJoin(mapInkx5kEntity)
.on(imageryEntity.scene5k.eq(mapInkx5kEntity.mapidcdNo)) .on(imageryEntity.scene5k.eq(mapInkx5kEntity.mapidcdNo))
@@ -85,14 +81,6 @@ public class ChangeDetectionRepositoryImpl extends QuerydslRepositorySupport
imageryEntity.scene5k.eq(req.getMapSheetNum())) imageryEntity.scene5k.eq(req.getMapSheetNum()))
.groupBy(mapInkx5kEntity.geom) .groupBy(mapInkx5kEntity.geom)
.fetchOne(); .fetchOne();
// Polygon -> JsonNode 로 변환
JsonNode geometryJson =
changeGeometryJson(
String.valueOf(Objects.requireNonNull(result).get(2, StringExpression.class)));
return new ChangeDetectionDto.CogUrlDto(
result.get(0, String.class), result.get(1, String.class), geometryJson);
} }
@Override @Override
@@ -119,13 +107,4 @@ public class ChangeDetectionRepositoryImpl extends QuerydslRepositorySupport
"{0} || {1}", imageryEntity.cogMiddlePath, imageryEntity.cogFilename)) "{0} || {1}", imageryEntity.cogMiddlePath, imageryEntity.cogFilename))
.otherwise(""); .otherwise("");
} }
private JsonNode changeGeometryJson(String geometry) {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.readTree(geometry);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
} }