diff --git a/pymove/tests/test_visualization_folium.py b/pymove/tests/test_visualization_folium.py index 588c71e5..300c2f33 100644 --- a/pymove/tests/test_visualization_folium.py +++ b/pymove/tests/test_visualization_folium.py @@ -1076,73 +1076,6 @@ def test_plot_event_folium(tmpdir): ) -def test_show_trajs_with_event(): - - move_df = _default_move_df() - - df_event = move_df.iloc[0:3, :] - - list_ = folium.show_trajs_with_event( - move_data=move_df, - window_time_subject=4, - df_event=df_event, - window_time_event=4, - radius=150, - event_lat=LATITUDE, - event_lon=LONGITUDE, - event_datetime=DATETIME, - user_lat=LATITUDE, - user_lon=LONGITUDE, - user_datetime=DATETIME, - event_id='id', - event_point=EVENT_POINT, - user_id='id', - user_point=USER_POINT, - line_color=LINE_COLOR, - slice_event_show=None, - slice_subject_show=None, - ) - - assert len(list_) == 3, 'list with wrong number of elements' - for i in list_: - base_map = i[0] - assert(base_map.control_scale is True) - - -def test_show_traj_id_with_event(): - - move_df = _default_move_df() - - df_event = move_df.iloc[0:3, :] - - list_ = folium.show_traj_id_with_event( - move_data=move_df, - window_time_subject=4, - subject_id=1, - df_event=df_event, - window_time_event=4, - radius=150, - event_lat=LATITUDE, - event_lon=LONGITUDE, - event_datetime=DATETIME, - user_lat=LATITUDE, - user_lon=LONGITUDE, - user_datetime=DATETIME, - event_id='id', - event_point=EVENT_POINT, - user_id='id', - user_point=USER_POINT, - line_color=LINE_COLOR, - slice_event_show=None, - slice_subject_show=None, - ) - - assert type(list_) == tuple, 'Wrong type' - assert len(list_) == 2, 'list with wrong number of elements' - assert len(list_[1]) == 2 - assert list_[0].control_scale is True - - def test_create_geojson_features_line(): move_df = _default_move_df() diff --git a/pymove/visualization/folium.py b/pymove/visualization/folium.py index 2eb84256..2755e34e 100644 --- a/pymove/visualization/folium.py +++ b/pymove/visualization/folium.py @@ -19,8 +19,6 @@ plot_points_folium, plot_poi_folium, plot_event_folium, -show_trajs_with_event, -show_traj_id_with_event, plot_traj_timestamp_geo_json """ @@ -30,14 +28,11 @@ import folium import numpy as np -import pandas as pd from folium import Map, plugins from folium.plugins import FastMarkerCluster, HeatMap, HeatMapWithTime, MarkerCluster from pandas import DataFrame from pymove import PandasMoveDataFrame -from pymove.preprocessing import filters -from pymove.utils import distances from pymove.utils.constants import ( COUNT, DATE, @@ -93,6 +88,18 @@ def save_map( ------- Map folium map or None + + Examples + -------- + >>> from pymove.visualization.folium import save_map + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> save_map(df, filename='test.map') """ map_ = folium.Map(tiles=tiles) map_.fit_bounds( @@ -148,6 +155,18 @@ def create_base_map( ------- Map a folium map + + Examples + -------- + >>> from pymove.visualization.folium import create_base_map + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> create_base_map(move_df) """ if lat_origin is None and lon_origin is None: lat_origin = move_data[LATITUDE].median() @@ -205,6 +224,18 @@ def heatmap( ------- Map folium Map + + Examples + -------- + >>> from pymove.visualization.folium import heatmap + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> heatmap(move_df) """ if base_map is None: base_map = create_base_map( @@ -284,6 +315,18 @@ def heatmap_with_time( ------- Map folium Map + + Examples + -------- + >>> from pymove.visualization.folium import heatmap_with_time + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> heatmap_with_time(move_df) """ if base_map is None: base_map = create_base_map( @@ -369,6 +412,18 @@ def cluster( ------- Map folium Map + + Examples + -------- + >>> from pymove.visualization.folium import cluster + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> cluster(move_df) """ if base_map is None: base_map = create_base_map( @@ -447,6 +502,18 @@ def faster_cluster( ------- Map folium Map + + Examples + -------- + >>> from pymove.visualization.folium import faster_cluster + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> faster_cluster(move_df) """ if base_map is None: base_map = create_base_map( @@ -520,6 +587,18 @@ def plot_markers( ------- Map folium Map + + Examples + -------- + >>> from pymove.visualization.folium import plot_markers + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_markers(move_df) """ if base_map is None: base_map = create_base_map( @@ -596,6 +675,26 @@ def _filter_and_generate_colors( list of tuples list containing a combination of id and color + Examples + -------- + >>> from pymove.visualization.folium import _filter_and_generate_colors + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 2 + 4 39.984217 116.319422 2008-10-23 05:53:21 2 + >>> df, colors = _filter_and_generate_colors(move_df) + >>> df + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 2 + 4 39.984217 116.319422 2008-10-23 05:53:21 2 + >>> colors + [(1, '#e41a1c'), (2, '#377eb8')] """ if n_rows is None: n_rows = move_data.shape[0] @@ -664,6 +763,22 @@ def _filter_generated_feature( dataframe filtered dataframe + Examples + -------- + >>> from pymove.visualization.folium import _filter_generated_feature + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> _filter_generated_feature(move_df, feature='lat', values=[39.984198]) + lat lon datetime id + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + >>> _filter_generated_feature(move_df, feature='lon', values=[116.319236]) + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 """ if len(values) == 1: mv_df = move_data[move_data[feature] == values[0]] @@ -699,6 +814,19 @@ def _add_begin_end_markers_to_folium_map( Color of the markers, by default None id: int, optional Id of the trajectory, by default None + + Examples + -------- + >>> from pymove.visualization.folium import _add_begin_end_markers_to_folium_map + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> map = create_base_map(move_df) + >>> _add_begin_end_markers_to_folium_map(move_df, map) """ points = folium.map.FeatureGroup( 'The start and end points of trajectory {}'.format(_id or '') @@ -751,6 +879,20 @@ def _add_trajectories_to_folium_map( filename : str, optional Represents the file name of new file .html, by default 'map.html'. + Examples + -------- + >>> from pymove.visualization.folium import _add_trajectories_to_folium_map + >>> move_df + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 3 39.988118 116.326672 2008-10-25 14:39:19 5 + 4 39.987965 116.326675 2008-10-25 14:39:24 5 + >>> _add_trajectories_to_folium_map( + >>> move_data=move_df, + >>> base_map=map1, + >>> items=[(1, 'red'), [5, 'green']] + >>> ) """ for _id, color in items: mv = move_data[move_data[TRAJ_ID] == _id] @@ -826,6 +968,17 @@ def plot_trajectories_with_folium( Map a folium map with visualization. + Examples + -------- + >>> from pymove.visualization.folium import plot_trajectories_with_folium + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_trajectories_with_folium(move_df) """ if base_map is None: base_map = create_base_map( @@ -907,6 +1060,17 @@ def plot_trajectory_by_id_folium( IndexError If there is no user with the id passed + Examples + -------- + >>> from pymove.visualization.folium import plot_trajectory_by_id_folium + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 2 + 4 39.984217 116.319422 2008-10-23 05:53:21 2 + >>> plot_trajectory_by_id_folium(move_df, id_=1) """ if base_map is None: base_map = create_base_map( @@ -994,6 +1158,24 @@ def plot_trajectory_by_period( IndexError If there is no user with the id passed + Examples + -------- + >>> from pymove.visualization.folium import plot_trajectory_by_period + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_trajectory_by_period(move_df, period='Early morning') + >>> move_df.head() + lat lon datetime id period + 0 39.984094 116.319236 2008-10-23 05:53:05 1 Early morning + 1 39.984198 116.319322 2008-10-23 05:53:06 1 Early morning + 2 39.984224 116.319402 2008-10-23 05:53:11 1 Early morning + 3 39.984211 116.319389 2008-10-23 05:53:16 1 Early morning + 4 39.984217 116.319422 2008-10-23 05:53:21 1 Early morning """ if base_map is None: base_map = create_base_map( @@ -1085,6 +1267,24 @@ def plot_trajectory_by_day_week( IndexError If there is no user with the id passed + Examples + -------- + >>> from pymove.visualization.folium import plot_trajectory_by_day_week + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_trajectory_by_day_week(move_df, day_week='Friday') + >>> move_df.head() + lat lon datetime id day + 0 39.984094 116.319236 2008-10-23 05:53:05 1 Thursday + 1 39.984198 116.319322 2008-10-23 05:53:06 1 Thursday + 2 39.984224 116.319402 2008-10-23 05:53:11 1 Thursday + 3 39.984211 116.319389 2008-10-23 05:53:16 1 Thursday + 4 39.984217 116.319422 2008-10-23 05:53:21 1 Thursday """ if base_map is None: base_map = create_base_map( @@ -1179,6 +1379,28 @@ def plot_trajectory_by_date( IndexError If there is no user with the id passed + Examples + -------- + >>> from pymove.visualization.folium import plot_trajectory_by_date + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_trajectory_by_date( + >>> move_df, + >>> start_date='2008-10-23 05:53:05', + >>> end_date='2008-10-23 23:43:56' + >>> ) + >>> move_df.head() + lat lon datetime id date + 0 39.984094 116.319236 2008-10-23 05:53:05 1 2008-10-23 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 2008-10-23 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 2008-10-23 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 2008-10-23 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 2008-10-23 """ if base_map is None: base_map = create_base_map( @@ -1279,6 +1501,23 @@ def plot_trajectory_by_hour( IndexError If there is no user with the id passed + Examples + -------- + >>> from pymove.visualization.folium import plot_trajectory_by_hour + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_trajectory_by_hour(move_df, start_hour=4,end_hour=6) + lat lon datetime id hour + 0 39.984094 116.319236 2008-10-23 05:53:05 1 5 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 5 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 5 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 5 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 5 """ if base_map is None: base_map = create_base_map( @@ -1370,6 +1609,30 @@ def plot_stops( IndexError If there is no user with the id passed + Examples + -------- + >>> from pymove.visualization.folium import plot_stops + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_stops(move_df) + >>> move_df.head() + lat lon datetime id \ + dist_to_prev dist_to_next dist_prev_to_next situation + 0 39.984094 116.319236 2008-10-23 05:53:05 1 \ + NaN 13.690153 NaN nan + 1 39.984198 116.319322 2008-10-23 05:53:06 1 \ + 13.690153 7.403788 20.223428 move + 2 39.984224 116.319402 2008-10-23 05:53:11 1 \ + 7.403788 1.821083 5.888579 move + 3 39.984211 116.319389 2008-10-23 05:53:16 1 \ + 1.821083 2.889671 1.873356 move + 4 39.984217 116.319422 2008-10-23 05:53:21 1 \ + 2.889671 66.555997 68.727260 move """ if base_map is None: base_map = create_base_map( @@ -1443,6 +1706,10 @@ def plot_bbox( Map folium map with bounding box + Examples + -------- + >>> from pymove.visualization.folium import plot_bbox + >>> plot_bbox((39.984094,116.319236,39.997535,116.196345)) """ if base_map is None: base_map = folium.Map(tiles=tiles) @@ -1479,6 +1746,26 @@ def _format_tags(line: Union[List, Dict], slice_: List) -> Text: ------- str: formatted html tag + Examples + -------- + >>> from pymove.visualization.folium import _format_tags, plot_points_folium + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> _format_tags( + >>> line={ + >>> 'lat': 39.984094, + >>> 'lon': 116.319236, + >>> 'datetime': '2008-10-23 05:53:05', + >>> 'id': 1 + >>> }, + >>> slice_=['lat', 'lon', 'datetime', 'id'] + >>> ) + lat: 39.984094
lon: 116.319236
datetime: 2008-10-23 05:53:05
id: 1 """ map_formated_tags = map(lambda tag: '{}: {}'.format(tag, line[tag]), slice_) @@ -1511,6 +1798,29 @@ def _circle_maker( radius: float. radius size. map_: Folium map. + + Examples + -------- + >>> from pymove.visualization.folium import _circle_maker + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> row = move_df.iloc[0] + >>> iter_tuple = (0, row) + >>> user_lat = 'lat' + >>> user_lon = 'lon' + >>> slice_tags = row.keys() + >>> user_point = 'pink' + >>> radius = 10 + >>> map_ = create_base_map(move_df) + >>> _circle_maker( + >>> iter_tuple, user_lat, user_lon, + >>> slice_tags, user_point, radius, map_ + >>> ) """ _, line = iter_tuple @@ -1572,6 +1882,18 @@ def plot_points_folium( ------- Map A folium map + + Examples + -------- + >>> from pymove.visualization.folium import plot_points_folium + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_points_folium(move_df) """ if slice_tags is None: slice_tags = list(move_data.columns) @@ -1645,6 +1967,18 @@ def plot_poi_folium( ------- folium.folium.Map. Represents a folium map with visualization. + + Examples + -------- + >>> from pymove.visualization.folium import plot_poi_folium + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_poi_folium(move_df) """ return plot_points_folium( move_data, @@ -1699,6 +2033,18 @@ def plot_event_folium( Returns ------- A folium map. + + Examples + -------- + >>> from pymove.visualization.folium import plot_event_folium + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_event_folium(move_df) """ return plot_points_folium( move_data, @@ -1714,287 +2060,6 @@ def plot_event_folium( ) -def show_trajs_with_event( - move_data: DataFrame, - window_time_subject: float, - df_event: DataFrame, - window_time_event: float, - radius: float, - event_lat: Text = LATITUDE, - event_lon: Text = LONGITUDE, - event_datetime: Text = DATETIME, - user_lat: Text = LATITUDE, - user_lon: Text = LONGITUDE, - user_datetime: Text = DATETIME, - event_id: Text = EVENT_ID, - event_point: Text = EVENT_POINT, - user_id: Text = UID, - user_point: Text = USER_POINT, - line_color: Text = LINE_COLOR, - slice_event_show: Optional[List] = None, - slice_subject_show: Optional[List] = None, -) -> List[Map]: - """ - Plot a trajectory, including your user_points lat lon and your tags. - - Parameters - ---------- - move_data: DataFrame. - Trajectory input data. - window_time_subject: float. - The subject time window. - window_time_event: float. - The event time window. - radius: float. - The radius to use. - event_lat: str, optional - Event latitude column name, by default LATITUDE. - event_lon: str, optional - Event longitude column name, by default LONGITUDE. - event_datetime: str, optional - Event datetime column name, by default DATETIME. - user_lat: str, optional - User latitude column name, by default LATITUDE. - user_lon: str, optional - User longitude column name, by default LONGITUDE. - user_datetime: str, optional - User datetime column name, by default DATETIME. - event_id_: str, optional - Event id column name, by default TRAJ_ID. - event_point: str, optional - Event color, by default EVENT_POI. - user_id: str, optional - User id column name, by default TRAJ_ID. - user_point: str, optional - User point color, by default USER_POINT. - line_color: str, optional - Line color, by default 'blue'. - slice_event_show: list, optional - by default None. - slice_subject_show: list, optional - by default None. - - Returns - ------- - list of Map - A list of folium maps. - - Raises - ------ - ValueError - If feature generation fails - """ - # building structure for deltas - delta_event = pd.to_timedelta(window_time_event, unit='s') - delta_user = pd.to_timedelta(window_time_subject, unit='s') - - # length of df_user - len_df_user = move_data.shape[0] - - # building structure for lat and lon array - lat_arr = np.zeros(len_df_user) - lon_arr = np.zeros(len_df_user) - - # folium map list - folium_maps = [] - - # for each event in df_event - for _, line in df_event.iterrows(): - - e_lat = line[event_lat] - e_lon = line[event_lon] - e_datetime = line[event_datetime] - e_id = line[event_id] - - # building time window for event search - start_time = pd.to_datetime(e_datetime - delta_event) - end_time = pd.to_datetime(e_datetime + delta_event) - - # filtering df_ for time window - df_filtered = filters.by_datetime( - move_data, - start_datetime=start_time, - end_datetime=end_time - ) - - if df_filtered is None: - raise ValueError('Filter datetime failed!') - - # length of df_temp - len_df_temp = df_filtered.shape[0] - - # using the util part of the array for haversine function - lat_arr[:len_df_temp] = e_lat - lon_arr[:len_df_temp] = e_lon - - # building distances to event column - df_filtered['distances'] = distances.haversine( - lat_arr[:len_df_temp], - lon_arr[:len_df_temp], - df_filtered[user_lat].values, - df_filtered[user_lon].values - ) - - # building nearby column - df_filtered['nearby'] = df_filtered['distances'].map(lambda x: (x <= radius)) - - # if any data for df_ in event time window is True - if df_filtered['nearby'].any(): - - # building the df for the first user_points of user in nearby event - df_begin = df_filtered[df_filtered['nearby']].sort_values( - user_datetime - ) - - move_data = df_event[df_event[event_id] == e_id] - - base_map = plot_event_folium( - move_data, - event_lat=event_lat, - event_lon=event_lon, - event_point=event_point, - slice_tags=slice_event_show - ) - - # keep only the first user_point nearby to event for each user - df_begin.drop_duplicates( - subset=[user_id, 'nearby'], - inplace=True - ) - # for each user nearby to event - users = [] - - for time_user, id_user in zip( - df_begin[user_datetime], - df_begin[user_id] - ): - # making the time window for user - start_time = pd.to_datetime(time_user - delta_user) - end_time = pd.to_datetime(time_user + delta_user) - - # building the df for one id - df_id = move_data[move_data[user_id] == id_user] - - # filtering df_id for time window - df_temp = filters.by_datetime( - df_id, - start_datetime=start_time, - end_datetime=end_time - ) - - users.append(df_temp) - # add to folium map created - base_map = plot_trajectories_with_folium( - df_temp, - color=[line_color], - base_map=base_map - ) - base_map = plot_points_folium( - df_temp, - user_lat=user_lat, - user_lon=user_lon, - user_point=user_point, - base_map=base_map, - slice_tags=slice_subject_show - ) - # add to folium maps list: (id event, folium map, quantity of user in map, df) - folium_maps.append((base_map, pd.concat(users))) - - return folium_maps - - -def show_traj_id_with_event( - move_data: DataFrame, - window_time_subject: float, - df_event: DataFrame, - window_time_event: float, - radius: float, - subject_id: int, - event_lat: Text = LATITUDE, - event_lon: Text = LONGITUDE, - event_datetime: Text = DATETIME, - user_lat: Text = LATITUDE, - user_lon: Text = LONGITUDE, - user_datetime: Text = DATETIME, - event_id: Text = EVENT_ID, - event_point: Text = EVENT_POINT, - user_id: Text = UID, - user_point: Text = USER_POINT, - line_color: Text = LINE_COLOR, - slice_event_show: Optional[List] = None, - slice_subject_show: Optional[List] = None, -) -> Map: - """ - Plot a trajectory, including your user_points lat lon and your tags. - - Parameters - ---------- - move_data: DataFrame. - Trajectory input data. - window_time_subject: float. - The subject time window. - window_time_event: float. - The event time window. - radius: float. - The radius to use. - subject_id: int - Id of the trajectory - event_lat: str, optional - Event latitude column name, by default LATITUDE. - event_lon: str, optional - Event longitude column name, by default LONGITUDE. - event_datetime: str, optional - Event datetime column name, by default DATETIME. - user_lat: str, optional - User latitude column name, by default LATITUDE. - user_lon: str, optional - User longitude column name, by default LONGITUDE. - user_datetime: str, optional - User datetime column name, by default DATETIME. - event_id_: str, optional - Event id column name, by default TRAJ_ID. - event_point: str, optional - Event color, by default EVENT_POINT. - user_id: str, optional - User id column name, by default TRAJ_ID. - user_point: str, optional - User point color, by default USER_POINT. - line_color: str, optional - Line color, by default 'blue'. - slice_event_show: list, optional - by default None. - slice_subject_show: list, optional - by default None. - - Returns - ------- - Map - A list of folium maps. - """ - df_id = move_data[move_data[user_id] == subject_id] - - return show_trajs_with_event( - df_id, - window_time_subject, - df_event, - window_time_event, - radius, - event_lat=event_lat, - event_lon=event_lon, - event_datetime=event_datetime, - user_lat=user_lat, - user_lon=user_lon, - user_datetime=user_datetime, - event_id=event_id, - event_point=event_point, - user_id=user_id, - user_point=user_point, - line_color=line_color, - slice_event_show=slice_event_show, - slice_subject_show=slice_subject_show - )[0] - - def _create_geojson_features_line( move_data: DataFrame, label_lat: Text = LATITUDE, @@ -2019,6 +2084,53 @@ def _create_geojson_features_line( ------- list GeoJSON features. + + Examples + -------- + >>> from pymove.visualization.folium import _create_geojson_features_line + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> _create_geojson_features_line(move_df) + [ + { + "type":"Feature", + "geometry":{ + "type":"Linestr", + "coordinates":[ + [ + 116.319236, + 39.984094 + ], + [ + 116.319322, + 39.984198 + ] + ] + }, + "properties":{ + "times":[ + "2008-10-23T05:53:05", + "2008-10-23T05:53:06" + ], + "popup":"lat: 39.984094
lon: 116.319236
\ + datetime: 2008-10-23 05:53:05
id: 1", + "style":{ + "color":"red", + "icon":"circle", + "iconstyle":{ + "color":"red", + "weight":4 + } + } + } + }, + ... + ] """ features = [] @@ -2026,7 +2138,11 @@ def _create_geojson_features_line( _, last = next(row_iterator) columns = move_data.columns - for i, row in progress_bar(row_iterator, total=move_data.shape[0] - 1) : + for i, row in progress_bar( + row_iterator, + total=move_data.shape[0], + desc='Generating GeoJSon' + ): last_time = last[label_datetime].strftime('%Y-%m-%dT%H:%M:%S') next_time = row[label_datetime].strftime('%Y-%m-%dT%H:%M:%S') @@ -2096,6 +2212,18 @@ def plot_traj_timestamp_geo_json( ------- Map A folium map. + + Examples + -------- + >>> from pymove.visualization.folium import plot_traj_timestamp_geo_json + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_traj_timestamp_geo_json(move_df) """ features = _create_geojson_features_line( move_data,