Refactor map.py

This commit is contained in:
Sebastian Lenzlinger 2024-01-05 14:42:05 +01:00
parent 685a5cf2d3
commit 3c00de0afb

View File

@ -4,6 +4,9 @@ import os
import folium import folium
from folium import plugins from folium import plugins
import logging import logging
from folium.plugins import HeatMap
from db_connector import RemoteDB from db_connector import RemoteDB
import shapely import shapely
from shapely import wkb from shapely import wkb
@ -49,10 +52,19 @@ interactive_map = folium.Map(
tiles="cartodb positron" 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 = { color_dict = {
"T0": "red", "T0": "red",
"T10": "blue",
"T20": "orange", "T20": "orange",
"T30": "green", "T30": "green",
"T50": "yellow", "T50": "yellow",
@ -124,26 +136,38 @@ def create_heat_map_with_time():
heat_df = gpd.GeoDataFrame(heat_view_data, columns=['latitude', 'longitude', 'year']) 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)}" 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 heat_data = [[[row['latitude'], row['longitude']] for index, row in heat_df[heat_df['year'] == i].iterrows()] for
i in range(2011, 2023)] i in range(2011, 2023)]
index = [2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022] index = [2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022]
# plot heat map # plot heat map
hm = plugins.HeatMapWithTime(heat_data, hm = plugins.HeatMapWithTime(heat_data,
auto_play=False, auto_play=False,
gradient=gradient,
min_opacity=0.5,
max_opacity=0.8, max_opacity=0.8,
blur=10,
radius=8,
index=index, index=index,
name="Accident Heatmap") name="Accident Heatmap")
hm.add_to(interactive_map) hm.add_to(map)
interactive_map.save("test.html")
def add_signaled_speeds(map):
# Add signald speeds data # Add signald speeds data
sig_speeds_data = get_signaled_speed_sql() 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)) sig_speed_df['geometry'] = sig_speed_df['wkb_geometry'].apply(lambda x: wkb.loads(x, hex=True))
logger.debug(f"{sig_speed_df.head()}") logger.debug(f"{sig_speed_df.head()}")
sig_speed_gdf = gpd.GeoDataFrame(sig_speed_df, geometry="geometry") sig_speed_gdf = gpd.GeoDataFrame(sig_speed_df, geometry="geometry")
for speedlimit in speedLimits: for speedlimit in speedLimits:
signal_speed = sig_speed_gdf[sig_speed_gdf["tempo"].str.contains(speedlimit, case=False)] 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))) 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], color=color_dict[speedlimit],
show=False, show=False,
line_cap="butt", 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(): def get_signaled_speed_sql():
@ -187,4 +243,6 @@ if __name__ == "__main__":
drop_heat_view() drop_heat_view()
create_heat_view() create_heat_view()
create_heat_map_with_time() create_heat_map_with_time()
save_map_as_html(interactive_map, "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")