spotless + 학습데이터 geojson 생성 커밋
This commit is contained in:
@@ -1,5 +1,13 @@
|
||||
package com.kamco.cd.kamcoback.scheduler.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.CompleteLabelData.GeoJsonFeature;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
@@ -28,4 +36,102 @@ public class TrainingDataReviewJobDto {
|
||||
String inspectorUid;
|
||||
Long pendingCount;
|
||||
}
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@RequiredArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class AnalCntInfo {
|
||||
|
||||
Long analUid;
|
||||
String resultUid;
|
||||
Long allCnt;
|
||||
Long completeCnt;
|
||||
Long fileCnt;
|
||||
}
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@RequiredArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class AnalMapSheetList {
|
||||
|
||||
private Integer compareYyyy;
|
||||
private Integer targetYyyy;
|
||||
private String mapSheetNum;
|
||||
}
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@JsonPropertyOrder({"type", "features"})
|
||||
public static class FeatureCollection {
|
||||
|
||||
private final String type = "FeatureCollection";
|
||||
private List<GeoJsonFeature> features;
|
||||
|
||||
public FeatureCollection(List<GeoJsonFeature> features) {
|
||||
this.features = features;
|
||||
}
|
||||
}
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@JsonPropertyOrder({"type", "geometry", "properties"})
|
||||
public static class CompleteLabelData {
|
||||
|
||||
private Long geoUid;
|
||||
private String type;
|
||||
@JsonIgnore private String geomStr;
|
||||
private JsonNode geometry;
|
||||
private Properties properties;
|
||||
|
||||
public CompleteLabelData(Long geoUid, String type, String geomStr, Properties properties) {
|
||||
this.geoUid = geoUid;
|
||||
this.type = type;
|
||||
this.geomStr = geomStr;
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
JsonNode jsonNode = null;
|
||||
try {
|
||||
if (geomStr != null) {
|
||||
jsonNode = mapper.readTree(this.geomStr);
|
||||
}
|
||||
} catch (JsonProcessingException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
this.geometry = jsonNode;
|
||||
if (jsonNode != null && jsonNode.isObject()) {
|
||||
((ObjectNode) jsonNode).remove("crs");
|
||||
}
|
||||
|
||||
this.properties = properties;
|
||||
}
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@RequiredArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class Properties {
|
||||
|
||||
private String modelId;
|
||||
private String before;
|
||||
private String after;
|
||||
}
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public static class GeoJsonFeature {
|
||||
|
||||
private String type;
|
||||
private JsonNode geometry;
|
||||
private Properties properties;
|
||||
|
||||
public static GeoJsonFeature from(CompleteLabelData data) {
|
||||
return new GeoJsonFeature(
|
||||
data.getType(),
|
||||
data.getGeometry(), // geoUid 없음
|
||||
data.getProperties());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -243,10 +243,10 @@ public class MapSheetMngFileJobService {
|
||||
mapSheetMngFileJobCoreService.findByHstMapSheetBeforeYyyyListCount(
|
||||
strtYyyy, endYyyy, mapSheetNum);
|
||||
|
||||
//System.out.println("mapSheetAutoExceptionUpdate mapSheetNum == " + mapSheetNum);
|
||||
//System.out.println("mapSheetAutoExceptionUpdate strtYyyy == " + strtYyyy);
|
||||
//System.out.println("mapSheetAutoExceptionUpdate endYyyy == " + endYyyy);
|
||||
//System.out.println("mapSheetAutoExceptionUpdate beforeCnt == " + beforeCnt);
|
||||
// System.out.println("mapSheetAutoExceptionUpdate mapSheetNum == " + mapSheetNum);
|
||||
// System.out.println("mapSheetAutoExceptionUpdate strtYyyy == " + strtYyyy);
|
||||
// System.out.println("mapSheetAutoExceptionUpdate endYyyy == " + endYyyy);
|
||||
// System.out.println("mapSheetAutoExceptionUpdate beforeCnt == " + beforeCnt);
|
||||
if (beforeCnt == 0) {
|
||||
System.out.println("mapSheetAutoExceptionUpdate inference == 자동추론제외");
|
||||
mapSheetMngFileJobCoreService.updateException5kMapSheet(mapSheetNum);
|
||||
|
||||
@@ -1,13 +1,25 @@
|
||||
package com.kamco.cd.kamcoback.scheduler.service;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.SerializationFeature;
|
||||
import com.kamco.cd.kamcoback.postgres.core.TrainingDataReviewJobCoreService;
|
||||
import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.AnalCntInfo;
|
||||
import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.AnalMapSheetList;
|
||||
import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.CompleteLabelData;
|
||||
import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.CompleteLabelData.GeoJsonFeature;
|
||||
import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.FeatureCollection;
|
||||
import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.InspectorPendingDto;
|
||||
import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.Tasks;
|
||||
import jakarta.transaction.Transactional;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@@ -26,6 +38,9 @@ public class TrainingDataReviewJobService {
|
||||
@Value("${spring.profiles.active}")
|
||||
private String profile;
|
||||
|
||||
@Value("${training-data.geojson-dir}")
|
||||
private String trainingDataDir;
|
||||
|
||||
private boolean isLocalProfile() {
|
||||
return "local".equalsIgnoreCase(profile);
|
||||
}
|
||||
@@ -134,4 +149,70 @@ public class TrainingDataReviewJobService {
|
||||
geomUids.add(task.getInferenceUid());
|
||||
trainingDataReviewJobCoreService.updateGeomUidTestState(geomUids);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@Scheduled(cron = "0 0 2 * * *")
|
||||
public void exportGeojsonLabelingGeom() {
|
||||
|
||||
// 1) 경로/파일명 결정
|
||||
String targetDir =
|
||||
"local".equals(profile) ? System.getProperty("user.home") + "/geojson" : trainingDataDir;
|
||||
|
||||
// 2) 진행중인 회차 중, complete_cnt 가 존재하는 회차 목록 가져오기
|
||||
List<AnalCntInfo> analList = trainingDataReviewJobCoreService.findAnalCntInfoList();
|
||||
|
||||
for (AnalCntInfo info : analList) {
|
||||
if (Objects.equals(info.getAllCnt(), info.getFileCnt())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String resultUid = info.getResultUid(); // 회차의 대문자 uid (폴더명으로 사용)
|
||||
|
||||
// 3) 회차 + 어제까지 검수 완료된 총 데이터의 도엽별 목록 가져오기
|
||||
List<AnalMapSheetList> analMapList =
|
||||
trainingDataReviewJobCoreService.findCompletedAnalMapSheetList(info.getAnalUid());
|
||||
|
||||
if (analMapList.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (AnalMapSheetList mapSheet : analMapList) {
|
||||
// 4) 도엽별 geom 데이터 가지고 와서 geojson 만들기
|
||||
List<CompleteLabelData> completeList =
|
||||
trainingDataReviewJobCoreService.findCompletedYesterdayLabelingList(
|
||||
info.getAnalUid(), mapSheet.getMapSheetNum());
|
||||
|
||||
if (!completeList.isEmpty()) {
|
||||
|
||||
List<Long> geoUids = completeList.stream().map(CompleteLabelData::getGeoUid).toList();
|
||||
List<GeoJsonFeature> features = completeList.stream().map(GeoJsonFeature::from).toList();
|
||||
|
||||
// 5) 파일서버에 uid 폴더 생성 후 업로드 하기
|
||||
FeatureCollection collection = new FeatureCollection(features);
|
||||
String filename =
|
||||
String.format(
|
||||
"%s_%s_%s_%s_D15.geojson",
|
||||
resultUid.substring(0, 8),
|
||||
mapSheet.getCompareYyyy(),
|
||||
mapSheet.getTargetYyyy(),
|
||||
mapSheet.getMapSheetNum());
|
||||
|
||||
Path outputPath = Paths.get(targetDir + "/" + resultUid, filename);
|
||||
try {
|
||||
Files.createDirectories(outputPath.getParent());
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
|
||||
objectMapper.writeValue(outputPath.toFile(), collection);
|
||||
|
||||
// geoUids : file_create_yn = true 로 업데이트
|
||||
trainingDataReviewJobCoreService.updateLearnDataGeomFileCreateYn(geoUids);
|
||||
|
||||
} catch (IOException e) {
|
||||
log.error(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user