amosfang's picture
Create utils.py
b92f7cb verified
import requests
import json
import pandas as pd
import gmplot
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
import os
from dotenv import load_dotenv
# Load the .env file
load_dotenv()
lta_data_mall_token = os.getenv('LTA_DATAMALL_API_KEY')
headers = {
'AccountKey': lta_data_mall_token
}
payload = {}
def get_lta_data(url_dict, headers=headers, payload=payload):
for key, url in url_dict.items():
response = requests.request("GET", url, headers=headers, data=payload)
json_data = response.text
data_dict = json.loads(json_data)
if key == "Incidents":
incidents_df = pd.DataFrame(data_dict['value'])
elif key == "SpeedBands":
speedbands_df = pd.DataFrame(data_dict['value'])
return incidents_df, speedbands_df
def zip_columns(row):
'''
Function to zip values from four columns
'''
return list(zip([row['StartLat'], row['StartLon']], [row['EndLat'], row['EndLon']]))
# Define color mapping function
def get_color_from_value(value):
'''
This function allows you to change the colors of the plotted points on Google Map.
For example, you could use a gradient scale based on value ranges
Return the color based on your logic
'''
# Example: Mapping values from 0 to 100 to a gradient scale from red to green
min_value = 0
max_value = 1
# Can be used with color gradient
normalized_value = (value - min_value) / (max_value - min_value) # Normalize value between 0 and 1
if normalized_value <= 0.5:
return '#ffff00' # Yellow color for values less than or equal to 0
elif normalized_value >= 0.5:
return '#ff0000' # Red color for values greater than or equal to 1
else:
return '#0000ff' # Blue color for other values
def plot_polygon_with_speed(polygons, speeds, gmap, map='map.html'):
# Define a custom color map from red to blue
colors = [(1, 0, 0), (0, 0, 1)] # Red to Blue
cmap = LinearSegmentedColormap.from_list("CustomMap", colors, N=8)
# Plot polygons with corresponding colors based on speed
for polygon, speed in zip(polygons, speeds):
color = cmap(speed / 8) # Map speed to color gradient
# Convert latitudes and longitudes to floats
lats = [float(polygon[0][0]), float(polygon[0][1])]
lngs = [float(polygon[1][0]), float(polygon[1][1])]
gmap.polygon(lats, lngs, color='#%02x%02x%02x' % (int(color[0]*255), int(color[1]*255), int(color[2]*255)), edge_width=2)
# Draw the map
gmap.draw(map)