From d3c4d982546ca66716a90169694367a72bb6fd44 Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Fri, 23 Jan 2026 20:01:29 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=ED=95=99=EC=8A=B5=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20geojson=20.md=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scheduler/TRAINING_DATA_GEOJSON.md | 77 +++++++++++++++++ .../scheduler/TRAINING_DATA_GEOJSON_QUERY.sql | 85 +++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 src/main/java/com/kamco/cd/kamcoback/scheduler/TRAINING_DATA_GEOJSON.md create mode 100644 src/main/java/com/kamco/cd/kamcoback/scheduler/TRAINING_DATA_GEOJSON_QUERY.sql diff --git a/src/main/java/com/kamco/cd/kamcoback/scheduler/TRAINING_DATA_GEOJSON.md b/src/main/java/com/kamco/cd/kamcoback/scheduler/TRAINING_DATA_GEOJSON.md new file mode 100644 index 00000000..13b09115 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/scheduler/TRAINING_DATA_GEOJSON.md @@ -0,0 +1,77 @@ +## πŸ“Œ ν•™μŠ΅λ°μ΄ν„° 라벨링 geojson 생성 + +### 🧩 μ‚¬μš©ν•˜λŠ” ν…Œμ΄λΈ” λͺ©λ‘ + +- inference_results_testing : AI μˆ˜ν–‰ 이후 λ³€ν™”νƒμ§€λœ polygon insert 됨 +- tb_map_sheet_anal_inference : μΆ”λ‘  μ‹€ν–‰ μ™„λ£Œ ν›„, μΆ”λ‘  λ§ˆμŠ€ν„° κ°’ insert + - anal_state : ν•™μŠ΅λ°μ΄ν„° μ œμž‘ μƒνƒœ -> (enum) `LabelMngState` +- πŸ’‘ tb_map_sheet_anal_data_inference_geom πŸ’‘ : μΆ”λ‘  μ‹€ν–‰ μ™„λ£Œ ν›„, testing κ°’ insert +- tb_labeling_inspector : 라벨링 ν• λ‹Ή μ‹œ μ„ νƒν•œ κ²€μˆ˜μž insert + - 라벨링 ν• λ‹Ή μ‹œ ν•΄λ‹Ή νšŒμ°¨λ³„ κ²€μˆ˜μžλ₯Ό insert + - 맀일 0μ‹œ μŠ€μΌ€μ€„λ§, μ–΄μ œ 라벨링 μ™„λ£Œν•œ 데이터 κΈ°μ€€ κ²€μˆ˜ ν• λ‹Ή μ§„ν–‰ +- πŸ’‘ tb_labeling_assignment πŸ’‘ : 라벨링 ν• λ‹Ή ν…Œμ΄λΈ” (polygon 수만큼) + - worker_uid : 라벨러 μ‚¬λ²ˆ + - inspector_uid : κ²€μˆ˜μž μ‚¬λ²ˆ + - work_state : 라벨 μ§„ν–‰ μƒνƒœ -> (enum) `LabelState` + - inspect_state : κ²€μˆ˜ μ§„ν–‰ μƒνƒœ -> (enum) `InspectState` + - work_stat_dttm : 라벨 μƒνƒœ λ³€κ²½μΌμ‹œ + - inspect_stat_dttm : κ²€μˆ˜ μƒνƒœ λ³€κ²½μΌμ‹œ +- πŸ’‘ tb_map_sheet_learn_data_geom πŸ’‘ : 라벨링 νˆ΄μ—μ„œ κ·Έλ¦° polygon insert/update + - file_create_yn : geojson 파일 생성 ν›„ true 둜 μ—…λ°μ΄νŠΈ + +**πŸ’‘ν‘œκΈ°λœ ν…Œμ΄λΈ”μ€ geo_uid (Long) κ°’μœΌλ‘œ 연결됨** + +### 🧩 μŠ€μΌ€μ€„λ§ 둜직 + +βœ… 파일 μœ„μΉ˜ : TrainingDataReviewJobService.java + +#### 1. 라벨링 μ™„λ£Œ 건 κ²€μˆ˜ ν• λ‹Ή + +- Method : assignReviewerYesterdayLabelComplete +- 맀일 00μ‹œ 00λΆ„ μˆ˜ν–‰ (μ‹œκ°„ λ³€κ²½ κ°€λŠ₯) +- 라벨링 μƒνƒœ `work_state = DONE` +- 라벨링 μƒνƒœ λ³€κ²½μΌμ‹œ(work_stat_dttm) κΈ°μ€€ μ–΄μ œμΈ 건 μ‘°νšŒν•˜μ—¬ ν• λ‹Ή +- μ‹€νŒ¨ μ‹œ, μˆ˜λ™ 호좜 API : `/api/training-data/review/run-schedule` + +#### 2. ν•™μŠ΅λ°μ΄ν„° geojson 생성 + +- Method : exportGeojsonLabelingGeom +- 맀일 02μ‹œ 00λΆ„ μˆ˜ν–‰ (μ‹œκ°„ λ³€κ²½ κ°€λŠ₯) +- ν•™μŠ΅λ°μ΄ν„° μ œμž‘ μƒνƒœκ°€ `ING`인 회차 +- μ–΄μ œκΉŒμ§€ κ²€μˆ˜ μƒνƒœ μ—…λ°μ΄νŠΈ 된 polygon (`inspect_stat_dttm`) +- geojson μ œμž‘ λŒ€μƒμ€ λˆ„μ μœΌλ‘œ μ‘°νšŒν•¨ + - `inspect_state = 'COMPLETE'` + - `inspect_stat_dttm < 였늘 이전 λͺ¨λ‘` +- 파일 생성 ν›„ polygon별 `file_create_yn = true` 둜 μ—…λ°μ΄νŠΈ +- νšŒμ°¨μ— ν• λ‹Ήλœ polygon 총 개수(μ œμ™Έμƒνƒœ λΉΌκ³ ) = `file_create_yn = true` 인 κ°œμˆ˜κ°€ λ§žμ„ λ•ŒκΉŒμ§€ μŠ€μΌ€μ€„λ§ μ§„ν–‰ +- μ‹€νŒ¨ μ‹œ, μˆ˜λ™ 호좜 API : `/api/training-data/review/run-label-geojson` +- 파일 생성 μœ„μΉ˜: `/kamco-nfs/model_output/labeling/` +- οΈπŸ“š 생성 κ·œμΉ™ + +``` + /kamco-nfs/model_output/labeling/ + └─ {RESULT_UID} + └─{RESULT_UID 8자리}_{비ꡐ년도}_{기쀀년도}_{λ„μ—½λ²ˆν˜Έ}_D15.geojson + ``` + +### 🧩 μ‚¬μš© 쿼리 + +- πŸ“„ TRAINING_DATA_GEOJSON_QUERY.sql μ°Έκ³  + +### 🧩 라벨링 툴 접속 κ°€λŠ₯ν•œ 계정 + +`* password : qwe123!@#` + +1. 라벨러 + +- 010222297501 +- 98765432 +- 20202020 +- 123456 +- 01022223333 + +2. κ²€μˆ˜μž + +- 01022225555 +- 125511 +- K20251212001 diff --git a/src/main/java/com/kamco/cd/kamcoback/scheduler/TRAINING_DATA_GEOJSON_QUERY.sql b/src/main/java/com/kamco/cd/kamcoback/scheduler/TRAINING_DATA_GEOJSON_QUERY.sql new file mode 100644 index 00000000..ff607831 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/scheduler/TRAINING_DATA_GEOJSON_QUERY.sql @@ -0,0 +1,85 @@ +--1. ν•™μŠ΅λ°μ΄ν„° μ§„ν–‰ 쀑 회차 쑰회 +select lae1_0.anal_uid, + msle1_0.uid, + sum(case + when (lae1_0.inspect_state = 'UNCONFIRM' + or lae1_0.inspect_state = 'COMPLETE' + or lae1_0.inspect_state is null) + then 1 + else 0 + end), --allCnt + sum(case + when (lae1_0.inspect_state = 'COMPLETE') + then 1 + else 0 + end), --completeCnt + sum(case + when (msldge1_0.file_create_yn = true) + then 1 + else 0 + end) --fileCnt +from tb_labeling_assignment lae1_0 + join + tb_map_sheet_anal_inference msaie1_0 + on lae1_0.anal_uid = msaie1_0.anal_uid + and msaie1_0.anal_state = 'ING' --ν•™μŠ΅λ°μ΄ν„° μ œμž‘ 진행쀑인 회차 + left join + tb_map_sheet_learn msle1_0 + on msaie1_0.learn_id = msle1_0.id + left join + tb_map_sheet_learn_data_geom msldge1_0 + on lae1_0.inference_geom_uid = msldge1_0.geo_uid --라벨링 ν• λ‹Ή ν…Œμ΄λΈ”κ³Ό geo_uid κ°€ 같은 κ°’μœΌλ‘œ λ§€ν•‘λ˜μ–΄ 있음 +group by lae1_0.anal_uid, + msle1_0.uid +having sum(case + when (lae1_0.inspect_state = 'COMPLETE') + then 1 + else 0 + end) > 0 --κ²€μˆ˜ν• λ‹Ή COMPLETE μƒνƒœκ°€ μžˆλŠ” 회차만 검색 +; + +--2. ν•΄λ‹Ή 회차 + μ–΄μ œκΉŒμ§€ κ²€μˆ˜ μ™„λ£Œλœ 도엽 쑰회 +select msaie1_0.compare_yyyy, + msaie1_0.target_yyyy, + lae1_0.assign_group_id +from tb_labeling_assignment lae1_0 + join + tb_map_sheet_anal_inference msaie1_0 + on lae1_0.anal_uid = msaie1_0.anal_uid +where lae1_0.anal_uid = 52 --ν•΄λ‹Ή 회차 + and lae1_0.inspect_state = 'COMPLETE' --κ²€μˆ˜ μ™„λ£Œ μƒνƒœ + and lae1_0.inspect_stat_dttm < '2026-01-23T00:00+09:00' --κ²€μˆ˜μƒνƒœλ³€κ²½μΌ 였늘 이전 λͺ¨λ‘ +group by msaie1_0.compare_yyyy, + msaie1_0.target_yyyy, + lae1_0.assign_group_id +; + +-- 3. 회차 + 도엽에 κ²€μˆ˜ μ™„λ£Œλœ polygon 쑰회 +select msldge1_0.geo_uid, + cast('Feature' as varchar), + st_asgeojson(msldge1_0.geom), + case + when (msldge1_0.class_after_cd in ('building', 'container')) + then cast('M1' as varchar) + when (msldge1_0.class_after_cd = 'waste') + then cast('M2' as varchar) + else 'M3' + end, + msldge1_0.class_before_cd, + msldge1_0.class_after_cd +from tb_labeling_assignment lae1_0 + left join + tb_map_sheet_learn_data_geom msldge1_0 --라벨링 κ·Έλ¦° polygon μ €μž₯ ν…Œμ΄λΈ” + on lae1_0.inference_geom_uid = msldge1_0.geo_uid +where lae1_0.anal_uid = 52 + and lae1_0.assign_group_id = '34602060' + and lae1_0.inspect_state = 'COMPLETE' + and lae1_0.inspect_stat_dttm < '2026-01-23T00:00+09:00' +; + +--4. 파일 μƒμ„±ν•œ learn_data_geom 에 file_create_yn = true 둜 μ—…λ°μ΄νŠΈ +update tb_map_sheet_learn_data_geom msldge1_0 +set file_create_yn= true, + updated_dttm='2026-01-23T19:27:28.623677700+09:00' +where msldge1_0.geo_uid = 390913 +; From 08a3aeab20b4936376a7bded57715836589519fe Mon Sep 17 00:00:00 2001 From: teddy Date: Fri, 23 Jan 2026 20:34:59 +0900 Subject: [PATCH 2/2] =?UTF-8?q?soptless=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MapSheetMngFileJobController.java | 69 +++++++++++++------ 1 file changed, 47 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/scheduler/MapSheetMngFileJobController.java b/src/main/java/com/kamco/cd/kamcoback/scheduler/MapSheetMngFileJobController.java index c16c9d55..c5d0cebd 100644 --- a/src/main/java/com/kamco/cd/kamcoback/scheduler/MapSheetMngFileJobController.java +++ b/src/main/java/com/kamco/cd/kamcoback/scheduler/MapSheetMngFileJobController.java @@ -13,14 +13,19 @@ public class MapSheetMngFileJobController { private final MapSheetMngFileJobService mapSheetMngFileJobService; // ν˜„μž¬ μƒνƒœ ν™•μΈμš© Getter - @Getter private boolean isSchedulerEnabled = false; - @Getter private boolean isFileSyncSchedulerEnabled = false; - @Getter private int mngSyncPageSize = 20; + @Getter + private boolean isSchedulerEnabled = false; + @Getter + private boolean isFileSyncSchedulerEnabled = false; + @Getter + private int mngSyncPageSize = 20; // νŒŒμΌμ‹±ν¬ μ§„ν–‰μ—¬λΆ€ ν™•μΈν•˜κΈ° @Scheduled(fixedDelay = 1000 * 10) public void checkMngFileSync() { - if (!isSchedulerEnabled) return; + if (!isSchedulerEnabled) { + return; + } Integer mng = 0; // isFileSyncSchedulerEnabled = false; @@ -28,23 +33,25 @@ public class MapSheetMngFileJobController { mng = mapSheetMngFileJobService.checkMngFileSync(); this.isFileSyncSchedulerEnabled = true; System.out.println( - "MngFileSyncJob ON --> mngYyyy : " - + mng - + ", currentTime : " - + System.currentTimeMillis()); + "MngFileSyncJob --> mngYyyy : " + + mng + + ", currentTime : " + + System.currentTimeMillis()); } else { this.isFileSyncSchedulerEnabled = false; System.out.println( - "MngFileSyncJob OFF --> mngYyyy : " - + mng - + ", currentTime : " - + System.currentTimeMillis()); + "MngFileSyncJob --> mngYyyy : " + + mng + + ", currentTime : " + + System.currentTimeMillis()); } } @Scheduled(fixedDelay = 1000 * 10) public void mngFileSyncJob00() { - if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; + if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) { + return; + } System.out.println("mngFileSyncJob 00 Processing currentTime : " + System.currentTimeMillis()); mapSheetMngFileJobService.checkMapSheetFileProcess(0, mngSyncPageSize); @@ -52,7 +59,9 @@ public class MapSheetMngFileJobController { @Scheduled(fixedDelay = 1000 * 5) public void mngFileSyncJob01() { - if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; + if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) { + return; + } System.out.println("mngFileSyncJob 01 Processing currentTime : " + System.currentTimeMillis()); mapSheetMngFileJobService.checkMapSheetFileProcess(1, mngSyncPageSize); @@ -60,7 +69,9 @@ public class MapSheetMngFileJobController { @Scheduled(fixedDelay = 1000 * 5) public void mngFileSyncJob02() { - if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; + if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) { + return; + } System.out.println("mngFileSyncJob 02 Processing currentTime : " + System.currentTimeMillis()); mapSheetMngFileJobService.checkMapSheetFileProcess(2, mngSyncPageSize); @@ -68,7 +79,9 @@ public class MapSheetMngFileJobController { @Scheduled(fixedDelay = 1000 * 5) public void mngFileSyncJob03() { - if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; + if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) { + return; + } System.out.println("mngFileSyncJob 03 Processing currentTime : " + System.currentTimeMillis()); mapSheetMngFileJobService.checkMapSheetFileProcess(3, mngSyncPageSize); @@ -76,7 +89,9 @@ public class MapSheetMngFileJobController { @Scheduled(fixedDelay = 1000 * 5) public void mngFileSyncJob04() { - if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; + if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) { + return; + } System.out.println("mngFileSyncJob 04 Processing currentTime : " + System.currentTimeMillis()); mapSheetMngFileJobService.checkMapSheetFileProcess(4, mngSyncPageSize); @@ -84,7 +99,9 @@ public class MapSheetMngFileJobController { @Scheduled(fixedDelay = 1000 * 5) public void mngFileSyncJob05() { - if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; + if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) { + return; + } System.out.println("mngFileSyncJob 05 Processing currentTime : " + System.currentTimeMillis()); mapSheetMngFileJobService.checkMapSheetFileProcess(5, mngSyncPageSize); @@ -92,7 +109,9 @@ public class MapSheetMngFileJobController { @Scheduled(fixedDelay = 1000 * 5) public void mngFileSyncJob06() { - if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; + if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) { + return; + } System.out.println("mngFileSyncJob 06 Processing currentTime : " + System.currentTimeMillis()); mapSheetMngFileJobService.checkMapSheetFileProcess(6, mngSyncPageSize); @@ -100,7 +119,9 @@ public class MapSheetMngFileJobController { @Scheduled(fixedDelay = 1000 * 5) public void mngFileSyncJob07() { - if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; + if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) { + return; + } System.out.println("mngFileSyncJob 07 Processing currentTime : " + System.currentTimeMillis()); mapSheetMngFileJobService.checkMapSheetFileProcess(7, mngSyncPageSize); @@ -108,7 +129,9 @@ public class MapSheetMngFileJobController { @Scheduled(fixedDelay = 1000 * 5) public void mngFileSyncJob08() { - if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; + if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) { + return; + } System.out.println("mngFileSyncJob 08 Processing currentTime : " + System.currentTimeMillis()); mapSheetMngFileJobService.checkMapSheetFileProcess(8, mngSyncPageSize); @@ -116,7 +139,9 @@ public class MapSheetMngFileJobController { @Scheduled(fixedDelay = 1000 * 5) public void mngFileSyncJob09() { - if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) return; + if (!isSchedulerEnabled || !isFileSyncSchedulerEnabled) { + return; + } System.out.println("mngFileSyncJob 09 Processing currentTime : " + System.currentTimeMillis()); mapSheetMngFileJobService.checkMapSheetFileProcess(9, mngSyncPageSize);