From 3c00de0afba6ea7f6bf2095ba5de79e2dd651ebf Mon Sep 17 00:00:00 2001 From: Sebastian Lenzlinger <74497638+sebaschi@users.noreply.github.com> Date: Fri, 5 Jan 2024 14:42:05 +0100 Subject: [PATCH 1/3] Refactor map.py --- analysis/map.py | 80 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 69 insertions(+), 11 deletions(-) diff --git a/analysis/map.py b/analysis/map.py index 597622e..b1f564a 100644 --- a/analysis/map.py +++ b/analysis/map.py @@ -4,6 +4,9 @@ import os import folium from folium import plugins import logging + +from folium.plugins import HeatMap + from db_connector import RemoteDB import shapely from shapely import wkb @@ -49,10 +52,19 @@ interactive_map = folium.Map( tiles="cartodb positron" ) -speedLimits = ["T0","T10","T20","T30","T50","T60","T80","T100"] +interactive_map_toggle = folium.Map( + location=zurich_coordinates, + zoom_start=13, + zoom_control=True, + dragging=True, + scrollWheelZoom=True, + doubleClickZoom=False, + tiles="cartodb positron" +) + +speedLimits = ["T0","T20","T30","T50","T60","T80","T100"] color_dict = { "T0": "red", - "T10": "blue", "T20": "orange", "T30": "green", "T50": "yellow", @@ -124,26 +136,38 @@ def create_heat_map_with_time(): heat_df = gpd.GeoDataFrame(heat_view_data, columns=['latitude', 'longitude', 'year']) assert not heat_df.empty, f" Heat Dataframe is empty: {heat_df.head(5)}" + add_heat_map_time(heat_df, interactive_map) + #interactive_map.save("test.html") + + add_signaled_speeds(interactive_map) + + folium.LayerControl(collapsed=True).add_to(interactive_map) + + +def add_heat_map_time(heat_df, map): heat_data = [[[row['latitude'], row['longitude']] for index, row in heat_df[heat_df['year'] == i].iterrows()] for i in range(2011, 2023)] - index = [2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022] # plot heat map hm = plugins.HeatMapWithTime(heat_data, auto_play=False, + gradient=gradient, + min_opacity=0.5, max_opacity=0.8, + blur=10, + radius=8, index=index, name="Accident Heatmap") - hm.add_to(interactive_map) - interactive_map.save("test.html") + hm.add_to(map) + +def add_signaled_speeds(map): # Add signald speeds data sig_speeds_data = get_signaled_speed_sql() - sig_speed_df = pd.DataFrame(sig_speeds_data, columns=['tempo','wkb_geometry']) + sig_speed_df = pd.DataFrame(sig_speeds_data, columns=['tempo', 'wkb_geometry']) sig_speed_df['geometry'] = sig_speed_df['wkb_geometry'].apply(lambda x: wkb.loads(x, hex=True)) logger.debug(f"{sig_speed_df.head()}") sig_speed_gdf = gpd.GeoDataFrame(sig_speed_df, geometry="geometry") - for speedlimit in speedLimits: signal_speed = sig_speed_gdf[sig_speed_gdf["tempo"].str.contains(speedlimit, case=False)] geometries = json.loads(json.dumps(shapely.geometry.mapping(signal_speed['geometry'].unary_union))) @@ -154,10 +178,42 @@ def create_heat_map_with_time(): color=color_dict[speedlimit], show=False, line_cap="butt", - ).add_to(interactive_map) + ).add_to(map) - folium.LayerControl(collapsed=True).add_to(interactive_map) - interactive_map.save("test.html") + +def create_heat_map_toggle(): + + heat_view_data = get_heat_view() + heat_gdf = gpd.GeoDataFrame(heat_view_data, columns=['latitude', 'longitude', 'year']) + + assert not heat_gdf.empty, f" Heat Dataframe is empty: {heat_gdf.head(5)}" + + add_heat_year_toggle(heat_gdf, interactive_map_toggle) + + # Add signald speeds data + add_signaled_speeds(interactive_map_toggle) + + folium.LayerControl(collapsed=True).add_to(interactive_map_toggle) + + +def add_heat_year_toggle(heat_gdf, map): + index = [2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022] + # plot heat map + for year in index: + year_data = heat_gdf[heat_gdf['year'] == year] + + heatmap_layer = HeatMap( + data=year_data[['latitude', 'longitude']], + radius=8, + gradient=gradient, + min_opacity=0.5, + max_opacity=0.8, + blur=10, + show=False, + name=f'Accidents in {year}' + ) + + heatmap_layer.add_to(map) def get_signaled_speed_sql(): @@ -187,4 +243,6 @@ if __name__ == "__main__": drop_heat_view() create_heat_view() create_heat_map_with_time() - save_map_as_html(interactive_map, "heat_map_with_time") \ No newline at end of file + save_map_as_html(interactive_map, "heat_map_time") + create_heat_map_toggle() + save_map_as_html(interactive_map_toggle, "heat_map_toggle") From 0f73f829aa01fc1fff84e40573e9fb69f51c7c19 Mon Sep 17 00:00:00 2001 From: Sebastian Lenzlinger <74497638+sebaschi@users.noreply.github.com> Date: Fri, 5 Jan 2024 15:44:00 +0100 Subject: [PATCH 2/3] Fix map.py. Issue: No datapoints where displayed. --- analysis/map.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/analysis/map.py b/analysis/map.py index b1f564a..c8d07e0 100644 --- a/analysis/map.py +++ b/analysis/map.py @@ -62,6 +62,7 @@ interactive_map_toggle = folium.Map( tiles="cartodb positron" ) + speedLimits = ["T0","T20","T30","T50","T60","T80","T100"] color_dict = { "T0": "red", @@ -80,7 +81,7 @@ def drop_heat_view(): remote_db = RemoteDB() try: - result = remote_db.execute_query(drop_heat_view_sql) + result = remote_db.execute_command(drop_heat_view_sql) logger.info("Heat View dropped.") except Exception as e: logger.exception(f"Exception while dropping heat view. Msg: {e} ") @@ -136,7 +137,7 @@ def create_heat_map_with_time(): heat_df = gpd.GeoDataFrame(heat_view_data, columns=['latitude', 'longitude', 'year']) assert not heat_df.empty, f" Heat Dataframe is empty: {heat_df.head(5)}" - add_heat_map_time(heat_df, interactive_map) + add_heat_map_time(heat_df) #interactive_map.save("test.html") add_signaled_speeds(interactive_map) @@ -144,21 +145,23 @@ def create_heat_map_with_time(): folium.LayerControl(collapsed=True).add_to(interactive_map) -def add_heat_map_time(heat_df, map): - heat_data = [[[row['latitude'], row['longitude']] for index, row in heat_df[heat_df['year'] == i].iterrows()] for +def add_heat_map_time(heat_df): + heat_data = [[[row['latitude'], row['longitude'], 0.1] for index, row in heat_df[heat_df['year'] == i].iterrows()] for i in range(2011, 2023)] index = [2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022] - # plot heat map + # create heat map + logger.debug(f"First element of heat data: {heat_data[0]}") hm = plugins.HeatMapWithTime(heat_data, auto_play=False, - gradient=gradient, - min_opacity=0.5, max_opacity=0.8, - blur=10, + gradient=gradient, + min_opacity=0.3, radius=8, + use_local_extrema=False, + blur=1, index=index, name="Accident Heatmap") - hm.add_to(map) + hm.add_to(interactive_map) def add_signaled_speeds(map): @@ -244,5 +247,5 @@ if __name__ == "__main__": create_heat_view() create_heat_map_with_time() save_map_as_html(interactive_map, "heat_map_time") - create_heat_map_toggle() - save_map_as_html(interactive_map_toggle, "heat_map_toggle") + #create_heat_map_toggle() + #save_map_as_html(interactive_map_toggle, "heat_map_toggle") From 617cd2d1f47e6af3fa265715aa03db31e2530341 Mon Sep 17 00:00:00 2001 From: Sebastian Lenzlinger <74497638+sebaschi@users.noreply.github.com> Date: Fri, 5 Jan 2024 15:45:39 +0100 Subject: [PATCH 3/3] Small refactor of map.py. --- analysis/map.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/analysis/map.py b/analysis/map.py index c8d07e0..b71abdf 100644 --- a/analysis/map.py +++ b/analysis/map.py @@ -137,7 +137,7 @@ def create_heat_map_with_time(): heat_df = gpd.GeoDataFrame(heat_view_data, columns=['latitude', 'longitude', 'year']) assert not heat_df.empty, f" Heat Dataframe is empty: {heat_df.head(5)}" - add_heat_map_time(heat_df) + add_heat_map_time(heat_df, interactive_map) #interactive_map.save("test.html") add_signaled_speeds(interactive_map) @@ -145,7 +145,7 @@ def create_heat_map_with_time(): folium.LayerControl(collapsed=True).add_to(interactive_map) -def add_heat_map_time(heat_df): +def add_heat_map_time(heat_df, map): heat_data = [[[row['latitude'], row['longitude'], 0.1] for index, row in heat_df[heat_df['year'] == i].iterrows()] for i in range(2011, 2023)] index = [2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022] @@ -161,7 +161,7 @@ def add_heat_map_time(heat_df): blur=1, index=index, name="Accident Heatmap") - hm.add_to(interactive_map) + hm.add_to(map) def add_signaled_speeds(map):