사천안길 — 사천강 범람 대피 안내
침수 위험이 높은 길을 피해 도는 경로와, 그 대피소에 자리가 있는지까지 함께 답합니다
NaDa· 게스트2026년 8월 29일조회 0
story · how it was built
설명
무엇을 (문제·대상)
2026년 8월 사천에 사흘간 458mm의 비가 왔을 때 문제는 비가 온 것이 아니라, 어느 길이 잠기는지 계산해 주는 시스템이 없었다는 점이었습니다. 사천안길은 사천시 전역(14개 읍면동 · 주민등록 107,838명)을 대상으로 「어디로, 어느 길로 가야 하는가」에 답합니다.
기존 대피 안내와 다른 점은 세 가지입니다. 경로는 최단거리가 아니라 최소위험경로이고, 대상은 단일 기준이 아니라 4종이며, 대피소는 거리순이 아니라 정원 압력까지 봅니다.
주요 기능
- 최소위험경로 — 통행시간 × (1 + λ × 침수위험) + 통제 페널티로 계산합니다.
- 대상별 4종 — 차량 · 성인도보 · 고령자 · 휠체어. λ 는 4~9 범위이고 이동상한·경사상한이 각각 다릅니다.
- 정원 압력 — 인근 인구를 최근접 배정해 기대 수요를 내고, 거리와 함께 보여 줍니다.
- 근거 배지 — 레이어마다 출처·산출방식을 붙였습니다. 화면의 모든 숫자에 실측·추정·시뮬레이션 배지가 따라다닙니다.
- 자체검증 공개 — /verify 에 26건 전수 공개(통과 23 · 실패 0 · 참고 3).
어떻게 만들었는가 (과정·도구 활용)
충북안길에서 만든 엔진을 사천강 수계로 옮긴 두 번째 지역입니다. 파이프라인은 Python(WAMIS · OSM · 행안부 · DEM · 격자인구 · 용역자료), 앱은 Next.js 16입니다.
가장 조심한 부분은 기준수위였습니다. 사천강에는 공표된 홍수특보 기준수위가 없습니다. 그래서 관측 이력 백분위로 잠정치를 냈고, 그 값이 나오는 자리마다 「추정」으로 표시했습니다. 없는 근거를 있는 것처럼 만들지 않는 것이 이 프로젝트의 기본 규칙입니다.
구조·실행 (짧게)
data-pipeline/ (Python 수집·정제) → app/data/runtime/ (graph.bin · shelters.json · shelter_demand.json) → app/ (Next.js 16, Vercel rootDirectory). 검증 스크립트는 app/scripts/ 에 있고 verify · qa_full 로 한 번에 돕니다.
한계·다음
- 시제품입니다. 공식 대피 안내가 아닙니다.
- 기준수위가 잠정치라 경보 단계 자체가 추정입니다. 공표 기준이 생기면 그 값으로 대체해야 합니다.
- 사천시 전역에서 동작하고, 경남 남해안 권역으로 넓히는 것이 다음 목표입니다.
journey · lessons
과정 · 배운 점
본문 = 무엇·기능·사용법. 여기 = 시간순 여정 + 다음에 남긴 교훈.
같은 엔진을 다른 지역으로 옮길 때 진짜로 옮겨야 하는 것은 코드가 아니라 상수와 산출물, 그리고 검증 스크립트입니다. 문자열만 바꾸면 화면은 새 지역인데 계산은 옛 지역인 상태가 됩니다. 이 함정은 다음 이식(거제)에서 그대로 다시 나왔고, 그때는 전 페이지 전수 점검으로 잡았습니다.
공표 기준이 없는 하천에서 「기준수위」를 만들어 쓸 때는, 그 값이 화면에 나오는 모든 자리에 추정 표시가 따라붙는지를 코드가 아니라 화면에서 확인해야 합니다.
피드백 원함 · 개선 제안 · 질문 · 스택·도구 조언