from folium import Map, Marker, PolyLine from pandas import DataFrame, json_normalize from app.data_request import request_dataset from constants import COLUMNS, COORDINATES def create_dataframe(dataset) -> DataFrame: """ Creates a DataFrame from a JSON response """ json = request_dataset(dataset) df = json_normalize(data=json, record_path=["records"], errors="ignore",) filtered_df = df.filter(items=COLUMNS[dataset]) return filtered_df def reverse_coordinates(row): """ Reverses each tuples coordinates to ensure folium can parse them correctly """ coord = [tuple(reversed(t)) for t in row["fields.geo_shape.coordinates"]] return coord def create_map(df): """ Creates a Map with markers or lines from the DataFrame """ m = Map(location=COORDINATES, zoom_start=12, tiles="Stamen Terrain") for index, row in df.iterrows(): if row["fields.geo_shape.type"] == "LineString": coord = reverse_coordinates(row["fields.geo_shape.coordinates"]) PolyLine(locations=coord, color="blue", opacity=0.5).add_to(m) else: lng, lat = row["fields.geo_shape.coordinates"] Marker(location=[lat, lng]).add_to(m) m.save("app/templates/map.html")