File size: 3,922 Bytes
5c8a315
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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