diff --git a/build.gradle b/build.gradle index bafe1bb5..e8492f96 100644 --- a/build.gradle +++ b/build.gradle @@ -39,6 +39,7 @@ dependencies { implementation 'com.fasterxml.jackson.core:jackson-databind' implementation 'org.locationtech.jts.io:jts-io-common:1.20.0' implementation 'org.locationtech.jts:jts-core:1.19.0' + implementation 'org.hibernate:hibernate-spatial:6.2.7.Final' // QueryDSL JPA implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' diff --git a/src/main/java/com/kamco/cd/kamcoback/changedetection/ChangeDetectionApiController.java b/src/main/java/com/kamco/cd/kamcoback/changedetection/ChangeDetectionApiController.java new file mode 100644 index 00000000..1865e899 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/changedetection/ChangeDetectionApiController.java @@ -0,0 +1,28 @@ +package com.kamco.cd.kamcoback.changedetection; + +import com.kamco.cd.kamcoback.changedetection.dto.ChangeDetectionDto; +import com.kamco.cd.kamcoback.changedetection.service.ChangeDetectionService; +import com.kamco.cd.kamcoback.config.api.ApiResponseDto; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Tag(name = "변화탐지", description = "변화탐지 API") +@RequiredArgsConstructor +@RestController +@RequestMapping("/api/change-detection") +@Transactional +public class ChangeDetectionApiController { + + private final ChangeDetectionService changeDetectionService; + + @GetMapping + public ApiResponseDto> getPolygonToPoint() { + return ApiResponseDto.ok(changeDetectionService.getPolygonToPoint()); + } +} 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 new file mode 100644 index 00000000..9fdd54d7 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/changedetection/dto/ChangeDetectionDto.java @@ -0,0 +1,10 @@ +package com.kamco.cd.kamcoback.changedetection.dto; + +import org.locationtech.jts.geom.Geometry; + +public record ChangeDetectionDto( + Long id, + Geometry polygon, + double centroidX, + double centroidY +) {} 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 new file mode 100644 index 00000000..cb8cf468 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/changedetection/service/ChangeDetectionService.java @@ -0,0 +1,20 @@ +package com.kamco.cd.kamcoback.changedetection.service; + +import com.kamco.cd.kamcoback.changedetection.dto.ChangeDetectionDto; +import com.kamco.cd.kamcoback.config.api.ApiResponseDto; +import com.kamco.cd.kamcoback.postgres.core.ChangeDetectionCoreService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class ChangeDetectionService { + + private final ChangeDetectionCoreService changeDetectionCoreService; + + public List getPolygonToPoint() { + return changeDetectionCoreService.getPolygonToPoint(); + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/config/GlobalExceptionHandler.java b/src/main/java/com/kamco/cd/kamcoback/config/GlobalExceptionHandler.java index 263ab968..0744c962 100644 --- a/src/main/java/com/kamco/cd/kamcoback/config/GlobalExceptionHandler.java +++ b/src/main/java/com/kamco/cd/kamcoback/config/GlobalExceptionHandler.java @@ -293,7 +293,9 @@ public class GlobalExceptionHandler { Arrays.stream(stackTrace) // .limit(20) .map(StackTraceElement::toString) - .collect(Collectors.joining("\n")); + .collect(Collectors.joining("\n")) + .substring(0, Math.min(stackTrace.length, 255)); + ; ErrorLogEntity errorLogEntity = new ErrorLogEntity( 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 new file mode 100644 index 00000000..d893864d --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/ChangeDetectionCoreService.java @@ -0,0 +1,38 @@ +package com.kamco.cd.kamcoback.postgres.core; + + +import com.kamco.cd.kamcoback.changedetection.dto.ChangeDetectionDto; +import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalDataGeomEntity; +import com.kamco.cd.kamcoback.postgres.repository.changedetection.ChangeDetectionRepository; +import lombok.RequiredArgsConstructor; +import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.geom.Point; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class ChangeDetectionCoreService { + + private final ChangeDetectionRepository changeDetectionRepository; + + public List getPolygonToPoint() { + List list = changeDetectionRepository.findAll(); + + return list.stream().map(p -> { + Geometry polygon = p.getGeom(); + // 중심 좌표 계산 + Point centroid = polygon.getCentroid(); + + return new ChangeDetectionDto( + p.getId(), + polygon, + centroid.getX(), + centroid.getY() + ); + }) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataGeomEntity.java b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataGeomEntity.java index 3840f029..57f4d94f 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataGeomEntity.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataGeomEntity.java @@ -1,17 +1,12 @@ package com.kamco.cd.kamcoback.postgres.entity; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.SequenceGenerator; -import jakarta.persistence.Table; +import jakarta.persistence.*; import jakarta.validation.constraints.Size; -import java.time.Instant; -import java.time.ZonedDateTime; import lombok.Getter; import lombok.Setter; +import org.locationtech.jts.geom.Geometry; + +import java.time.ZonedDateTime; @Getter @Setter @@ -71,4 +66,6 @@ public class MapSheetAnalDataGeomEntity { @Column(name = "updated_uid") private Long updatedUid; + @Column(name = "geom", columnDefinition = "geometry") + private Geometry geom; } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepository.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepository.java new file mode 100644 index 00000000..32ef1f20 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepository.java @@ -0,0 +1,6 @@ +package com.kamco.cd.kamcoback.postgres.repository.changedetection; + +import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalDataGeomEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ChangeDetectionRepository extends JpaRepository, ChangeDetectionRepositoryCustom {} 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 new file mode 100644 index 00000000..dedb2181 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryCustom.java @@ -0,0 +1,9 @@ +package com.kamco.cd.kamcoback.postgres.repository.changedetection; + +import com.kamco.cd.kamcoback.config.api.ApiResponseDto; + +public interface ChangeDetectionRepositoryCustom { + + String getPolygonToPoint(); + +} 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 new file mode 100644 index 00000000..221b5aec --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryImpl.java @@ -0,0 +1,33 @@ +package com.kamco.cd.kamcoback.postgres.repository.changedetection; + +import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalDataGeomEntity; +import com.querydsl.jpa.impl.JPAQueryFactory; +import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; + +import java.util.List; + +import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalDataGeomEntity.mapSheetAnalDataGeomEntity; + +public class ChangeDetectionRepositoryImpl extends QuerydslRepositorySupport + implements ChangeDetectionRepositoryCustom { + + private final JPAQueryFactory queryFactory; + + public ChangeDetectionRepositoryImpl(JPAQueryFactory queryFactory) { + super(MapSheetAnalDataGeomEntity.class); + this.queryFactory = queryFactory; + } + + @Override + public String getPolygonToPoint() { + + return null; + } + + public List findAll() { + return queryFactory + .selectFrom(mapSheetAnalDataGeomEntity) + .orderBy(mapSheetAnalDataGeomEntity.id.desc()) + .fetch(); + } +}