Demostración de agrupación de marcadores
5000 marcadores: zoom para ver puntos individuales
”’ m.get_root().html.add_child(folium.Element(title_html)) return m def create_time_series_map(): “””Crear un mapa animado que muestre los cambios de datos a lo largo del tiempo””” start_date = datetime(2024, 8, 1) características = []
camino = [
[25.0, -70.0], [26.5, -72.0], [28.0, -74.5], [29.5, -76.5],
[31.0, -78.0], [32.5, -79.5], [34.0, -80.5], [35.5, -81.0]
]para i, (lat, lon) en enumerar(ruta): marca de tiempo = fecha_inicio + timedelta(horas=i*6) característica = { ‘tipo’: ‘Característica’, ‘geometría’: { ‘tipo’: ‘Punto’, ‘coordenadas’: [lon, lat]
}, ‘properties’: { ‘time’: timestamp.isoformat(), ‘popup’: f’Posición del huracán
Hora: {timestamp.strftime(“%Y-%m-%d %H:%M”)}
Categoría: {min(5, i//2 + 1)}’, ‘icon’: ‘círculo’, ‘iconstyle’: { ‘fillColor’: [‘yellow’, ‘orange’, ‘red’, ‘darkred’, ‘purple’][min(4, i//2)]’fillOpacity’: 0.8, ‘stroke’: ‘true’, ‘radius’: 8 + i * 2 } } } características.append(característica) m = folium.Map( ubicación=[30.0, -75.0]zoom_start=5, azulejos=”CartoDB Positron” ) TimestampedGeoJson( {‘tipo’: ‘FeatureCollection’, ‘características’: características}, period=’PT6H’, add_last_point=True, auto_play=True, loop=True, max_speed=2, loop_button=True, date_options=”AAAA-MM-DD HH:mm”, time_slider_drag_update=True ).add_to(m) title_html=””‘
Animación de la trayectoria del huracán
Seguimiento simulado de huracanes
Utilice los controles a continuación para reproducir/pausar
”’ m.get_root().html.add_child(folium.Element(title_html)) return m def create_interactive_plugins_map(): “””Crear un mapa con múltiples complementos interactivos””” m = folium.Map( ubicación=[40.7128, -74.0060]zoom_start=12, tiles=”OpenStreetMap” ) minimap = MiniMap(toggle_display=True) m.add_child(minimap) draw = Draw( export=True, filename=”drawn_shapes.geojson”, position=’topleft’, draw_options={ ‘polilínea’: Verdadero, ‘polígono’: Verdadero, ‘círculo’: Verdadero, ‘rectángulo’: Verdadero, ‘marcador’: Verdadero, ‘circlemarker’: Verdadero }, edit_options={‘editar’: Verdadero} ) m.add_child(draw) Pantalla completa( posición=’arriba’, título=”Expandir mapa”, título_cancel=”Salir de pantalla completa”, force_separate_button=True ).add_to(m) plugins.MeasureControl( posición=’bottomleft’, Primary_length_unit=”kilómetros”, second_length_unit=”millas”, Primary_area_unit=”kilómetros cuadrados”, second_area_unit=”acres” ).add_to(m) plugins.MousePosition( position=’bottomright’, separator=” | “, cadena_vacía=’NaN’, lng_first=True, num_digits=20, prefix=’Coordenadas:’, ).add_to(m) complementos.LocateControl( auto_start=False, posición=’arriba a la izquierda’ ).add_to(m) folium.Marker(
[40.7128, -74.0060]popup=’Nueva York
¡Pruebe las herramientas de dibujo!’, icon=folium.Icon(color=”red”, icon=’info-sign’) ).add_to(m) return m def create_earthquake_map(): “””Cree una visualización integral de terremotos utilizando datos reales del USGS””” url=”https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.geojson” intente: respuesta = request.get(url) terremoto_data = respuesta.json() print(f”Cargado exitosamente {len(earthquake_data[‘features’])} terremotos”) excepto la excepción como e: print(f”Error al obtener datos: {e}”) terremoto_data = { ‘características’: [
{
‘properties’: {‘mag’: 5.2, ‘place’: ‘Sample Location 1’, ‘time’: 1640000000000},
‘geometry’: {‘coordinates’: [-122.0, 37.0, 10]} }, { ‘properties’: {‘mag’: 6.1, ‘place’: ‘Ubicación de muestra 2’, ‘time’: 1640100000000}, ‘geometry’: {‘coordinates’: [140.0, 35.0, 20]} } ]} terremotos = []
para función en terremoto_data[‘features’]: accesorios = característica[‘properties’]
coordenadas = característica[‘geometry’][‘coordinates’]
terremotos.append({ ‘lat’: coordenadas[1]’lon’: coordenadas[0]’profundidad’: coordenadas[2]’magnitud’: props.get(‘mag’, 0), ‘lugar’: props.get(‘lugar’, ‘Desconocido’), ‘hora’: datetime.fromtimestamp(props.get(‘hora’, 0) / 1000) }) df_eq = pd.DataFrame(earthquakes) print(f”\nEstadísticas de terremotos:”) print(f”Total de terremotos: {len(df_eq)}”) print(f”Rango de magnitud: {df_eq[‘magnitude’].min():.1f} – {df_eq[‘magnitude’].max():.1f}”) print(f”Rango de profundidad: {df_eq[‘depth’].min():.1f} – {df_eq[‘depth’].max():.1f} km”) m = folium.Map( ubicación=[20, 0]zoom_start=2, azulejos=”CartoDB dark_matter” ) menor = folium.FeatureGroup(nombre=”Menor (< 4.0)") moderado = folium.FeatureGroup(nombre="Moderado (4.0-5.0)") fuerte = folium.FeatureGroup(nombre="Fuerte (5.0-6.0)") mayor = folium.FeatureGroup(nombre="Mayor (≥ 6.0)") para idx, eq en df_eq.iterrows(): mag = eq['magnitude'] if mag < 4.0: color="verde" radio = 3 grupo = menor elif mag < 5.0: color="amarillo" radio = 6 grupo = moderado elif mag < 6.0: color="orange" radio = 9 grupo = fuerte else: color="rojo" radio = 12 grupo = mayor popup_html = f"""
Magnitud {mag:.1f}
Ubicación: {eq.[‘place’]}
Profundidad: {eq.[‘depth’]:.1f} kilómetros
Hora: {eq.[‘time’].strftime(‘%Y-%m-%d %H:%M:%S’)}
Coordenadas: {eq.[‘lat’]:.4f}, {ecuación[‘lon’]:.4f}
“”” folium.CircleMarker(ubicación=[eq[‘lat’]ecuación[‘lon’]], radio=radio, popup=folium.Popup(popup_html, max_width=270), información sobre herramientas=f”M{mag:.1f} – {eq[‘place’]}”, color=color, relleno=True, fillColor=color, fillOpacity=0.7, peso=2).add_to(group) minor.add_to(m) moderado.add_to(m) fuerte.add_to(m) major.add_to(m) heat_data = [[row[‘lat’]fila[‘lon’]fila[‘magnitude’]]para idx, fila en df_eq.iterrows()]heatmap = folium.FeatureGroup(name=”Density Heatmap”, show=False) HeatMap( heat_data, min_opacity=0.3, radio=15, desenfoque=20, gradiente={0.4: ‘azul’, 0.6: ‘cian’, 0.7: ‘lima’, 0.8: ‘amarillo’, 1: ‘rojo’} ).add_to(heatmap) heatmap.add_to(m) folium.LayerControl(position=’topright’, contraído=False).add_to(m) legend_html=””‘
Magnitud del terremoto
● Menor (< 4,0)
● Moderado (4.0-5.0)
● Fuerte (5,0-6,0)
● Mayor (≥ 6,0)
Datos: USGS (últimos 30 días)
”’ m.get_root().html.add_child(folium.Element(legend_html)) title_html=””‘
🌍 Monitor global de terremotos
Datos de terremotos en tiempo real (M ≥ 2,5)
Haga clic en marcadores para obtener más detalles | Alternar capas para explorar
”’ m.get_root().html.add_child(folium.Element(title_html)) Fullscreen(position=’topright’).add_to(m) return m if __name__ == “__main__”: print(“=” * 80) print(“TUTORIAL AVANZADO DE FOLIUM – TODOS LOS EJEMPLOS”) print(“=” * 80) print(“\nGenerando todos los mapas…\n”) mapas = { ‘multi_tile_map’: create_multi_tile_map(), ‘advanced_markers_map’: create_advanced_markers_map(), ‘heatmap’: create_heatmap(), ‘choropleth_map’: create_choropleth_map(), ‘marker_cluster_map’: create_marker_cluster_map(), ‘time_series_map’: create_time_series_map(), ‘interactive_plugins_map’: create_interactive_plugins_map(), ‘earthquake_map’: create_earthquake_map() } print(“\n” + “=” * 80) print(“GUARDAR MAPAS EN ARCHIVOS HTML”) print(“=” * 80) para el nombre, map_obj en maps.items(): si map_obj no es Ninguno: filename = f”{name}.html” map_obj.save(nombre de archivo) print(f” ✓ Guardado: {nombre de archivo}”) else: print(f”✗ Omitido: {nombre} (falló la generación del mapa)”) print(“\n” + “=” * 80) print(“¡TODOS LOS MAPAS GENERADOS EXITOSAMENTE!”) print(“=” * 80) print(“\nAhora puedes:”) print(“1. Abra cualquier archivo HTML en su navegador para ver el mapa interactivo”) print(“2. Acceda a los objetos del mapa en código usando el diccionario ‘mapas'”) print(“3. Muestre mapas en Jupyter/Colab devolviendo el objeto del mapa”) print(“\nEjemplo: para mostrar el mapa del terremoto en un cuaderno, simplemente ejecute:”) print(” mapas[‘earthquake_map’]”) imprimir(“\n” + “=” * 80)