import streamlit as st from geopy.geocoders import Nominatim import pandas as pd import folium from folium.plugins import HeatMap from geopy.distance import geodesic import numpy as np import warnings warnings.filterwarnings("ignore", category=UserWarning, module="geopy") geolocator = Nominatim(user_agent="hwaseong_locator") def get_location_name(lat, lon): location = geolocator.reverse((lat, lon), language='ko') return location.address if location else "주소를 찾을 수 없음" def classify_risk(score): if score >= 2: return "매우 안전" elif 1 <= score < 2: return "안전" elif 0 <= score < 1: return "보통" elif -1 < score < 0: return "위험" else: return "매우 위험" hwaseong_center = [37.198, 127.034] st.title("화성시 위치 위험도 분석기") lat_input = st.number_input("위도 (Latitude)", value=37.198, format="%.6f") lon_input = st.number_input("경도 (Longitude)", value=127.034, format="%.6f") location_name = get_location_name(lat_input, lon_input) st.write(f"위치: {location_name}") sample_scores = { (37.198, 127.034): 3, (37.198, 127.035): -2, } def get_score_for_location(lat, lon): closest_location = min(sample_scores.keys(), key=lambda x: geodesic((lat, lon), x).meters) return sample_scores[closest_location] score = get_score_for_location(lat_input, lon_input) risk_category = classify_risk(score) st.write(f"위험도: {risk_category}") # 지도 생성 및 저장 m = folium.Map(location=[lat_input, lon_input], zoom_start=16) folium.Marker([lat_input, lon_input], popup=location_name).add_to(m) m.save("/tmp/location_map.html") # HTML로 Streamlit에 시각화 with open("/tmp/location_map.html", "r", encoding="utf-8") as f: map_html = f.read() st.components.v1.html(map_html, height=500) # 지도 다운로드 st.download_button("위치 지도 다운로드", map_html, file_name="location_map.html")