Commit Graph
165 Commits
Author SHA1 Message Date
eomsangdonandClaude Fable 5 12bee4bc82 fix(B05): 세류선 겹침 셀을 판정 맨 앞에서 적색 확정
세류선 위인데 빨강이 아닌 셀이 남던 문제. 원인 3가지를 함께 고쳤다.

1. 사슬의 마지막 셀 누락 — zip(chain, chain[1:]) 이라 각 갈래의 끝 셀이
   세류 셀로 표시되지 않았다. burned[chain] 전체로 바꿨다.
2. 표고 없는 셀 제외 — valid(등고선 TIN 껍질 안) 조건 때문에 껍질 밖
   세류 셀이 새김에서 빠져 회색으로 남았다. 세류선은 확정 자료이므로
   표고 유무를 따지지 않는다.
3. 사슬이 그런 셀로 흘러들면 not valid[following] 에서 파랑으로 판정됐다.
   이미 색이 정해진 셀이면 따라가도록 조건을 풀었다.

판정 순서를 지시대로 바꿨다:
  0. 세류선과 겹치는 셀을 먼저 적색으로 못박는다
  1. 최외곽 셀에서 사슬 추적
  2. 도로/세류 셀에 닿으면 사슬 전체 적색, 못 닿으면 전체 미도달
  3. 이미 색이 정해진 셀을 만나면 그 색을 물려받고 끝
  4. 최외곽에 안 걸린 내부 셀을 따로 출발

표고 없는 세류 셀도 화살표가 나오도록 descent_azimuth 에서 forced 셀을
유효로 인정. 합류 지점 끝 셀을 미연결로 오탐하던 경고도 갈래 공유
횟수로 판정하게 수정.

합성 검증(등고선 범위 밖으로 나가는 지류 포함): 세류 셀 806개 전부
적색·전부 판정·화살표 무효 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 18:57:16 +09:00
eomsangdonandClaude Fable 5 638af3ecc6 feat(B05): 세류망 흐름 새김 + 32방위 화살표 + 확장 루프 분리
1. 세류선 위 셀이 파랑으로 나오던 문제
   원인: 등고선 TIN 보간면은 실제 물골(thalweg)을 재현하지 못해, 세류선 위
   셀인데도 D8이 옆 사면으로 흘려보내 도로에 닿지 못했다.
   조치 (2가지 함께):
   - burn_stream_flow: 확정된 상류 세류망을 따라 격자 흐름 방향을 강제로 새긴다.
     세류망은 이미 도로를 건너 하류로 빠지는 물길로 확정된 자료다.
   - 사슬 추적의 종결 조건에 세류망 셀을 추가. 물이 세류에 합류한 시점에
     도로 도달이 결정된다(사슬 끝이 도로 셀에 정확히 닿지 않아도 된다).
   - StreamSplit.upstream 을 물 흐름 방향(상류->하류)으로 정렬. 방향은
     _spread_network 확산 시 진입 끝점을 기록해 한 번에 정한다.

2. 화살표 8방위 -> 32방위
   descent_azimuth: 지표면 기울기에서 연속 최급강하 방위를 뽑아 32단계로 양자화.
   D8은 연결(도로 도달 판정)에만 쓰고 표시는 실제 지형 방위를 따른다.
   세류망 새김 셀은 확정된 물길 방향을 그대로 쓴다.
   응답 바이트: 하위 6비트=32방위(32=제자리, 33=표고없음), 0x80=도로 도달.

3. 확장 루프 분리
   Basin._solve_grid 안에 있던 루프를 Flow.expand_until_closed 로 분리.
   단계 검증 미리보기는 이 경로를 타지 않는다.

4. 도로 미도달 셀 화살표를 백색으로 변경(파랑 채움 + 백색 화살표).

합성 검증: 세류 새김 389셀 전부 도로 도달, 32방위 전부 등장,
지류가 본류 중간에 합류하는 갈래를 미연결로 오탐하던 경고 제거.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 18:50:21 +09:00
eomsangdonandClaude Fable 5 06f2328b55 feat(B05): 셀별 흐름 방향 판정 + 화살표/적청 표기 (확장 미포함)
최외곽 셀부터 물길을 따라가며 도로 도달 여부를 판정하고 화면에 셀 단위로
표기한다. 격자 확장은 다음 검증 단계라 넣지 않았다.

- classify_flow: 최외곽 셀에서 출발해 D8 수신 셀을 한 칸씩 따라가고, 경로가
  끝나면 결과를 경로 전체에 되돌려 적는다. 한 번 판정한 셀은 재분석하지 않고
  다른 경로가 만나면 즉시 결론을 가져온다. 최외곽으로 안 닿은 내부 셀은 그다음에
  따로 출발시킨다. 합성 검증 165,874셀 0.5s.
- outermost_cells: 해석 영역 밖에 8이웃이 닿는 셀 = 최외곽.
- build_terrain_grid(domain=): 1차 영역 셀 마스크 안쪽만 해석 대상으로 삼는다.
- direction_codes: 수신 셀 인덱스를 3x3 방향 코드로. 화살표 렌더용.
- 응답은 셀당 1바이트 base64 (하위4비트=방향, 15=표고없음, 0x80=도로도달).
  197,623셀 -> 257KB.
- 프론트: 셀마다 화살표. 도로 도달 적색, 미도달 파랑, 표고없음 회색.
  셀이 7px 미만이면 채움색만 남긴다. 격자선을 흰색으로 변경.
- 저장: 02_flow_direction.npz (direction/reaches_road/analyzed) + manifest

합성 검증(능선 y=200, 도로 y=500): 도달 셀 y 200~502, 미도달 y 150~600.
능선 남쪽과 도로 아래가 정확히 제외됨.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 18:23:35 +09:00
eomsangdonandClaude Fable 5 683a5c9198 feat(B05): 격자를 1차 영역 안에만 생성, 원점을 도로 시작점에 고정
bbox 사각형만 그리던 것을 실제 셀 생성으로 바꾼다.

- 격자 원점을 도로 시작점에 맞춘다(grid_spec_from_bounds anchor_xy).
  bbox 좌상단 기준이면 1차 영역이 조금만 달라져도 격자가 통째로 밀려
  이전 결과와 셀이 대응되지 않는다.
- build_cell_mask: 1차 영역에 조금이라도 걸치는 셀만 생성(all_touched).
  합성 검증에서 bbox 360,000셀 중 197,623셀(55%)만 생성.
- mask_row_spans: 셀을 행별 연속 구간으로 압축해 응답에 싣는다.
  낱개 대비 0.23% 크기(451구간 vs 197,623셀).
- expand_grid_spec 을 셀 정수배 확장으로 바꿔 확장해도 격자점이 유지된다.
- grid_transform 을 Flow -> Grid 로 옮겨 중복 제거.
- 프론트: bbox 전체 눈금 대신 생성된 셀만 흐린 선으로. 셀이 2px 미만이면
  구간을 통짜로 흐리게 칠하고 확대하면 셀 하나하나가 보인다.
- 저장: 01_primary_region_cells.npz 에 격자 규격 + 셀 마스크 기록
  (셀 수십만 개라 GeoJSON 폴리곤으로는 못 남긴다)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 18:05:58 +09:00
eomsangdonandClaude Fable 5 a77ee317a5 refactor(B05): 세류망·1차영역을 Watershed_Stream 모듈로 분리 (700줄 제한)
Grid.py 가 708줄로 제한을 넘어 관심사 단위로 갈랐다.

- Watershed_Stream.py (292줄): 세류망 노딩·도로 절단·연결망 확산,
  ElevationSampler, PrimaryRegion, build_primary_region
- Watershed_Grid.py (427줄): 등고선 구름, 격자 규격, TIN 보간,
  웅덩이 채움, 평탄면 해소, D8
- _iter_linestrings -> iter_linestrings, _spec_from_bounds ->
  grid_spec_from_bounds 로 공개(모듈 간 재사용). 의존 방향은 Stream -> Grid 단방향.
- 죽은 코드 제거: select_upstream_streams, _point_elevation

회귀 확인: 합성 유역 179,919㎡ 동일, 연결망 판정 동일.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 17:57:13 +09:00
eomsangdonandClaude Fable 5 578ada6d84 feat(B05): 1차 영역 반경 100m + 노선 버퍼 복귀, 단계별 산출물 저장 모듈 분리
- DRAINAGE_INITIAL_RADIUS_M 50m -> 100m
- 1차 영역 = 상류 세류망 buffer(100m) UNION 계획 노선 buffer(100m).
  세류망 선정이 정확해져 노선 버퍼를 다시 넣어도 영역이 폭발하지 않는다.
- 저장을 B05_wf2_Route_Engine_Watershed_Export.py 로 분리.
  STAGES 딕셔너리에 단계 이름을 추가하고 write_stage 를 부르면
  drainage/{번호}_{단계}.geojson + manifest.json 이 함께 갱신된다.
  앞으로 기능을 붙일 때마다 이 자리에 단계가 하나씩 쌓인다.
- primary_region 단계에 route 레이어 추가(도로 대조용).
- 라우터의 임시 GeoJSON 작성 코드 제거.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 17:53:43 +09:00
eomsangdonandClaude Fable 5 e1b410c391 feat(B05): 1차 배수유역을 상류 세류망 기준으로 재정의 + 단계 검증 화면
1차 영역이 도로 전체 버퍼까지 포함해 도로 아래(하류)로 퍼지고, 세류선을 피처
단위로만 갈라 상류망이 통째로 누락되던 문제를 고친다.

- 1차 영역 = 도로 교차점 상류로 이어진 세류망만 반경 버퍼. 노선은 버퍼하지 않음.
  노선이 영역 밖으로 나간 길이(road_outside_m)를 재서 반경 판단 근거로 노출.
- 상류 판정을 연결망 기준으로 교체: unary_union 노딩 -> 도로에서 절단 ->
  끝점 그래프 -> 도로 교차 노드를 통과하지 않는 확산. T자로 붙은 지류와
  2단계 이상 이어진 지류까지 상류망으로 따라간다.
- 상하류 판정 표고를 최근접 등고선 정점에서 TIN 선형보간으로 교체
  (ElevationSampler). 최근접 정점은 오차가 등고선 간격만큼 나서 계곡 교차점이
  한 등고선 위로 잡히고 상류 조각이 전부 하류로 오판됐다.
- 격자 크기 자동 강등 삭제 - config 값을 그대로 쓴다. 셀 수가 많으면 경고만.
  자동 강등이 도로 굽기 두께 전제를 조용히 깨뜨렸다.
- TIN 삼각망을 격자 범위 + 여유로 클리핑. 결과 동일, 속도만 개선.
- 기본 반경 300m -> 50m (단계 검증용).

단계 검증 수단
- GET /drainage/primary-region : TIN/흐름 계산 없이 상류망/하류망/1차영역/격자만 반환
- 프론트 1차영역 버튼 : 상류망(굵은 파랑), 하류망(회색 파선), 1차 영역(초록 채움),
  해석 격자를 실제 셀 눈금으로 렌더. 켤 때마다 재요청한다.
- 클릭 시 storage/{project}/B05_wf2_Route/drainage/primary_region.geojson 저장

합성 검증(T자 지류 + 2단계 지류 + 하류 지류 + 고아 세류):
상류망 4조각 채택 / 하류망 3조각 / 미연결 1개 제외 - 전부 기대대로.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 17:44:53 +09:00
eomsangdonandClaude Fable 5 c1f139527d feat(B05): 배수유역을 격자 흐름 해석으로 전면 재설계
등고선 아크 추적 + 능선 행진 방식이 능선/계곡을 안정적으로 분리하지 못해
D8 물 방향 + 도로 기준 상류 추적 방식으로 교체한다.

- 능선을 따로 탐지하지 않는다. 물길을 따라가 도로에 닿는 셀만 유역이고,
  그 경계가 곧 능선이다. 유역 내부 봉우리는 자동으로 포함된다.
- 등고선 TIN 보간 후 웅덩이 채움(형태학적 재구성) + 평탄면 미세경사로
  가짜 웅덩이/평탄 삼각형에서 흐름이 끊기는 문제를 없앤다.
- 상류 추적은 포인터 더블링으로 전 셀을 한 번에 푼다. 셀의 흐름 종착
  도로 셀(root)이 유역 판정·흐름 강도·세부유역 라벨의 공통 근거가 되어,
  관을 옮겨도 격자 해석 없이 측구 라우팅만 다시 돌면 된다(.npz 캐시).
- 활성 셀이 격자 최외곽에 닿은 방향으로만 확장하고, 경계 링이 전부
  비활성이 되면(띠 폐합) 멈춘다.

변경 사항
- 신규 엔진 3종: Engine_Watershed_Grid / _Flow / _Basin
- 폐기 엔진 4종은 _legacy_watershed/ 로 원본 보관(ruff 제외)
- config_system.py §5-3-1 에 DRAINAGE_* 파라미터 18개 (격자 1m, 반경 300m)
- 표고점 데이터 사용 중단(유효 데이터 부족), 프론트 능선 토글 제거
  (전체 유역 외곽선과 같은 선이므로 중복)
- 응답에 main_polygon_lonlat / strength_profile 추가, 계획선 위 흐름 강도 표기

합성 지형 검증: 유역 179,919㎡ vs 이론 180,000㎡ (오차 0.04%),
능선 자동 검출, 확장 3회 후 자동 정지, 캐시 재사용 1.2s -> 0.1s

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 16:51:47 +09:00
eomsangdon 9c8a2f2b17 ㅇㅈ 2026-07-30 18:03:35 +09:00
eomsangdon 12f1666506 auto: 2026-07-30 17:25 (EOMSANGDON-HOME) 2026-07-30 17:25:13 +09:00
eomsangdon f72017a6ee auto: 2026-07-29 20:06 (EOMSANGDON-HOME) 2026-07-29 20:06:57 +09:00
eomsangdon 4fbaf63a60 auto: 2026-07-29 20:00 (EOMSANGDON-HOME) 2026-07-29 20:00:50 +09:00
eomsangdon 077da60065 auto: 2026-07-29 19:41 (EOMSANGDON-HOME) 2026-07-29 19:41:58 +09:00
eomsangdon 5354e72258 auto: 2026-07-29 19:31 (EOMSANGDON-HOME) 2026-07-29 19:31:38 +09:00
eomsangdon d5ba1f1eb5 auto: 2026-07-29 19:23 (EOMSANGDON-HOME) 2026-07-29 19:23:04 +09:00
eomsangdon afa04d8c23 auto: 2026-07-29 19:13 (EOMSANGDON-HOME) 2026-07-29 19:13:27 +09:00
eomsangdon 07cc96ea37 auto: 2026-07-29 18:44 (EOMSANGDON-HOME) 2026-07-29 18:44:53 +09:00
eomsangdon 067de3a25f auto: 2026-07-29 18:40 (EOMSANGDON-HOME) 2026-07-29 18:40:45 +09:00
eomsangdon 368764190f auto: 2026-07-29 18:23 (EOMSANGDON-HOME) 2026-07-29 18:23:23 +09:00
eomsangdon 8b853e8dec auto: 2026-07-29 18:07 (EOMSANGDON-HOME) 2026-07-29 18:07:39 +09:00
eomsangdon 121d20ef80 auto: 2026-07-28 20:03 (EOMSANGDON-HOME) 2026-07-28 20:03:32 +09:00
eomsangdon cb35e8c1cf auto: 2026-07-28 19:53 (EOMSANGDON-HOME) 2026-07-28 19:53:22 +09:00
eomsangdon fa5e08c2ce auto: 2026-07-28 19:36 (EOMSANGDON-HOME) 2026-07-28 19:36:27 +09:00
eomsangdon 7f5c0ab069 auto: 2026-07-28 19:32 (EOMSANGDON-HOME) 2026-07-28 19:32:17 +09:00
eomsangdon 7a7cd217b6 auto: 2026-07-28 19:23 (EOMSANGDON-HOME) 2026-07-28 19:23:57 +09:00
eomsangdon 294151f862 auto: 2026-07-28 19:19 (EOMSANGDON-HOME) 2026-07-28 19:19:31 +09:00
eomsangdon 86d27add43 auto: 2026-07-28 18:33 (EOMSANGDON-HOME) 2026-07-28 18:33:47 +09:00
eomsangdon 0c51aef49e auto: 2026-07-28 18:28 (EOMSANGDON-HOME) 2026-07-28 18:28:02 +09:00
eomsangdon 5ee3b7e2cb auto: 2026-07-28 18:25 (EOMSANGDON-HOME) 2026-07-28 18:25:58 +09:00
eomsangdon 5e545d2b14 auto: 2026-07-28 18:19 (EOMSANGDON-HOME) 2026-07-28 18:19:57 +09:00
eomsangdon b55d10ddd6 auto: 2026-07-28 18:13 (EOMSANGDON-HOME) 2026-07-28 18:13:07 +09:00
eomsangdon 14724f4154 auto: 2026-07-28 18:07 (EOMSANGDON-HOME) 2026-07-28 18:07:38 +09:00
eomsangdon eb5bdfebad auto: 2026-07-26 20:54 (ESD_LAPTOP) 2026-07-26 20:54:20 +09:00
eomsangdon 99babfacaf auto: 2026-07-26 20:41 (ESD_LAPTOP) 2026-07-26 20:41:48 +09:00
eomsangdon 9ac4612641 merge: feature/B06-종횡단-기초-설계 → main (B06 종횡단 확정·B07 상세설계 PoC·A1 도각 템플릿 적용) 2026-07-26 20:32:12 +09:00
eomsangdon 03096791bf auto: 2026-07-26 20:05 (ESD_LAPTOP) 2026-07-26 20:05:58 +09:00
eomsangdon 7f2eec20fd auto: 2026-07-26 19:36 (ESD_LAPTOP) 2026-07-26 19:36:21 +09:00
eomsangdon d252c4e78a auto: 2026-07-26 19:29 (ESD_LAPTOP) 2026-07-26 19:29:27 +09:00
eomsangdon 721679fe5e auto: 2026-07-26 19:29 (ESD_LAPTOP) 2026-07-26 19:29:06 +09:00
eomsangdon 1a89a468d1 auto: 2026-07-26 19:16 (ESD_LAPTOP) 2026-07-26 19:16:57 +09:00
eomsangdon 2a7f11c102 auto: 2026-07-26 19:14 (ESD_LAPTOP) 2026-07-26 19:14:19 +09:00
eomsangdon e064f88856 auto: 2026-07-26 18:58 (ESD_LAPTOP) 2026-07-26 18:58:48 +09:00
eomsangdon 54ece3f1cb auto: 2026-07-26 18:55 (ESD_LAPTOP) 2026-07-26 18:55:42 +09:00
eomsangdon b70a3b4bd8 auto: 2026-07-26 18:47 (ESD_LAPTOP) 2026-07-26 18:47:46 +09:00
eomsangdon d38e9fbdf2 auto: 2026-07-26 18:44 (ESD_LAPTOP) 2026-07-26 18:44:14 +09:00
eomsangdon 58085a09a0 auto: 2026-07-26 18:33 (ESD_LAPTOP) 2026-07-26 18:33:28 +09:00
eomsangdon 0e590037ad auto: 2026-07-26 18:32 (ESD_LAPTOP) 2026-07-26 18:32:37 +09:00
eomsangdon 780be57651 auto: 2026-07-26 18:19 (ESD_LAPTOP) 2026-07-26 18:19:57 +09:00
eomsangdon 2e208aab71 auto: 2026-07-26 18:19 (ESD_LAPTOP) 2026-07-26 18:19:40 +09:00
eomsangdon 9c87fb03c3 auto: 2026-07-26 18:15 (ESD_LAPTOP) 2026-07-26 18:15:15 +09:00