import folium import pandas as pd from folium import plugins from src.map_utils import legend_macro EPICENTER_LOCATION = [31.12210171476489, -8.42945837915193] BORDER_COLOR = "black" def parse_gg_sheet(url): url = url.replace("edit#gid=", "export?format=csv&gid=") print(url) df = pd.read_csv(url, on_bad_lines="warn") # parse latlng (column 4) to [lat, lng] def parse_latlng(latlng): try: lat, lng = latlng.split(",") return [float(lat), float(lng)] except Exception as e: print(f"Error parsing latlng: {e}") return None if df.shape[1] > 4: df = df.assign(latlng=df.iloc[:, 4].apply(parse_latlng)) return df def add_epicentre_to_map(map_obj): icon_epicentre = folium.plugins.BeautifyIcon( icon='spinner', spin=True, border_color='#b3334f', background_color='#b3334f', text_color='white' ) folium.Marker(location=EPICENTER_LOCATION, popup="Epicenter مركز الزلزال", icon=icon_epicentre).add_to(map_obj) def add_danger_distances_to_map(map_obj): Danger_Distances_group = folium.FeatureGroup(name='Danger distances - earthquake magnitude 7 | مسافات الخطر - قوة الزلازل 7').add_to(map_obj) zones = [ {"radius": 100000, "fill_opacity": 0.1, "weight": 1, "fill_color": "yellow", "tooltip": "50 to 100 km - Moderate risk area | منطقة خطر معتدلة"}, {"radius": 50000, "fill_opacity": 0.1, "weight": 1, "fill_color": "orange", "tooltip": "30 to 50 km - High risk zone | منطقة عالية المخاطر"}, {"radius": 30000, "fill_opacity": 0.2, "weight": 1, "fill_color": "#FF0000", "tooltip": "10 to 30 km - Very high risk zone | منطقة شديدة الخطورة"}, {"radius": 10000, "fill_opacity": 0.2, "weight": 0.2, "fill_color": "#8B0000", "tooltip": "0 to 10km - direct impact zone | منطقة التأثير المباشر"} ] for zone in zones: folium.Circle( location=EPICENTER_LOCATION, radius=zone["radius"], color=BORDER_COLOR, weight=zone["weight"], fill_opacity=zone["fill_opacity"], opacity=zone["fill_opacity"], # Assuming border opacity should match fill_opacity fill_color=zone["fill_color"], tooltip=zone["tooltip"], ).add_to(Danger_Distances_group) def init_map(): m = folium.Map( location=[31.228674, -7.992047], zoom_start=8.5, min_zoom=8.5, max_lat=35.628674, min_lat=29.628674, max_lon=-4.992047, min_lon=-10.992047, max_bounds=True, ) # Add a search bar to the map plugins.Geocoder( collapsed=False, position="topright", placeholder="Search | البحث", ).add_to(m) # Add Fullscreen button to the map plugins.Fullscreen( position="topright", title="Expand me | تكبير الخريطة", title_cancel="Exit me | تصغير الخريطة", force_separate_button=True, ).add_to(m) # Satellite View from Mapbox tileurl = "https://api.mapbox.com/styles/v1/phd2020/clmer2mra01d001pbgjkictpt/tiles/256/{z}/{x}/{y}@2x?access_token=pk.eyJ1IjoicGhkMjAyMCIsImEiOiJja29lZzFwZmUwNHkzMm5wMjZnYjVvcGltIn0.tE0ritrelQOyLdKUH6hgOw" folium.TileLayer( tiles=tileurl, attr="Satellite View", name="Satellite View | عرض القمر الصناعي", overlay=False, control=True, ).add_to(m) # Add danger zones add_epicentre_to_map(m) add_danger_distances_to_map(m) # Add a LayerControl to the map to toggle between layers (Satellite View and Default One) folium.LayerControl().add_to(m) # Macro to add legend m.get_root().add_child(legend_macro) return m