Spaces:
Sleeping
Sleeping
| """ | |
| Standalone Gradio App: Rutas del Hub a Municipios | |
| ------------------------------------------------ | |
| * Datos CSV embebidos (110 filas) con columnas: | |
| Departamento, Ciudad, Línea, Áreas Únicas | |
| * Si no existen columnas lat/lon, geocodifica con geopy | |
| * No necesita archivos externos | |
| """ | |
| import pandas as pd | |
| import folium | |
| import gradio as gr | |
| import io | |
| try: | |
| from geopy.geocoders import Nominatim | |
| from geopy.extra.rate_limiter import RateLimiter | |
| except ImportError: | |
| Nominatim = None # geopy no instalada | |
| # ============ CONFIGURACIÓN ============= | |
| DATA_CSV = """Departamento,Ciudad,Línea,Áreas Únicas | |
| ANTIOQUIA,CAÑASGORDAS,Línea 1,"ARTES VISUALES Y PLÁSTICAS, DANZA, LITERATURA, MÚSICA, OTRA" | |
| ANTIOQUIA,LA CEJA,BIAC,Sin información (no registrada en BD) | |
| ANTIOQUIA,MEDELLÍN,BIAC,"ARTES VISUALES Y PLÁSTICAS, AUDIOVISUALES, CIRCO, DANZA, LITERATURA, OTRA, TEATRO" | |
| ANTIOQUIA,MEDELLÍN,Línea 1, | |
| ANTIOQUIA,MEDELLÍN,Línea 2,"ARTES VISUALES Y PLÁSTICAS, AUDIOVISUALES, DANZA, MÚSICA, TEATRO" | |
| "ARCHIPIÉLAGO DE SAN ANDRÉS, PROVIDENCIA Y SANTA CATALINA",SAN ANDRÉS,Línea 1,"ARTES VISUALES Y PLÁSTICAS, LITERATURA, TEATRO" | |
| ATLÁNTICO,BARANOA,Línea 1,"DANZA, MÚSICA, TEATRO" | |
| ATLÁNTICO,BARRANQUILLA,BIAC,"ARTES VISUALES Y PLÁSTICAS, DANZA, LITERATURA, MÚSICA, TEATRO, TÍTERES" | |
| ATLÁNTICO,BARRANQUILLA,Línea 2, | |
| ATLÁNTICO,PUERTO COLOMBIA,Línea 2,"ARTES VISUALES Y PLÁSTICAS, CIRCO, DANZA, MÚSICA, TEATRO, TÍTERES" | |
| ATLÁNTICO,SABANALARGA,BIAC,Sin información (no registrada en BD) | |
| ATLÁNTICO,SANTO TOMÁS,Línea 2,"ARTES VISUALES Y PLÁSTICAS, DANZA, LITERATURA, TÍTERES" | |
| ATLÁNTICO,SOLEDAD,BIAC,Sin información (no registrada en BD) | |
| "BOGOTÁ, D.C.","BOGOTÁ, D.C.",BIAC,"ARTES VISUALES Y PLÁSTICAS, AUDIOVISUALES, DANZA, LITERATURA, MÚSICA, OTRA, TEATRO, TÍTERES" | |
| "BOGOTÁ, D.C.","BOGOTÁ, D.C.",Línea 1, | |
| "BOGOTÁ, D.C.","BOGOTÁ, D.C.",Línea 2,"ARTES VISUALES Y PLÁSTICAS, AUDIOVISUALES, CIRCO, DANZA, LITERATURA, MÚSICA, TEATRO, TÍTERES" | |
| BOLÍVAR,CARTAGENA DE INDIAS,Línea 1,"ARTES VISUALES Y PLÁSTICAS, LITERATURA, MÚSICA" | |
| BOLÍVAR,CARTAGENA DE INDIAS,Línea 2,"ARTES VISUALES Y PLÁSTICAS, CIRCO, DANZA, LITERATURA, MÚSICA, TEATRO, TÍTERES" | |
| BOLÍVAR,MAHATES,Línea 2,"AUDIOVISUALES, DANZA, LITERATURA, MÚSICA, OTRA" | |
| BOLÍVAR,SAN JACINTO,Línea 1,"DANZA, MÚSICA, TEATRO" | |
| BOLÍVAR,SAN JACINTO,Línea 2,"DANZA, LITERATURA, MÚSICA, TEATRO" | |
| BOLÍVAR,SAN JUAN NEPOMUCENO,Línea 2,"CIRCO, DANZA, MÚSICA, TEATRO" | |
| BOLÍVAR,SOPLAVIENTO,Línea 1,"ARTES VISUALES Y PLÁSTICAS, DANZA, MÚSICA" | |
| BOLÍVAR,TURBACO,Línea 1,"ARTES VISUALES Y PLÁSTICAS, DANZA, MÚSICA" | |
| BOYACÁ,CHIQUINQUIRÁ,Línea 1,"ARTES VISUALES Y PLÁSTICAS, LITERATURA, OTRA" | |
| BOYACÁ,DUITAMA,Línea 1,"ARTES VISUALES Y PLÁSTICAS, AUDIOVISUALES, CIRCO, DANZA, LITERATURA, MÚSICA, TEATRO, TÍTERES" | |
| BOYACÁ,GACHANTIVÁ,BIAC,Sin información (no registrada en BD) | |
| BOYACÁ,SOGAMOSO,Línea 1,"ARTES VISUALES Y PLÁSTICAS, AUDIOVISUALES, DANZA, MÚSICA, TEATRO" | |
| BOYACÁ,TUNJA,Línea 2,"ARTES VISUALES Y PLÁSTICAS, TEATRO, TÍTERES" | |
| BOYACÁ,VILLA DE LEYVA,Línea 1,"ARTES VISUALES Y PLÁSTICAS, AUDIOVISUALES, OTRA" | |
| CALDAS,ANSERMA,Línea 2,"ARTES VISUALES Y PLÁSTICAS, DANZA, LITERATURA, MÚSICA, OTRA, TEATRO" | |
| CALDAS,MANIZALES,Línea 1,"AUDIOVISUALES, DANZA, LITERATURA, MÚSICA, TEATRO, TÍTERES" | |
| CALDAS,SAMANÁ,Línea 1,"ARTES VISUALES Y PLÁSTICAS, AUDIOVISUALES, DANZA, TEATRO" | |
| CAQUETÁ,CARTAGENA DEL CHAIRÁ,BIAC,Sin información (no registrada en BD) | |
| CAQUETÁ,FLORENCIA,Línea 2,"DANZA, LITERATURA, MÚSICA, TEATRO" | |
| CAQUETÁ,LA MONTAÑITA,BIAC,"ARTES VISUALES Y PLÁSTICAS, MÚSICA, OTRA, TEATRO" | |
| CAQUETÁ,LA MONTAÑITA,Línea 2, | |
| CAUCA,INZÁ,Línea 2,"DANZA, MÚSICA, OTRA, TEATRO, TÍTERES" | |
| CAUCA,MERCADERES,BIAC,Sin información (no registrada en BD) | |
| CAUCA,POPAYÁN,BIAC,"DANZA, LITERATURA, MÚSICA, TEATRO" | |
| CAUCA,POPAYÁN,Línea 1, | |
| CAUCA,POPAYÁN,Línea 2,"DANZA, LITERATURA, MÚSICA, OTRA" | |
| CAUCA,PUERTO TEJADA,BIAC,"ARTES VISUALES Y PLÁSTICAS, DANZA, MÚSICA" | |
| CAUCA,PUERTO TEJADA,Línea 1, | |
| CAUCA,SAN SEBASTIÁN,Línea 1,"DANZA, MÚSICA, TEATRO" | |
| CESAR,LA JAGUA DE IBIRICO,Línea 2,"ARTES VISUALES Y PLÁSTICAS, AUDIOVISUALES, DANZA, LITERATURA, MÚSICA, TEATRO, TÍTERES" | |
| CHOCÓ,CONDOTO,Línea 1,"MÚSICA, TEATRO" | |
| CHOCÓ,ISTMINA,BIAC,Sin información (no registrada en BD) | |
| CUNDINAMARCA,CHOACHÍ,Línea 2,"ARTES VISUALES Y PLÁSTICAS, DANZA, LITERATURA, MÚSICA" | |
| CUNDINAMARCA,SOACHA,BIAC,Sin información (no registrada en BD) | |
| CUNDINAMARCA,SOPÓ,Línea 1,"MÚSICA, TEATRO, TÍTERES" | |
| CUNDINAMARCA,TABIO,Línea 1,"ARTES VISUALES Y PLÁSTICAS, AUDIOVISUALES, MÚSICA" | |
| CUNDINAMARCA,TENJO,Línea 1,"ARTES VISUALES Y PLÁSTICAS, AUDIOVISUALES, DANZA, MÚSICA" | |
| CÓRDOBA,CERETÉ,BIAC,Sin información (no registrada en BD) | |
| CÓRDOBA,MONTERÍA,Línea 1,"ARTES VISUALES Y PLÁSTICAS, LITERATURA, TEATRO" | |
| CÓRDOBA,PUERTO LIBERTADOR,BIAC,Sin información (no registrada en BD) | |
| CÓRDOBA,SAHAGÚN,Línea 2,"ARTES VISUALES Y PLÁSTICAS, LITERATURA, OTRA, TEATRO" | |
| GUAVIARE,SAN JOSÉ DEL GUAVIARE,BIAC,Sin información (no registrada en BD) | |
| HUILA,ALGECIRAS,Línea 1,"DANZA, MÚSICA, TEATRO" | |
| HUILA,GARZÓN,Línea 1,"DANZA, LITERATURA, MÚSICA" | |
| HUILA,NEIVA,Línea 1,"DANZA, LITERATURA, MÚSICA" | |
| HUILA,SAN AGUSTÍN,BIAC,Sin información (no registrada en BD) | |
| LA GUAJIRA,MAICAO,Línea 1,"DANZA, MÚSICA, TEATRO" | |
| LA GUAJIRA,RIOHACHA,Línea 1,"DANZA, MÚSICA, TEATRO" | |
| LA GUAJIRA,URUMITA,Línea 2,"ARTES VISUALES Y PLÁSTICAS, AUDIOVISUALES, DANZA, MÚSICA, TEATRO, TÍTERES" | |
| MAGDALENA,CIÉNAGA,Línea 1,"DANZA, TEATRO, TÍTERES" | |
| MAGDALENA,EL BANCO,Línea 1,"ARTES VISUALES Y PLÁSTICAS, MÚSICA, TEATRO" | |
| META,SAN MARTÍN,BIAC,Sin información (no registrada en BD) | |
| META,VILLAVICENCIO,Línea 2,"ARTES VISUALES Y PLÁSTICAS, LITERATURA, MÚSICA, OTRA" | |
| NARIÑO,LA CRUZ,Línea 2,"ARTES VISUALES Y PLÁSTICAS, DANZA, MÚSICA, TEATRO, TÍTERES" | |
| NARIÑO,LA TOLA,Línea 1,"DANZA, LITERATURA, MÚSICA" | |
| NARIÑO,PASTO,BIAC,"DANZA, LITERATURA, MÚSICA" | |
| NARIÑO,PASTO,Línea 1,"CIRCO, DANZA, MÚSICA, TEATRO, TÍTERES" | |
| NARIÑO,PASTO,Línea 2,"LITERATURA, MÚSICA, OTRA" | |
| NARIÑO,ROBERTO PAYÁN,Línea 1, | |
| NARIÑO,SAN ANDRÉS DE TUMACO,Línea 1,"ARTES VISUALES Y PLÁSTICAS, DANZA, MÚSICA" | |
| NORTE DE SANTANDER,SAN JOSÉ DE CÚCUTA,Línea 2,"ARTES VISUALES Y PLÁSTICAS, AUDIOVISUALES, CIRCO, DANZA, LITERATURA, MÚSICA, OTRA, TEATRO, TÍTERES" | |
| PUTUMAYO,SAN FRANCISCO,Línea 1,"DANZA, MÚSICA, OTRA" | |
| PUTUMAYO,SIBUNDOY,Línea 1,"AUDIOVISUALES, MÚSICA, OTRA" | |
| QUINDÍO,ARMENIA,BIAC,"ARTES VISUALES Y PLÁSTICAS, LITERATURA, MÚSICA" | |
| QUINDÍO,ARMENIA,Línea 1, | |
| QUINDÍO,BUENAVISTA,Línea 1,"LITERATURA, MÚSICA, TEATRO" | |
| QUINDÍO,MONTENEGRO,BIAC,Sin información (no registrada en BD) | |
| RISARALDA,PEREIRA,BIAC,"ARTES VISUALES Y PLÁSTICAS, DANZA, LITERATURA, MÚSICA, TEATRO" | |
| RISARALDA,PEREIRA,Línea 1, | |
| RISARALDA,PEREIRA,Línea 2,"ARTES VISUALES Y PLÁSTICAS, DANZA, LITERATURA, MÚSICA, TEATRO" | |
| SANTANDER,BARRANCABERMEJA,Línea 2,"CIRCO, MÚSICA, TEATRO, TÍTERES" | |
| SANTANDER,BUCARAMANGA,BIAC,"ARTES VISUALES Y PLÁSTICAS, AUDIOVISUALES, DANZA, LITERATURA, MÚSICA, TEATRO" | |
| SANTANDER,BUCARAMANGA,Línea 1, | |
| SANTANDER,SAN VICENTE DE CHUCURÍ,Línea 1,"ARTES VISUALES Y PLÁSTICAS, AUDIOVISUALES, LITERATURA, OTRA" | |
| SUCRE,COROZAL,Línea 1,"DANZA, LITERATURA, MÚSICA" | |
| SUCRE,SAMPUÉS,Línea 2,"ARTES VISUALES Y PLÁSTICAS, DANZA, LITERATURA, MÚSICA" | |
| SUCRE,SAN JOSÉ DE TOLUVIEJO,Línea 1,"DANZA, LITERATURA, MÚSICA" | |
| SUCRE,SINCELEJO,Línea 1,"DANZA, LITERATURA, MÚSICA" | |
| SUCRE,SINCELEJO,Línea 2,"ARTES VISUALES Y PLÁSTICAS, DANZA, MÚSICA, TEATRO" | |
| TOLIMA,IBAGUÉ,Línea 1,"LITERATURA, MÚSICA, TEATRO, TÍTERES" | |
| VALLE DEL CAUCA,BUENAVENTURA,Línea 2,"ARTES VISUALES Y PLÁSTICAS, DANZA, LITERATURA, TEATRO" | |
| VALLE DEL CAUCA,CAICEDONIA,Línea 1,"ARTES VISUALES Y PLÁSTICAS, AUDIOVISUALES, LITERATURA" | |
| VALLE DEL CAUCA,CALIMA,Línea 1,"ARTES VISUALES Y PLÁSTICAS, MÚSICA, TEATRO" | |
| VALLE DEL CAUCA,FLORIDA,BIAC,Sin información (no registrada en BD) | |
| VALLE DEL CAUCA,GUACARÍ,Línea 2,"DANZA, LITERATURA, MÚSICA, TEATRO" | |
| VALLE DEL CAUCA,GUADALAJARA DE BUGA,Línea 2,"ARTES VISUALES Y PLÁSTICAS, LITERATURA, TEATRO, TÍTERES" | |
| VALLE DEL CAUCA,LA CUMBRE,Línea 2,"ARTES VISUALES Y PLÁSTICAS, DANZA, MÚSICA, TEATRO" | |
| VALLE DEL CAUCA,RIOFRÍO,BIAC,Sin información (no registrada en BD) | |
| VALLE DEL CAUCA,SAN PEDRO,Línea 1,"ARTES VISUALES Y PLÁSTICAS, DANZA, MÚSICA" | |
| VALLE DEL CAUCA,SANTIAGO DE CALI,BIAC,"ARTES VISUALES Y PLÁSTICAS, AUDIOVISUALES, DANZA, LITERATURA, MÚSICA, TEATRO" | |
| VALLE DEL CAUCA,SANTIAGO DE CALI,Línea 1, | |
| VALLE DEL CAUCA,SANTIAGO DE CALI,Línea 2,"ARTES VISUALES Y PLÁSTICAS, DANZA, LITERATURA, MÚSICA, OTRA, TEATRO" | |
| VALLE DEL CAUCA,SEVILLA,Línea 1,"ARTES VISUALES Y PLÁSTICAS, AUDIOVISUALES, DANZA, MÚSICA, TEATRO" | |
| VALLE DEL CAUCA,TULUÁ,Línea 1,"CIRCO, DANZA, MÚSICA" | |
| """ | |
| HUB_NAME = "Bogotá" | |
| HUB_LAT, HUB_LON = 4.7110, -74.0721 | |
| LINE_COLOR = { | |
| "Línea 1": "red", | |
| "Línea 2": "blue", | |
| "BIAC": "green" | |
| } | |
| # ========================================= | |
| # Leer DataFrame | |
| df = pd.read_csv(io.StringIO(DATA_CSV)) | |
| # ------------ Geocodificar --------------- | |
| def geocode_missing(dframe: pd.DataFrame) -> pd.DataFrame: | |
| if {'lat','lon'}.issubset(dframe.columns) and not dframe[['lat','lon']].isna().any().any(): | |
| return dframe | |
| if Nominatim is None: | |
| raise ImportError("Faltan 'lat' y 'lon' y geopy no está instalado.") | |
| geolocator = Nominatim(user_agent="clanes_mapa_app") | |
| geocode = RateLimiter(geolocator.geocode, min_delay_seconds=1) | |
| if 'lat' not in dframe.columns: | |
| dframe['lat'] = pd.NA | |
| dframe['lon'] = pd.NA | |
| cache = {} | |
| for i, row in dframe.iterrows(): | |
| if not pd.isna(row['lat']) and not pd.isna(row['lon']): | |
| continue | |
| key = (row['Ciudad'], row['Departamento']) | |
| if key in cache: | |
| lat, lon = cache[key] | |
| else: | |
| loc = geocode(f"{row['Ciudad']}, {row['Departamento']}, Colombia") | |
| lat, lon = (loc.latitude, loc.longitude) if loc else (pd.NA, pd.NA) | |
| cache[key] = (lat, lon) | |
| dframe.at[i, 'lat'] = lat | |
| dframe.at[i, 'lon'] = lon | |
| return dframe | |
| df = geocode_missing(df) | |
| # --------- Helpers para filtros ---------- | |
| def explode_areas(series, sep=','): | |
| return {a.strip() for sub in series.dropna() for a in str(sub).split(sep)} | |
| all_areas = sorted(explode_areas(df['Áreas Únicas'])) | |
| all_areas.insert(0, "Todas") | |
| all_lines = ["Todas"] + sorted(df['Línea'].dropna().unique().tolist()) | |
| # -------------- Mapa --------------------- | |
| def make_map(selected_area: str, selected_line: str) -> str: | |
| m = folium.Map(location=[HUB_LAT, HUB_LON], zoom_start=6, tiles="cartodbpositron") | |
| folium.Marker( | |
| [HUB_LAT, HUB_LON], | |
| tooltip=f"Hub: {HUB_NAME}", | |
| icon=folium.Icon(color='orange', icon='home') | |
| ).add_to(m) | |
| filt = df.copy() | |
| if selected_line != "Todas": | |
| filt = filt[filt['Línea'] == selected_line] | |
| if selected_area != "Todas": | |
| filt = filt[filt['Áreas Únicas'].str.contains(selected_area, case=False, na=False)] | |
| for _, row in filt.iterrows(): | |
| lat, lon = row.get('lat'), row.get('lon') | |
| if pd.isna(lat) or pd.isna(lon): | |
| continue | |
| folium.Marker( | |
| [lat, lon], | |
| tooltip=(f"{row['Ciudad']} — {row['Línea']}\nÁreas: {row['Áreas Únicas']}"), | |
| icon=folium.Icon(color='blue', icon='user') | |
| ).add_to(m) | |
| folium.PolyLine( | |
| [[HUB_LAT, HUB_LON], [lat, lon]], | |
| color=LINE_COLOR.get(row['Línea'], 'gray'), | |
| weight=2, | |
| opacity=0.8 | |
| ).add_to(m) | |
| return m._repr_html_() | |
| # -------------- Interface ----------------- | |
| demo = gr.Interface( | |
| fn=make_map, | |
| inputs=[ | |
| gr.Dropdown(choices=all_areas, value="Todas", label="Filtrar por Área"), | |
| gr.Dropdown(choices=all_lines, value="Todas", label="Filtrar por Línea") | |
| ], | |
| outputs=gr.HTML(label="Mapa"), | |
| title="Mapa de Rutas: Hub → Municipios", | |
| description="Filtra por Área artística y/o Línea para visualizar las rutas.", | |
| allow_flagging="never" | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() | |