Files
Aislo/docs/raw/plans/2026-07-17_plan_B04_contour.md
T
eomsangdonandClaude Opus 5 eb30b774f8 chore(docs): docs 폴더 git 추적 전환 · PLAN·OWNERS 최상위 이관
- `docs/` 를 .gitignore 에서 빼 git 추적 대상으로 전환 (위키·완료 이력·검증 기록)
- `docs/raw/PLAN.md` · `docs/raw/OWNERS.md` 를 저장소 최상위로 이동 후 .gitignore 에 등록
  — 창끼리 공유하되 저장소에는 안 올리는 장부
- 살아 있는 경로 참조 7개 파일 정정 (아카이브 107건은 그때 사실이라 그대로 둠)
- graphify 날짜별 산출물(`docs/wiki/graphify-out/20*/`) 제외 — `graphify update` 가 다시 만듦

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 18:19:07 +09:00

4.5 KiB

PLAN ARCHIVE: B04 등고선 — 기본값(CSF+DTM) 외 조합에서 표시 안 됨 (2026-07-17)

활성 작업: B04 등고선 — 기본값(CSF+DTM) 외 조합에서 표시 안 됨 (2026-07-17)

증상

좌측 옵션에서 지면 필터(csf/pmf/grid_min_z) 또는 지표면 표현(tin/dtm/nurbs/implicit/meshfree)을 기본값(csf+dtm)에서 바꾸면 3D 뷰어에 등고선이 나타나지 않음.

원인 분석 (실 저장소 storage/.../B04_wf1_Surface/models/ 캐시 파일 실증 확인)

# 원인 근거 위치
1 간격 기본값 불일치 (핵심): 파이프라인 사전 캐시는 contour_interval_meters=5.0m로만 생성, 프론트 기본 간격은 1.0m → 캐시 파일명(contour_{filter}_{method}_{interval}m.json) 불일치로 항상 캐시 미스 → 모든 조합이 첫 조회 시 온디맨드 재계산 B04_wf1_Surface_Engine_Pipeline.py:57, B04_wf1_Surface_UI_TerrainViewer.ts:78, B04_wf1_Surface_Router.py:616-618
2 온디맨드 계산은 실제로 동작하나 13~23초+ 소요, 그동안 UI 무피드백: 오늘(07-17 18:06~18:14) 사용자 조작 시각에 contour_pmf_dtm_smooth_1.0m.json 등이 실제 생성됨 = 계산은 됨. 그러나 자동 로드 경로는 void loadContourLines(...)로 결과·진행을 무시 → 상태표시는 "표시 중"에 머물고, 사용자는 "계산 안 함"으로 인지 B04_wf1_Surface_UI_TerrainViewer.ts:344,366
3 실패 침묵 2중: (a) 파이프라인 사전 캐시 실패를 except: pass로 은폐 — 실제로 contour_csf_nurbs_*.json은 어떤 간격으로도 존재하지 않음(manifest는 nurbs csf "completed") (b) 프론트 loadContourLines 실패 시 catch → return false만 하고 사용자에게 알리지 않음 B04_wf1_Surface_Engine_Pipeline.py:272-273, B04_wf1_Surface_UI_TerrainViewer.ts:483-486
4 무거운 표현의 1.0m 온디맨드 과부하: nurbs(전 필터)·meshfree(전 필터)·비스무딩 tin 등은 1.0m 격자 온디맨드 산출물이 하나도 없음 — RBF/griddata/Delaunay를 1m 격자로 돌려 수십 초~수 분 소요 또는 실패 추정. Router는 target_grid_m=1.0 고정 B04_wf1_Surface_Router.py:648-655
5 (부수) 응답 경합 가드 없음: 선택을 빠르게 바꾸면 이전 모델의 등고선 응답이 늦게 도착해 새 화면에 그려질 수 있음 B04_wf1_Surface_UI_TerrainViewer.ts:379-388
6 (부수) 파이프라인 캐시 재사용 분기(continue)는 등고선 사전 캐시 존재를 보증하지 않음 → 재분석 시에도 누락 캐시가 복구되지 않음 B04_wf1_Surface_Engine_Pipeline.py:199-218

수정 방향 및 구현 체크리스트

  • C1. 간격 기본값 정합: 프론트 등고선 간격 기본값을 사전 캐시 간격(5.0m)과 일치시킴 (intervalInput.value = "5.0" + resetOptions() 동일 수정). 사용자가 간격을 바꾸면 그때만 온디맨드 계산. — B04_wf1_Surface_UI_TerrainViewer.ts
  • C2. 등고선 로딩 피드백: 자동 로드 경로에서도 statusSpan에 "등고선 계산 중..." 표시, 완료/실패 시 결과 반영 (void 제거하고 결과 사용). — B04_wf1_Surface_UI_TerrainViewer.ts
  • C3. 실패 침묵 제거: 파이프라인 except: passlogger.warning(...)로 교체(빌드 무효화는 여전히 안 함). 프론트 실패 시 상태 문구 표시. — B04_wf1_Surface_Engine_Pipeline.py, ..._UI_TerrainViewer.ts
  • C4. csf+nurbs 등고선 실패 원인 재현·수정: extract_contours(nurbs_csf.npz, "bspline_surface", ...)를 venv로 직접 실행해 예외 확인 후 수정 (RectBivariateSpline 파라미터 추정). — B04_wf1_Surface_Engine_Contour.py
  • C5. 온디맨드 격자 해상도 적응화: Router 고정 target_grid_m=1.0 → 모델 범위 기반 적응(예: 격자 셀 수 상한 도입)으로 무거운 표현의 계산 시간 상한 확보. — B04_wf1_Surface_Router.py
  • C6. 응답 경합 가드: loadContourLines 응답 도착 시 currentModelId·간격이 요청 시점과 같을 때만 그리기. — B04_wf1_Surface_UI_TerrainViewer.ts
  • C7. 캐시 재사용 분기에서 등고선 캐시 보증: _cache_is_valid 통과(continue) 시에도 기본 간격 등고선 파일 부재면 _cache_contours 호출. — B04_wf1_Surface_Engine_Pipeline.py

검증 기준

  • 15개 전 조합(3필터×5표현, 스무딩 on/off 포함)에서 등고선 표시 또는 명시적 실패 메시지 확인
  • contour_csf_nurbs_5.0m.json 생성 확인
  • 계산 중 상태 문구 노출 확인