# PLAN: B04 상세페이지·옵션 패널 재구성 (2026-07-17) ## 배경·목표 - B04(WF1 지표면) 프론트엔드에 불명 정보 그룹이 표시되고, 옵션 패널과 상세 영역 간 중복 구현·미작동 기능이 존재. - 백엔드는 업로드 시 자동 분석(`trigger_wf1_analysis_and_email`, `B03_FileInput_Router.py:147`)으로 **지면 필터 3종(grid_min_z/csf/pmf) × 표현 기법 5종(tin/dtm/nurbs/implicit/meshfree) = 15개 지표면 모델**을 영구저장소+DB에 저장한다(`config_system.py:99-104`). RANSAC은 사전계산 대상이 아니며 요청 시 허용 필터로만 존재(`B04_wf1_Surface_Schema.py:12`). **B04는 "선택 → 저장된 결과 표시 → 확정" 화면으로 재구성**한다. - 이 작업은 기존 백로그 "B04 자동화 개편"의 프론트엔드 부분을 구체화한 것임. ## 작업 범위 (대상 파일) | 파일 | 작업 | |---|---| | `B04_wf1_Surface/B04_wf1_Surface_UI_Page.ts` | 그룹 삭제, 옵션 패널 재정의, 버튼 교체, 2열 배치 조립 (중심 파일) | | `B04_wf1_Surface/B04_wf1_Surface_UI_Viewer.ts` | 배경지도/국가GIS 표시 제거, 카메라 동기화 인터페이스 | | `B04_wf1_Surface/B04_wf1_Surface_UI_TerrainViewer.ts` | 하단 선택그룹 제거, 카메라 동기화 인터페이스 | | `B04_wf1_Surface/B04_wf1_Surface_UI_MapViewer.ts` | 기본값 위성/지적도, 탑뷰 정합(대각선 현상 확인·수정) | | `B04_wf1_Surface/B04_wf1_Surface_UI_Style.css` | 2열 레이아웃, 제목 제거·최대 폭 | | `B04_wf1_Surface/B04_wf1_Surface_Api_Fetch.ts` | 표시 포인트 수 상한 50만 대응 | | `B04_wf1_Surface/B04_wf1_Surface_Router.py` | `POINT_CLOUD_SAMPLE_LIMIT` 100_000 → 500_000 (51줄, 1줄 수정) | ## 스펙 ### 1. 삭제 항목 (프론트 표시만 제거, 백엔드 API는 유지) - "지면 필터 통계" 그룹 삭제 (`fetchSurfaceGroundStats` 호출·표시 제거) - "생성된 지표면 모델" 그룹(모델 카드 목록) 삭제 — 확정 UX는 아래 버튼으로 이동 ### 2. 좌측 사용자 옵션 패널 재정의 - **입력 포인트 클라우드 그룹** - 드롭다운: 입력 LAS 파일 선택 유지. "#XX 선택" 라벨의 실체 확인 후 의미 있는 라벨로 정리 - 파일명 항목 제거 - 표시 정보: 좌표계 / 크기(LAS 원본 전체 파일 크기) / 포인트 수 / 프론트엔드 표시 포인트 수 / 높이 범위(min~max 값) - **지면 필터 선택 그룹**: 사전계산된 필터 3종(grid_min_z/csf/pmf)만 노출, 선택 시 영구저장된 결과를 즉시 뷰어에 로드, "표시 옵션" 그룹 설정에 따라 렌더 - **RANSAC은 드롭다운에서 제거** (`UI_Page.ts:54`의 `SOURCE_FILTERS`에서 `ransac` 삭제). 업로드 자동 분석에 미포함이라 저장 데이터가 없음. 백엔드 RANSAC 엔진·화이트리스트는 유지 - 표시 포인트 규칙: 지면 필터 후 포인트가 **50만 개 초과 시 랜덤 50만 개**, 이하면 **전체** 표시 (`POINT_CLOUD_SAMPLE_LIMIT` 100_000 → 500_000, 기존 샘플링 로직 재사용 `Router.py:343-348`) - 밀도 100% = 위 규칙으로 로드된 지면 필터 직후 데이터 기준 - **지표면 표현 선택 그룹**: 모델(TIN/DTM/NURBS/implicit/meshfree) 선택 시 영구저장된 모델을 즉시 뷰어에 로드 - **서피스 / 스무딩 / 등고선 / 등고선 간격**: 모델 비교 영역 하단에서 옵션 패널로 이동 (기존 컨트롤 재사용) - **뷰어 시점 제어 그룹**: 포인트클라우드 미리보기 + 5종 모델 비교 두 뷰어에 공통 적용 - **버튼 교체** - "지표면 분석 실행" → **"모델 확정"**: 현재 선택된 (지면 필터 + 지표면 표현) 조합에 해당하는 `surface_models.id`를 `POST .../surface/confirm`으로 전송. 확정 성공 시 기존 토스트·WF2 이동 활성화 유지 - "목록 새로고침" → **"초기화"**: 옵션 그룹 기본값 복원 + 목록 재조회 ### 3. 3D 뷰어 영역 (상세 영역) - 포인트클라우드 미리보기 ↔ 지면 필터별 5종 지표면 모델 비교를 **2열 배치** - 제목 제거, 가용 폭 최대 사용 - **카메라 동기화**: 어느 쪽을 마우스로 조작해도 두 뷰어 동일 시점 유지 - 미리보기의 배경지도·국가GIS 표시 제거 (백엔드 fetch 함수 `getVWorldMapUrl`/`fetchVWorldMeta`/`fetchGisGeoJson`은 유지 — 하단 2D 지도가 사용) - 5종 모델 비교 하단의 선택 그룹들 삭제 (서피스/스무딩/등고선/간격은 옵션 패널로 이관) ### 4. 하단 2D 배경지도·GIS 레이어 그룹 - 현행 유지하되 기본값: 배경지도=**위성(Satellite)**, GIS 레이어=**지적도** - 완전한 탑뷰(정사) 정합으로 표시 — 사용자가 보고한 "살짝 대각선" 현상의 원인(투영/오프셋/착시)을 코드에서 확인 후 수정. 표시 옵션 그룹과는 별개 항목 ### 5. 공통 원칙 - `ui_templates`(createWorkflowLayout, 폼 그룹 템플릿 등) 최대 재활용, 신규 템플릿 남발 금지 - Surgical Edit, 700줄 제한(UI_Page.ts 증가 시 기능별 분리), 완료 후 `prettier` 실행 ## 구현 체크리스트 - [x] 1. UI_Page: "지면 필터 통계" 그룹 및 관련 호출 제거 - [x] 2. UI_Page: "생성된 지표면 모델" 그룹(모델 카드) 제거 - [x] 3. UI_Page: 입력 포인트 클라우드 그룹 재정의 (드롭다운 라벨 정리, 파일명 제거, 좌표계/크기/포인트 수/표시 포인트 수/높이 범위 표시) - [x] 4. Router: `POINT_CLOUD_SAMPLE_LIMIT` 500_000으로 변경 (50만 초과 시 랜덤 50만, 이하 전체) - [x] 5. UI_Page: 지면 필터 선택 → 즉시 로드·표시 옵션 연동 렌더, `SOURCE_FILTERS`에서 `ransac` 제거 - [x] 6. UI_Page: 지표면 표현 선택 → 즉시 모델 로드 렌더 - [x] 7. UI_Page/TerrainViewer: 서피스·스무딩·등고선·등고선 간격 컨트롤을 옵션 패널로 이관, 비교 영역 하단 선택그룹 삭제 - [x] 8. Viewer/TerrainViewer: 뷰어 시점 제어 공통 적용 + 양방향 카메라 동기화 - [x] 9. UI_Page/Style.css: 2열 배치, 제목 제거, 최대 폭 - [x] 10. Viewer: 미리보기 배경지도·국가GIS 표시 제거 (fetch 함수 유지) - [x] 11. UI_Page: 버튼 교체 — "모델 확정"(confirm 연동), "초기화"(기본값 복원+재조회) - [x] 12. MapViewer: 기본값 위성/지적도, 대각선 현상 확인·탑뷰 정합 - [x] 13. prettier 적용, 700줄 제한 점검 ## 리스크·확인 사항 - **확정 매핑 확인됨**: 영구저장 모델은 3필터 × 5기법 = 15개 조합(`config_system.py:99-104`). 확정 버튼 = 선택된 (필터, 기법) 조합의 `surface_models.id`를 confirm API로 전송 - **표시 샘플링과 백엔드 분석 분리 확인됨**: 50만 샘플링은 미리보기 응답(`GET .../surface/point-cloud`)에만 적용. 경로(B05)·등고선 분석은 영구저장소의 전체 필터링 데이터 기준 — 검증 단계에서 재확인 - **RANSAC 처리 확정됨**: 업로드 자동 분석(`B03_FileInput_Router.py:164-165`)은 3종 필터만 실행 → RANSAC 저장 데이터 없음. 프론트 드롭다운에서 제거(현재 노출 중 = 미작동 항목), 백엔드 기능은 유지 - **"#XX 선택" 드롭다운 실체**: 코드 확인 후 라벨 정리 (구현 단계)