Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
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 | |