Geometry 변환 hibernate-spatial 적용
This commit is contained in:
@@ -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'
|
||||||
|
|||||||
@@ -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 = "년도(차수) 목록")
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,31 +63,24 @@ 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))
|
||||||
.where(
|
.where(
|
||||||
imageryEntity
|
imageryEntity
|
||||||
.year
|
.year
|
||||||
.eq(req.getBeforeYear())
|
.eq(req.getBeforeYear())
|
||||||
.or(imageryEntity.year.eq(req.getAfterYear())),
|
.or(imageryEntity.year.eq(req.getAfterYear())),
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user