Merge pull request 'feat/demo-20251205' (#30) from feat/demo-20251205 into develop

Reviewed-on: https://kamco.gitea.gs.dabeeo.com/dabeeo/kamco-dabeeo-backoffice/pulls/30
This commit is contained in:
2025-12-01 16:05:09 +09:00
6 changed files with 108 additions and 149 deletions

View File

@@ -84,7 +84,7 @@ public class ChangeDetectionApiController {
@Operation(summary = "변화탐지 결과 Point", description = "변화탐지 결과 Point") @Operation(summary = "변화탐지 결과 Point", description = "변화탐지 결과 Point")
@GetMapping("/point") @GetMapping("/point")
public ApiResponseDto<List<ChangeDetectionDto.PointFeature>> getChangeDetectionPointList( public ApiResponseDto<ChangeDetectionDto.PointFeatureList> getChangeDetectionPointList(
@Parameter(description = "년도목록 id", example = "1") @RequestParam Long analUid, @Parameter(description = "년도목록 id", example = "1") @RequestParam Long analUid,
@Parameter(description = "도엽번호", example = "34602060") @RequestParam String mapSheetNum) { @Parameter(description = "도엽번호", example = "34602060") @RequestParam String mapSheetNum) {
return ApiResponseDto.ok( return ApiResponseDto.ok(

View File

@@ -1,5 +1,6 @@
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 java.util.List; import java.util.List;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@@ -87,7 +88,16 @@ public class ChangeDetectionDto {
public static class PolygonFeatureList { public static class PolygonFeatureList {
private String type; private String type;
private List<PolygonFeature> features; // Point 값 private List<PolygonFeature> features; // Point 값
private String classCd; // after 분류 }
@Schema(name = "PointFeatureList", description = "Geometry 리턴 객체")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public static class PointFeatureList {
private String type;
private List<PointFeature> features; // Point 값
} }
@Schema(name = "PolygonFeature", description = "Geometry 리턴 객체") @Schema(name = "PolygonFeature", description = "Geometry 리턴 객체")
@@ -97,8 +107,26 @@ public class ChangeDetectionDto {
@AllArgsConstructor @AllArgsConstructor
public static class PolygonFeature { public static class PolygonFeature {
private String type; private String type;
private Geometry geometry; // after 분류 private JsonNode geometry; // after 분류
private PolygonProperties properties; // Point 값 private PolygonProperties properties; //
}
@Schema(name = "PolygonFeature", description = "Geometry 리턴 객체")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public static class PolygonQueryData {
private String type;
private String geometry; // geoJson String
private Long geoUid;
private Double area; // 면적
private Integer beforeYear; // 기준년도
private Double beforeConfidence; // 기준 신뢰도(확률)
private String beforeClass; // 기준 분류
private Integer afterYear; // 비교년도
private Double afterConfidence; // 비교 신뢰도(확률)
private String afterClass;
} }
@Schema(name = "PointFeature", description = "Geometry 리턴 객체") @Schema(name = "PointFeature", description = "Geometry 리턴 객체")

View File

@@ -39,7 +39,7 @@ public class ChangeDetectionService {
return changeDetectionCoreService.getChangeDetectionPolygonList(analUid, mapSheetNum); return changeDetectionCoreService.getChangeDetectionPolygonList(analUid, mapSheetNum);
} }
public List<ChangeDetectionDto.PointFeature> getChangeDetectionPointList( public ChangeDetectionDto.PointFeatureList getChangeDetectionPointList(
Long analUid, String mapSheetNum) { Long analUid, String mapSheetNum) {
return changeDetectionCoreService.getChangeDetectionPointList(analUid, mapSheetNum); return changeDetectionCoreService.getChangeDetectionPointList(analUid, mapSheetNum);
} }

View File

@@ -81,7 +81,7 @@ public class ChangeDetectionCoreService {
return changeDetectionRepository.getChangeDetectionPolygonList(analUid, mapSheetNum); return changeDetectionRepository.getChangeDetectionPolygonList(analUid, mapSheetNum);
} }
public List<ChangeDetectionDto.PointFeature> getChangeDetectionPointList( public ChangeDetectionDto.PointFeatureList getChangeDetectionPointList(
Long analUid, String mapSheetNum) { Long analUid, String mapSheetNum) {
return changeDetectionRepository.getChangeDetectionPointList(analUid, mapSheetNum); return changeDetectionRepository.getChangeDetectionPointList(analUid, mapSheetNum);
} }

View File

@@ -18,8 +18,7 @@ public interface ChangeDetectionRepositoryCustom {
ChangeDetectionDto.PolygonFeatureList getChangeDetectionPolygonList( ChangeDetectionDto.PolygonFeatureList getChangeDetectionPolygonList(
Long analUid, String mapSheetNum); Long analUid, String mapSheetNum);
List<ChangeDetectionDto.PointFeature> getChangeDetectionPointList( ChangeDetectionDto.PointFeatureList getChangeDetectionPointList(Long analUid, String mapSheetNum);
Long analUid, String mapSheetNum);
List<ChangeDetectionDto.MapSheetList> getChangeDetectionMapSheetList(Long analUid); List<ChangeDetectionDto.MapSheetList> getChangeDetectionMapSheetList(Long analUid);
} }

View File

@@ -8,6 +8,9 @@ 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.types.Projections; import com.querydsl.core.types.Projections;
@@ -16,6 +19,7 @@ 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.stream.Collectors;
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
@@ -107,22 +111,80 @@ public class ChangeDetectionRepositoryImpl extends QuerydslRepositorySupport
public ChangeDetectionDto.PolygonFeatureList getChangeDetectionPolygonList( public ChangeDetectionDto.PolygonFeatureList getChangeDetectionPolygonList(
Long analUid, String mapSheetNum) { Long analUid, String mapSheetNum) {
List<ChangeDetectionDto.PolygonFeature> result = List<ChangeDetectionDto.PolygonQueryData> list =
queryFactory queryFactory
.select( .select(
Projections.constructor( Projections.constructor(
ChangeDetectionDto.PolygonFeature.class, ChangeDetectionDto.PolygonQueryData.class,
Expressions.stringTemplate("{0}", "Feature"), Expressions.stringTemplate("{0}", "Feature"),
mapSheetAnalDataGeomEntity.geom, // polygon Expressions.stringTemplate(
"ST_AsGeoJSON({0})", mapSheetAnalDataGeomEntity.geom),
mapSheetAnalDataGeomEntity.id,
mapSheetAnalDataGeomEntity.area,
mapSheetAnalDataGeomEntity.compareYyyy,
mapSheetAnalDataGeomEntity.classBeforeProb,
mapSheetAnalDataGeomEntity.classBeforeCd.toUpperCase(),
mapSheetAnalDataGeomEntity.targetYyyy,
mapSheetAnalDataGeomEntity.classAfterProb,
mapSheetAnalDataGeomEntity.classAfterCd.toUpperCase()))
.from(mapSheetAnalDataGeomEntity)
.innerJoin(mapSheetAnalDataEntity)
.on(mapSheetAnalDataGeomEntity.dataUid.eq(mapSheetAnalDataEntity.id))
.innerJoin(mapSheetAnalEntity)
.on(mapSheetAnalEntity.id.eq(mapSheetAnalDataEntity.analUid))
.where(
mapSheetAnalEntity.id.eq(analUid),
mapSheetAnalDataGeomEntity.mapSheetNum.eq(Long.valueOf(mapSheetNum)))
.fetch();
ObjectMapper mapper = new ObjectMapper();
List<ChangeDetectionDto.PolygonFeature> 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());
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 ChangeDetectionDto.PointFeatureList getChangeDetectionPointList(
Long analUid, String mapSheetNum) {
List<ChangeDetectionDto.PointFeature> list =
queryFactory
.select(
Projections.constructor(
ChangeDetectionDto.PointFeature.class,
Expressions.stringTemplate("{0}", "Feature"),
mapSheetAnalDataGeomEntity.geomCenter, // point
Projections.constructor( Projections.constructor(
ChangeDetectionDto.PolygonProperties.class, ChangeDetectionDto.PointProperties.class,
mapSheetAnalDataGeomEntity.id, mapSheetAnalDataGeomEntity.id,
mapSheetAnalDataGeomEntity.area,
mapSheetAnalDataGeomEntity.compareYyyy,
mapSheetAnalDataGeomEntity.classBeforeProb,
mapSheetAnalDataGeomEntity.classBeforeCd.toUpperCase(),
mapSheetAnalDataGeomEntity.targetYyyy,
mapSheetAnalDataGeomEntity.classAfterProb,
mapSheetAnalDataGeomEntity.classAfterCd.toUpperCase()))) mapSheetAnalDataGeomEntity.classAfterCd.toUpperCase())))
.from(mapSheetAnalDataGeomEntity) .from(mapSheetAnalDataGeomEntity)
.innerJoin(mapSheetAnalDataEntity) .innerJoin(mapSheetAnalDataEntity)
@@ -134,137 +196,7 @@ public class ChangeDetectionRepositoryImpl extends QuerydslRepositorySupport
mapSheetAnalDataGeomEntity.mapSheetNum.eq(Long.valueOf(mapSheetNum))) mapSheetAnalDataGeomEntity.mapSheetNum.eq(Long.valueOf(mapSheetNum)))
.fetch(); .fetch();
// List<Tuple> list = return new ChangeDetectionDto.PointFeatureList("FeatureCollection", list);
// queryFactory
// .select(
// Expressions.stringTemplate(
// "ST_AsGeoJSON(ST_Transform({0}, 4326))", mapSheetAnalDataGeomEntity.geom),
// mapSheetAnalDataGeomEntity.id,
// mapSheetAnalDataGeomEntity.area,
// mapSheetAnalDataGeomEntity.compareYyyy,
// mapSheetAnalDataGeomEntity.classBeforeProb,
// mapSheetAnalDataGeomEntity.classBeforeCd.toUpperCase(),
// mapSheetAnalDataGeomEntity.targetYyyy,
// mapSheetAnalDataGeomEntity.classAfterProb,
// mapSheetAnalDataGeomEntity.classAfterCd.toUpperCase())
// .from(QMapSheetAnalDataGeomEntity.mapSheetAnalDataGeomEntity)
// .where(
// QMapSheetAnalDataGeomEntity.mapSheetAnalDataGeomEntity.dataUid.in(
// JPAExpressions.select(QMapSheetAnalDataEntity.mapSheetAnalDataEntity.id)
// .from(QMapSheetAnalDataEntity.mapSheetAnalDataEntity)
//
// .where(QMapSheetAnalDataEntity.mapSheetAnalDataEntity.analUid.eq(analUid))),
// QMapSheetAnalDataGeomEntity.mapSheetAnalDataGeomEntity.mapSheetNum.eq(
// Long.valueOf(mapSheetNum)))
// .fetch();
//
// GeoJsonReader reader = new GeoJsonReader();
//
// List<ChangeDetectionDto.PolygonFeature> result =
// list.stream()
// .map(
// tuple -> {
// String geojson = tuple.get(0, String.class);
// Geometry geom;
// try {
// geom = reader.read(geojson);
// } catch (Exception ex) {
// throw new RuntimeException("GeoJSON -> Geometry 변환 실패", ex);
// }
// ChangeDetectionDto.PolygonProperties properties =
// new ChangeDetectionDto.PolygonProperties(
// tuple.get(mapSheetAnalDataGeomEntity.id).longValue(),
// tuple.get(mapSheetAnalDataGeomEntity.area).doubleValue(),
// tuple.get(mapSheetAnalDataGeomEntity.compareYyyy).intValue(),
// tuple.get(mapSheetAnalDataGeomEntity.classBeforeProb).doubleValue(),
// tuple
// .get(mapSheetAnalDataGeomEntity.classBeforeCd.toUpperCase())
// .toString(),
// tuple.get(mapSheetAnalDataGeomEntity.targetYyyy).intValue(),
// tuple.get(mapSheetAnalDataGeomEntity.classAfterProb).doubleValue(),
// tuple
// .get(mapSheetAnalDataGeomEntity.classAfterCd.toUpperCase())
// .toString());
// return new ChangeDetectionDto.PolygonFeature("Feature", geom, properties);
// })
// .collect(Collectors.toList());
ChangeDetectionDto.PolygonFeatureList polygonList = new ChangeDetectionDto.PolygonFeatureList();
polygonList.setType("FeatureCollection");
polygonList.setFeatures(result);
// list.clear(); // List<Tuple> 사용 참조 해제
return polygonList;
}
@Override
public List<ChangeDetectionDto.PointFeature> getChangeDetectionPointList(
Long analUid, String mapSheetNum) {
return queryFactory
.select(
Projections.constructor(
ChangeDetectionDto.PointFeature.class,
Expressions.stringTemplate("{0}", "Feature"),
mapSheetAnalDataGeomEntity.geomCenter, // point
Projections.constructor(
ChangeDetectionDto.PointProperties.class,
mapSheetAnalDataGeomEntity.id,
mapSheetAnalDataGeomEntity.classAfterCd.toUpperCase())))
.from(mapSheetAnalDataGeomEntity)
.innerJoin(mapSheetAnalDataEntity)
.on(mapSheetAnalDataGeomEntity.dataUid.eq(mapSheetAnalDataEntity.id))
.innerJoin(mapSheetAnalEntity)
.on(mapSheetAnalEntity.id.eq(mapSheetAnalDataEntity.analUid))
.where(
mapSheetAnalEntity.id.eq(analUid),
mapSheetAnalDataGeomEntity.mapSheetNum.eq(Long.valueOf(mapSheetNum)))
.fetch();
// List<Tuple> list =
// queryFactory
// .select(
// Expressions.stringTemplate(
// "ST_AsGeoJSON(ST_Transform({0}, 4326))",
// mapSheetAnalDataGeomEntity.geomCenter),
// mapSheetAnalDataGeomEntity.id,
// mapSheetAnalDataGeomEntity.classAfterCd.toUpperCase())
// .from(mapSheetAnalDataGeomEntity)
// .where(
// mapSheetAnalDataGeomEntity.dataUid.in(
// JPAExpressions.select(mapSheetAnalDataEntity.id)
// .from(mapSheetAnalDataEntity)
// .where(mapSheetAnalDataEntity.analUid.eq(analUid))),
// mapSheetAnalDataGeomEntity.mapSheetNum.eq(Long.valueOf(mapSheetNum)))
// .fetch();
//
// GeoJsonReader reader = new GeoJsonReader();
// List<ChangeDetectionDto.PointFeature> result =
// list.stream()
// .map(
// tuple -> {
// String geojson = tuple.get(0, String.class);
// Geometry geom;
// try {
// geom = reader.read(geojson);
// } catch (Exception ex) {
// throw new RuntimeException("GeoJSON -> Geometry 변환 실패", ex);
// }
//
// Long geoUid = tuple.get(mapSheetAnalDataGeomEntity.id).longValue();
// String classCd =
//
// tuple.get(mapSheetAnalDataGeomEntity.classAfterCd.toUpperCase()).toString();
//
// return new ChangeDetectionDto.PointFeature(
// "Feature", geom, new ChangeDetectionDto.PointProperties(geoUid,
// classCd));
// })
// .collect(Collectors.toList());
//
// list.clear(); // List<Tuple> 사용 참조 해제
//
// return result;
} }
@Override @Override