Spaces:
Sleeping
Sleeping
| 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=") | |
| df = pd.read_csv(url, on_bad_lines="warn") | |
| return df | |
| # Session for Requests | |
| # session = requests.Session() | |
| # @st.cache_data(persist=True) | |
| # def parse_latlng_from_link(url): | |
| # try: | |
| # # extract latitude and longitude from gmaps link | |
| # if "@" not in url: | |
| # resp = session.head(url, allow_redirects=True) | |
| # url = resp.url | |
| # latlng = url.split("@")[1].split(",")[0:2] | |
| # return [float(latlng[0]), float(latlng[1])] | |
| # except Exception as e: | |
| # return None | |
| def add_latlng_col(df, process_column): | |
| """Add a latlng column to the dataframe""" | |
| df = df.assign(latlng=df.iloc[:, process_column].apply(parse_latlng)) | |
| return df | |
| # parse latlng (column 4) to [lat, lng] | |
| import re | |
| def parse_latlng(latlng): | |
| if pd.isna(latlng): | |
| return None | |
| # lat, lng = latlng.split(",") | |
| # return [float(lat), float(lng)] | |
| try: | |
| # check if it matches (30.9529832, -7.1010705) or (30.9529832,-7.1010705) | |
| if re.match(r"\(\d+\.\d+,\s?-\d+\.\d+\)", latlng): | |
| lat, lng = latlng[1:-1].split(",") | |
| return [float(lat), float(lng)] | |
| # check of it matches 30.9529832, -7.1010705 or 30.9529832,-7.1010705 | |
| elif re.match(r"\d+\.\d+,\s?-\d+\.\d+", latlng): | |
| lat, lng = latlng.split(",") | |
| return [float(lat), float(lng)] | |
| # check if it matches 30,9529832, -7,1010705 or 30,9529832,-7,1010705, match1=30,9529832 and match2=-7,1010705 | |
| elif re.match(r"\d+,\d+,\s?-\d+,\d+", latlng): | |
| d1, d2, d3, d4 = latlng.split(",") | |
| return [float(".".join([d1, d2])), float(".".join([d3, d4]))] | |
| except Exception as e: | |
| print(f"Error parsing latlng: {latlng} Reason: {e}") | |
| return None | |
| print(f"Error parsing latlng: {latlng}") | |
| return None | |
| def add_epicentre_to_map(map_obj): | |
| # Removed the spinner to not confuse the users as the map is already loaded | |
| icon_epicentre = folium.plugins.BeautifyIcon( | |
| icon='star', | |
| 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://marocmap.ikiker.com/maroc/{z}/{x}/{y}.png" | |
| folium.TileLayer( | |
| tiles=tileurl, | |
| attr="Maroc Map", | |
| name="Maroc Map", | |
| overlay=False, | |
| control=False, | |
| ).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 | |