SYNC COMMIT
This commit is contained in:
parent
915066f735
commit
d563a0af0b
105
analysis/db_utils.py
Normal file
105
analysis/db_utils.py
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
from db_connector import RemoteDB
|
||||||
|
import logging
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||||
|
logger = logging.getLogger("db_utils.py")
|
||||||
|
stream_handler = logging.StreamHandler()
|
||||||
|
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||||
|
stream_handler.setFormatter(formatter)
|
||||||
|
logger.addHandler(stream_handler)
|
||||||
|
|
||||||
|
# Generic DB Methods ==================================================================================================
|
||||||
|
def drop_view(view_name):
|
||||||
|
drop_view_sql = f"""
|
||||||
|
DROP VIEW IF EXISTS {view_name};
|
||||||
|
"""
|
||||||
|
|
||||||
|
remote_db = RemoteDB()
|
||||||
|
try:
|
||||||
|
result = remote_db.execute_query(drop_view_sql)
|
||||||
|
logger.info(f"{view_name} dropped.")
|
||||||
|
except Exception as e:
|
||||||
|
logger.exception(f"Exception while dropping {view_name}. Msg: {e} ")
|
||||||
|
finally:
|
||||||
|
remote_db.close()
|
||||||
|
logger.debug(f"RemoteDB object closed.")
|
||||||
|
|
||||||
|
|
||||||
|
def get_view(view_name, rows="*"):
|
||||||
|
get_view_sql = f"""
|
||||||
|
SELECT {rows}
|
||||||
|
FROM {view_name};
|
||||||
|
"""
|
||||||
|
remote_db = RemoteDB()
|
||||||
|
try:
|
||||||
|
result = remote_db.execute_query(get_view_sql)
|
||||||
|
logger.info(f"Succesfully retrieved {view_name}")
|
||||||
|
return result
|
||||||
|
except Exception as e:
|
||||||
|
logger.exception(f"Failed getting view for {view_name} with exception {e}.")
|
||||||
|
finally:
|
||||||
|
remote_db.close()
|
||||||
|
|
||||||
|
|
||||||
|
# Specialized DB methods ==============================================================================================
|
||||||
|
def create_heat_view():
|
||||||
|
create_heat_view_sql = """
|
||||||
|
CREATE VIEW heat AS
|
||||||
|
SELECT
|
||||||
|
ST_Y(geometry) AS latitude,
|
||||||
|
ST_X(geometry) AS longitude,
|
||||||
|
AccidentYear AS year
|
||||||
|
FROM
|
||||||
|
accidents
|
||||||
|
WHERE
|
||||||
|
ST_Y(geometry) IS NOT NULL AND
|
||||||
|
ST_X(geometry) IS NOT NULL AND
|
||||||
|
AccidentYear IS NOT NULL;
|
||||||
|
"""
|
||||||
|
|
||||||
|
remote_db = RemoteDB()
|
||||||
|
remote_db.execute_command(create_heat_view_sql)
|
||||||
|
remote_db.close()
|
||||||
|
logger.info("Heat View Created")
|
||||||
|
|
||||||
|
def create_bike_heat_view():
|
||||||
|
create_heat_view_sql = """
|
||||||
|
CREATE VIEW bikeheat AS
|
||||||
|
SELECT
|
||||||
|
ST_Y(geometry) AS latitude,
|
||||||
|
ST_X(geometry) AS longitude,
|
||||||
|
AccidentYear AS year
|
||||||
|
FROM
|
||||||
|
accidents
|
||||||
|
WHERE
|
||||||
|
ST_Y(geometry) IS NOT NULL AND
|
||||||
|
ST_X(geometry) IS NOT NULL AND
|
||||||
|
AccidentYear IS NOT NULL AND
|
||||||
|
accidentinvolvingbicycle IS TRUE;
|
||||||
|
"""
|
||||||
|
|
||||||
|
remote_db = RemoteDB()
|
||||||
|
remote_db.execute_command(create_heat_view_sql)
|
||||||
|
remote_db.close()
|
||||||
|
logger.info("Heat View Created")
|
||||||
|
|
||||||
|
def create_pedestrian_heat_view():
|
||||||
|
create_heat_view_sql = """
|
||||||
|
CREATE VIEW pedestrianheat AS
|
||||||
|
SELECT
|
||||||
|
ST_Y(geometry) AS latitude,
|
||||||
|
ST_X(geometry) AS longitude,
|
||||||
|
AccidentYear AS year
|
||||||
|
FROM
|
||||||
|
accidents
|
||||||
|
WHERE
|
||||||
|
ST_Y(geometry) IS NOT NULL AND
|
||||||
|
ST_X(geometry) IS NOT NULL AND
|
||||||
|
AccidentYear IS NOT NULL AND
|
||||||
|
accidentinvolvingpedestrian IS TRUE;
|
||||||
|
"""
|
||||||
|
|
||||||
|
remote_db = RemoteDB()
|
||||||
|
remote_db.execute_command(create_heat_view_sql)
|
||||||
|
remote_db.close()
|
||||||
|
logger.info("Heat View Created")
|
||||||
119
analysis/map.py
119
analysis/map.py
@ -12,6 +12,9 @@ import shapely
|
|||||||
from shapely import wkb
|
from shapely import wkb
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
## MUST IMPORT otherwise contains the functions used in db interaction
|
||||||
|
from db_utils import *
|
||||||
|
|
||||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||||
logger = logging.getLogger('map.py')
|
logger = logging.getLogger('map.py')
|
||||||
stream_handler = logging.StreamHandler()
|
stream_handler = logging.StreamHandler()
|
||||||
@ -74,66 +77,12 @@ color_dict = {
|
|||||||
"T100": "gray"
|
"T100": "gray"
|
||||||
}
|
}
|
||||||
|
|
||||||
def drop_heat_view():
|
# Create Maps =========================================================================================================
|
||||||
drop_heat_view_sql = """
|
|
||||||
DROP VIEW IF EXISTS heat;
|
|
||||||
"""
|
|
||||||
|
|
||||||
remote_db = RemoteDB()
|
|
||||||
try:
|
|
||||||
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} ")
|
|
||||||
finally:
|
|
||||||
remote_db.close()
|
|
||||||
logger.debug(f"RemoteDB object closed.")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def create_heat_view():
|
|
||||||
create_heat_view_sql = """
|
|
||||||
CREATE VIEW heat AS
|
|
||||||
SELECT
|
|
||||||
ST_Y(geometry) AS latitude,
|
|
||||||
ST_X(geometry) AS longitude,
|
|
||||||
AccidentYear AS year
|
|
||||||
FROM
|
|
||||||
accidents
|
|
||||||
WHERE
|
|
||||||
ST_Y(geometry) IS NOT NULL AND
|
|
||||||
ST_X(geometry) IS NOT NULL AND
|
|
||||||
AccidentYear IS NOT NULL;
|
|
||||||
"""
|
|
||||||
|
|
||||||
remote_db = RemoteDB()
|
|
||||||
remote_db.execute_command(create_heat_view_sql)
|
|
||||||
remote_db.close()
|
|
||||||
logger.info("Heat View Created")\
|
|
||||||
|
|
||||||
def get_heat_view():
|
|
||||||
get_heat_view_sql = """
|
|
||||||
SELECT latitude, longitude, year
|
|
||||||
FROM heat;
|
|
||||||
"""
|
|
||||||
|
|
||||||
remote_db = RemoteDB()
|
|
||||||
|
|
||||||
# Get heat map data from database
|
|
||||||
try:
|
|
||||||
result = remote_db.execute_query(get_heat_view_sql)
|
|
||||||
logger.info(f"Succesfully retrieved result")
|
|
||||||
return result
|
|
||||||
except Exception as e:
|
|
||||||
logger.exception(f"Failed getting result with exception {e}")
|
|
||||||
finally:
|
|
||||||
remote_db.close()
|
|
||||||
|
|
||||||
def create_heat_map_with_time():
|
def create_heat_map_with_time():
|
||||||
|
|
||||||
|
|
||||||
# Process heat map data
|
# Process heat map data
|
||||||
heat_view_data = get_heat_view()
|
heat_view_data = get_view("heat")
|
||||||
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)}"
|
||||||
@ -144,6 +93,22 @@ def create_heat_map_with_time():
|
|||||||
|
|
||||||
folium.LayerControl(collapsed=True).add_to(interactive_map)
|
folium.LayerControl(collapsed=True).add_to(interactive_map)
|
||||||
|
|
||||||
|
def create_heat_map_toggle():
|
||||||
|
|
||||||
|
heat_view_data = get_view("heat")
|
||||||
|
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)
|
||||||
|
|
||||||
|
# Layer Adding Methods ================================================================================================
|
||||||
|
|
||||||
|
|
||||||
def add_heat_map_time(heat_df, map):
|
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
|
heat_data = [[[row['latitude'], row['longitude'], 0.1] for index, row in heat_df[heat_df['year'] == i].iterrows()] for
|
||||||
@ -166,7 +131,11 @@ def add_heat_map_time(heat_df, map):
|
|||||||
|
|
||||||
def add_signaled_speeds(map):
|
def add_signaled_speeds(map):
|
||||||
# Add signald speeds data
|
# Add signald speeds data
|
||||||
sig_speeds_data = get_signaled_speed_sql()
|
rows = """
|
||||||
|
temporegime_technical as tempo,
|
||||||
|
wkb_geometry
|
||||||
|
"""
|
||||||
|
sig_speeds_data = get_view("signaled_speeds", rows)
|
||||||
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()}")
|
||||||
@ -183,22 +152,6 @@ def add_signaled_speeds(map):
|
|||||||
line_cap="butt",
|
line_cap="butt",
|
||||||
).add_to(map)
|
).add_to(map)
|
||||||
|
|
||||||
|
|
||||||
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):
|
def add_heat_year_toggle(heat_gdf, map):
|
||||||
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
|
||||||
@ -219,31 +172,13 @@ def add_heat_year_toggle(heat_gdf, map):
|
|||||||
heatmap_layer.add_to(map)
|
heatmap_layer.add_to(map)
|
||||||
|
|
||||||
|
|
||||||
def get_signaled_speed_sql():
|
|
||||||
sigspeed_sql = """
|
|
||||||
SELECT
|
|
||||||
temporegime_technical as tempo,
|
|
||||||
wkb_geometry
|
|
||||||
FROM signaled_speeds;
|
|
||||||
"""
|
|
||||||
remote_db = RemoteDB()
|
|
||||||
try:
|
|
||||||
result = remote_db.execute_query(sigspeed_sql)
|
|
||||||
logger.info(f"Succesfully retrieved result")
|
|
||||||
return result
|
|
||||||
except Exception as e:
|
|
||||||
logger.exception(f"Failed getting result with exception {e}")
|
|
||||||
finally:
|
|
||||||
remote_db.close()
|
|
||||||
|
|
||||||
|
|
||||||
def save_map_as_html(map, name):
|
def save_map_as_html(map, name):
|
||||||
map.save(f"{name}.html")
|
map.save(f"{name}.html")
|
||||||
logger.info(f"Succesfully saved map {name}.")
|
logger.info(f"Succesfully saved map {name}.")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
drop_heat_view()
|
drop_view("heat")
|
||||||
create_heat_view()
|
create_heat_view()
|
||||||
create_heat_map_with_time()
|
create_heat_map_with_time()
|
||||||
save_map_as_html(interactive_map, "heat_map_time")
|
save_map_as_html(interactive_map, "heat_map_time")
|
||||||
|
|||||||
Reference in New Issue
Block a user