프로젝트 소개

Floodcast-Gurugram은 인도 Gurugram(Gurgaon)을 위한 시빅 테크(civic-tech) 홍수 예측 웹 앱입니다. 이 앱은 일반적인 날씨 앱이나 침수 위험 지역 목록이 답해주지 못하는 구체적인 질문, 즉 실시간 강우량 예측을 바탕으로 특정 경로가 향후 몇 시간 내에 침수될지, 정확히 언제 침수가 시작되고 언제 해소되는지를 답하기 위해 존재합니다. 단순한 위험 점수 대신, 모든 판정에 시간 창(time window)을 함께 제공합니다. 주요 기능 - 시간 창 기반 위험도: 실시간 시간당 강우량을 등록된 73개 침수 지점과 비교하여, IMD 스타일의 경고 밴드와 명시적인 시작 및 해소 시간을 사용하여 침수 및 해소 시점을 계산합니다. - 경로 판정: 두 지점의 이름을 분석하여 그 사이의 직선 거리 1.5km 버퍼 내에 있는 핫스팟을 찾습니다. 앱은 가장 위험한 지점과 시간대를 보고합니다. - 시간별 타임라인: 사용자는 예측치를 앞으로 밀어보며 해당 시간의 지도, 판정 결과 및 레지스터 내용을 확인할 수 있습니다. - 강우 시뮬레이터: Gurugram은 연중 대부분 건조하므로, 사용자가 시간당 20, 35 또는 55mm의 강우량을 설정하여 실시간 판정과 동일한 엔진을 통해 레지스터가 어떻게 반응하는지 확인할 수 있습니다. - 시민 제보: 카메라 사진, 정확도가 포함된 GPS 좌표, 관찰된 수심을 제출합니다. 제보는 먼저 기기에 저장되며, 공개 전 검토 과정을 거칩니다. - CPCB National AQI: 벤더의 1-5 지수 대신 24시간 오염물질 평균으로 계산된 인도 표준 0-500 척도를 제공합니다. 데이터 출처는 제품의 핵심 기능으로 다뤄집니다. 등록된 73개 지점 중 39개는 출처가 명확합니다. 4개는 MCG의 Zone 1 핫스팟 목록, 26개는 2022~2025년 사이의 두 개 이상의 독립적인 뉴스 보고서, 9개는 이번 몬순 시즌의 기록된 기관 자료에서 가져왔습니다. 나머지 24개는 가능성이 있지만 확인되지 않은 감시 목록 항목이며, 10개는 MCG의 공식 36개 지점 수를 유지하기 위한 재구성된 플레이스홀더입니다. README에는 레지스터 확장으로 인해 원래 36개 대비 평균 신뢰도가 낮아졌음을 명시하고 있으며, 앱 내 'What's real' 탭에서 계층을 공개하고 지도의 마커 채우기로 확실성을 표시합니다. 73개 행 모두 좌표가 미검증된 상태로 표시되며, 스크립트가 OpenStreetMap과 대조하여 보고서를 작성하지만 데이터를 직접 수정하지는 않습니다. 경로 매칭은 턴바이턴(turn-by-turn) 경로 안내가 아닌 직선 복도 매칭 방식이며, 이는 모든 경로 답변에 공개됩니다. 학습 루프 500m 이내의 제보 지역은 하나의 장소로 처리됩니다. 서로 다른 이틀에 걸쳐 3건의 제보가 접수된 장소는 독립적인 침수 지점으로 승격되며, 이는 73개의 연구된 행에 병합되지 않고 별도로 관리됩니다. 특정 지점의 측정 임계값은 서로 다른 이틀 동안 시간당 1mm 이상의 비가 내린 상태에서 무릎 높이 이상의 침수가 확인된 후에만 게시됩니다. 게시되는 수치는 해당 장소를 침수시킨 것으로 확인된 가장 적은 강우량입니다. Open-Meteo가 승인된 각 제보 전의 강우량을 제공합니다. 제보 횟수, 보정 쌍 및 관찰된 임계값은 데이터베이스 트리거를 통해서만 기록 가능하며 컬럼 권한으로 강제되므로, 관리자가 측정값을 직접 입력할 수 없습니다. 아키텍처 및 스택 이 앱은 정적 사이트입니다. React 19와 TypeScript를 사용하고 Vite(rolldown)로 빌드하며 Leaflet로 렌더링합니다. 설치 가능한 오프라인 우선 PWA로 제공되며 정적 호스팅에 배포됩니다. 핫스팟 레지스터(62KB의 정적 행)가 번들에 포함되어 있어 네트워크 요청 전에도 지도와 목록이 렌더링됩니다. 점수 계산은 해당 행들에 대한 순수 산술 연산이며 기기에서 실행됩니다. 유일하게 상시 호출되는 것은 API 키가 필요 없고 교차 출처 액세스를 허용하는 Open-Meteo이며, 방문자의 IP에서 직접 호출됩니다. Nominatim은 레지스터에 없는 장소에 대한 폴백으로만 사용됩니다. Supabase는 선택 사항입니다. Supabase가 없어도 예측 도구는 완전히 작동하며 제보는 기기에 유지됩니다. README에는 콜드 스타트가 42.7초였고 예측 호출이 지속적으로 속도 제한(rate-limited)되었던 이전의 FastAPI 컨테이너 버전이 기록되어 있으며, 이것이 전체 클라이언트 방식의 재설계 동기가 되었습니다. 전체 번들 크기는 gzipped 기준 약 160KB입니다. 데이터 파이프라인 학습된 모델은 없습니다. 고정 시드(fixed seeds)를 가진 4개의 결정론적 Python 생성기가 단계별로 레지스터를 구축하며(MCG 구조의 36행 → 64행 → 73행), 이후 앱에 배포될 JSON을 출력하는 내보내기 단계와 무결성 검사가 이어집니다. 지속적 통합(CI) 과정에서 매 푸시마다 모든 단계가 재생성되며, 출력값이 커밋된 내용과 다르면 실패합니다. 기여자는 CSV가 아닌 생성기를 수정해야 합니다. 집수 구역 분석을 위해 GMDA가 공개한 배수 네트워크(매핑된 하천 세그먼트 4,701개, 유역 10개) 데이터를 가져왔으나, 이 데이터는 위험 점수 계산에서 의도적으로 제외되었으며 테스트를 통해 이를 강제합니다. 특히 README는 중앙값 집수 구역 크기가 심각도 계층과 상관관계가 없다는 부정적인 결과를 보고하고 공개했습니다. 지면 진실(ground-truth) 침수 로그가 없으므로 전체 정확도 수치는 주장하지 않습니다. 대신 응답 곡선(10mm/hr는 침수 없음, 20mm/hr는 최악의 chowk 10곳 침수, 35mm/hr는 73개 중 44개 지점 도달, 지속적인 55mm/hr는 레지스터 전체 침수)과 53%의 출처 확보율을 보고합니다. 사용자 주의사항 모든 좌표는 지오코딩된 위치가 아닌 근사치 배치입니다. 임계값은 측정값이 아닌 심각도 계층에 따른 공학적 추정치로 시작되었으며, 시민 증거가 쌓임에 따라 교체됩니다. 경로 분석은 실제 도로가 아닌 직선 복도를 사용하며, 레지스터는 일부 출처가 확보되었으나 공식 정부 데이터셋은 아닙니다. 프로젝트에는 라이브 데모, MIT 라이선스 및 전용 출처 문서가 포함되어 있습니다.