diff --git a/1-tutorials/1-getting-started.ipynb b/1-tutorials/1-getting-started.ipynb index 0f6f988..e1a7343 100644 --- a/1-tutorials/1-getting-started.ipynb +++ b/1-tutorials/1-getting-started.ipynb @@ -29,7 +29,7 @@ "import geopandas as gpd\n", "import movingpandas as mpd\n", "import shapely as shp\n", - "import hvplot.pandas \n", + "import hvplot.pandas\n", "\n", "from geopandas import GeoDataFrame, read_file\n", "from shapely.geometry import Point, LineString, Polygon\n", @@ -37,9 +37,12 @@ "from holoviews import opts\n", "\n", "import warnings\n", - "warnings.filterwarnings('ignore')\n", "\n", - "opts.defaults(opts.Overlay(active_tools=['wheel_zoom'], frame_width=500, frame_height=400))\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "opts.defaults(\n", + " opts.Overlay(active_tools=[\"wheel_zoom\"], frame_width=500, frame_height=400)\n", + ")\n", "\n", "mpd.show_versions()" ] @@ -62,12 +65,14 @@ "metadata": {}, "outputs": [], "source": [ - "df = pd.DataFrame([\n", - " {'geometry':Point(0,0), 't':datetime(2018,1,1,12,0,0)},\n", - " {'geometry':Point(6,0), 't':datetime(2018,1,1,12,6,0)},\n", - " {'geometry':Point(6,6), 't':datetime(2018,1,1,12,10,0)},\n", - " {'geometry':Point(9,9), 't':datetime(2018,1,1,12,15,0)}\n", - "]).set_index('t')\n", + "df = pd.DataFrame(\n", + " [\n", + " {\"geometry\": Point(0, 0), \"t\": datetime(2018, 1, 1, 12, 0, 0)},\n", + " {\"geometry\": Point(6, 0), \"t\": datetime(2018, 1, 1, 12, 6, 0)},\n", + " {\"geometry\": Point(6, 6), \"t\": datetime(2018, 1, 1, 12, 10, 0)},\n", + " {\"geometry\": Point(9, 9), \"t\": datetime(2018, 1, 1, 12, 15, 0)},\n", + " ]\n", + ").set_index(\"t\")\n", "gdf = GeoDataFrame(df, crs=31256)\n", "toy_traj = mpd.Trajectory(gdf, 1)\n", "toy_traj" @@ -131,7 +136,7 @@ "metadata": {}, "outputs": [], "source": [ - "df = pd.read_csv('../data/geolife_small.csv', delimiter=';')\n", + "df = pd.read_csv(\"../data/geolife_small.csv\", delimiter=\";\")\n", "df" ] }, @@ -141,7 +146,7 @@ "metadata": {}, "outputs": [], "source": [ - "traj_collection = mpd.TrajectoryCollection(df, 'trajectory_id', t='t', x='X', y='Y')\n", + "traj_collection = mpd.TrajectoryCollection(df, \"trajectory_id\", t=\"t\", x=\"X\", y=\"Y\")\n", "print(traj_collection)" ] }, @@ -151,7 +156,7 @@ "metadata": {}, "outputs": [], "source": [ - "traj_collection.plot(column='trajectory_id', legend=True, figsize=(9,5))" + "traj_collection.plot(column=\"trajectory_id\", legend=True, figsize=(9, 5))" ] }, { @@ -168,7 +173,7 @@ "metadata": {}, "outputs": [], "source": [ - "gdf = read_file('../data/geolife_small.gpkg')\n", + "gdf = read_file(\"../data/geolife_small.gpkg\")\n", "gdf" ] }, @@ -186,7 +191,7 @@ "metadata": {}, "outputs": [], "source": [ - "traj_collection = mpd.TrajectoryCollection(gdf, 'trajectory_id', t='t')\n", + "traj_collection = mpd.TrajectoryCollection(gdf, \"trajectory_id\", t=\"t\")\n", "print(traj_collection)" ] }, @@ -196,7 +201,7 @@ "metadata": {}, "outputs": [], "source": [ - "traj_collection.plot(column='trajectory_id', legend=True, figsize=(9,5))" + "traj_collection.plot(column=\"trajectory_id\", legend=True, figsize=(9, 5))" ] }, { @@ -208,6 +213,22 @@ "traj_collection.plot()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To visualize trajectories in their geographical context, we can also create interactive plots with basemaps:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "traj_collection.explore(column=\"trajectory_id\", cmap=\"plasma\", tiles=\"CartoDB positron\")" + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -232,7 +253,7 @@ "metadata": {}, "outputs": [], "source": [ - "my_traj.plot(linewidth=5, capstyle='round', figsize=(9,3))" + "my_traj.plot(linewidth=5, capstyle=\"round\", figsize=(9, 3))" ] }, { @@ -240,7 +261,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "To visualize trajectories in their geographical context, we can also create interactive plots with basemaps:" + "To visualize trajectories in their geographical context, we can again create interactive plots with basemaps:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "my_traj.hvplot(line_width=7.0, tiles=\"OSM\")" ] }, { @@ -249,7 +279,7 @@ "metadata": {}, "outputs": [], "source": [ - "my_traj.hvplot(line_width=7.0, tiles='OSM')" + "my_traj.explore(tiles=\"CartoDB positron\", style_kwds={\"weight\": 4})" ] }, { @@ -274,7 +304,7 @@ " }\n", ")\n", "gdf = gpd.GeoDataFrame(df, crs=4326)\n", - "tc = mpd.TrajectoryCollection(gdf, traj_id_col='trajectory_id', t='t')\n", + "tc = mpd.TrajectoryCollection(gdf, traj_id_col=\"trajectory_id\", t=\"t\")\n", "tc" ] }, diff --git a/1-tutorials/5-intersecting-with-polygons.ipynb b/1-tutorials/5-intersecting-with-polygons.ipynb index 87a1f0d..b407b59 100644 --- a/1-tutorials/5-intersecting-with-polygons.ipynb +++ b/1-tutorials/5-intersecting-with-polygons.ipynb @@ -26,7 +26,8 @@ "import geopandas as gpd\n", "import movingpandas as mpd\n", "import shapely as shp\n", - "import hvplot.pandas \n", + "import hvplot.pandas\n", + "import folium\n", "\n", "from geopandas import GeoDataFrame, read_file\n", "from shapely.geometry import Point, LineString, Polygon\n", @@ -34,9 +35,12 @@ "from holoviews import opts\n", "\n", "import warnings\n", - "warnings.filterwarnings('ignore')\n", "\n", - "opts.defaults(opts.Overlay(active_tools=['wheel_zoom'], frame_width=500, frame_height=400))\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "opts.defaults(\n", + " opts.Overlay(active_tools=[\"wheel_zoom\"], frame_width=500, frame_height=400)\n", + ")\n", "\n", "mpd.show_versions()" ] @@ -47,8 +51,8 @@ "metadata": {}, "outputs": [], "source": [ - "gdf = read_file('../data/geolife_small.gpkg')\n", - "tc = mpd.TrajectoryCollection(gdf, 'trajectory_id', t='t')" + "gdf = read_file(\"../data/geolife_small.gpkg\")\n", + "tc = mpd.TrajectoryCollection(gdf, \"trajectory_id\", t=\"t\")" ] }, { @@ -65,12 +69,14 @@ "metadata": {}, "outputs": [], "source": [ - "xmin, xmax, ymin, ymax = 116.365035,116.3702945,39.904675,39.907728\n", - "polygon = Polygon([(xmin,ymin), (xmin,ymax), (xmax,ymax), (xmax,ymin), (xmin,ymin)])\n", + "xmin, xmax, ymin, ymax = 116.365035, 116.3702945, 39.904675, 39.907728\n", + "polygon = Polygon(\n", + " [(xmin, ymin), (xmin, ymax), (xmax, ymax), (xmax, ymin), (xmin, ymin)]\n", + ")\n", "\n", "my_traj = tc.trajectories[2]\n", "intersections = my_traj.clip(polygon)\n", - " \n", + "\n", "print(\"Found {} intersections\".format(len(intersections)))" ] }, @@ -81,8 +87,24 @@ "outputs": [], "source": [ "ax = my_traj.plot()\n", - "gpd.GeoSeries(polygon).plot(ax=ax, color='lightgray')\n", - "intersections.plot(ax=ax, color='red', linewidth=5)" + "gpd.GeoSeries(polygon).plot(ax=ax, color=\"lightgray\")\n", + "intersections.plot(ax=ax, color=\"red\", linewidth=5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "m = my_traj.explore(color=\"blue\", style_kwds={\"weight\": 4}, name=\"Trajectory\")\n", + "\n", + "intersections.explore(m=m, color=\"red\", style_kwds={\"weight\": 4}, name=\"Intersection\")\n", + "\n", + "folium.TileLayer(\"OpenStreetMap\").add_to(m)\n", + "folium.LayerControl().add_to(m)\n", + "\n", + "m" ] }, { @@ -120,6 +142,20 @@ "clipped.plot()" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "clipped.explore(\n", + " column=\"trajectory_id\",\n", + " cmap=\"cool\",\n", + " tiles=\"CartoDB positron\",\n", + " style_kwds={\"weight\": 4},\n", + ")" + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -134,10 +170,7 @@ "metadata": {}, "outputs": [], "source": [ - "polygon_feature = {\n", - " \"geometry\": polygon,\n", - " \"properties\": {'field1': 'abc'}\n", - "}" + "polygon_feature = {\"geometry\": polygon, \"properties\": {\"field1\": \"abc\"}}" ] }, { @@ -160,6 +193,15 @@ "intersections.plot()" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "intersections.explore(color=\"blue\", style_kwds={\"weight\": 4})" + ] + }, { "cell_type": "code", "execution_count": null, @@ -195,6 +237,20 @@ "intersections.plot()" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "intersections.explore(\n", + " column=\"trajectory_id\",\n", + " cmap=\"autumn\",\n", + " tiles=\"CartoDB positron\",\n", + " style_kwds={\"weight\": 4},\n", + ")" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/1-tutorials/8-detecting-stops.ipynb b/1-tutorials/8-detecting-stops.ipynb index e427686..f13348c 100644 --- a/1-tutorials/8-detecting-stops.ipynb +++ b/1-tutorials/8-detecting-stops.ipynb @@ -30,8 +30,9 @@ "import geopandas as gpd\n", "import movingpandas as mpd\n", "import shapely as shp\n", - "import hvplot.pandas \n", + "import hvplot.pandas\n", "import matplotlib.pyplot as plt\n", + "import folium\n", "\n", "from geopandas import GeoDataFrame, read_file\n", "from shapely.geometry import Point, LineString, Polygon\n", @@ -39,10 +40,13 @@ "from holoviews import opts\n", "\n", "import warnings\n", - "warnings.filterwarnings('ignore')\n", "\n", - "plot_defaults = {'linewidth':5, 'capstyle':'round', 'figsize':(9,3), 'legend':True}\n", - "opts.defaults(opts.Overlay(active_tools=['wheel_zoom'], frame_width=500, frame_height=400))\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "plot_defaults = {\"linewidth\": 5, \"capstyle\": \"round\", \"figsize\": (9, 3), \"legend\": True}\n", + "opts.defaults(\n", + " opts.Overlay(active_tools=[\"wheel_zoom\"], frame_width=500, frame_height=400)\n", + ")\n", "\n", "mpd.show_versions()" ] @@ -53,8 +57,8 @@ "metadata": {}, "outputs": [], "source": [ - "gdf = read_file('../data/geolife_small.gpkg')\n", - "tc = mpd.TrajectoryCollection(gdf, 'trajectory_id', t='t')" + "gdf = read_file(\"../data/geolife_small.gpkg\")\n", + "tc = mpd.TrajectoryCollection(gdf, \"trajectory_id\", t=\"t\")" ] }, { @@ -81,7 +85,12 @@ "metadata": {}, "outputs": [], "source": [ - "traj_plot = my_traj.hvplot(title='Trajectory {}'.format(my_traj.id), line_width=7.0, tiles='CartoLight', color='slategray') \n", + "traj_plot = my_traj.hvplot(\n", + " title=\"Trajectory {}\".format(my_traj.id),\n", + " line_width=7.0,\n", + " tiles=\"CartoLight\",\n", + " color=\"slategray\",\n", + ")\n", "traj_plot" ] }, @@ -109,7 +118,9 @@ "outputs": [], "source": [ "%%time\n", - "stop_time_ranges = detector.get_stop_time_ranges(min_duration=timedelta(seconds=60), max_diameter=100)" + "stop_time_ranges = detector.get_stop_time_ranges(\n", + " min_duration=timedelta(seconds=60), max_diameter=100\n", + ")" ] }, { @@ -118,7 +129,7 @@ "metadata": {}, "outputs": [], "source": [ - "for x in stop_time_ranges: \n", + "for x in stop_time_ranges:\n", " print(x)" ] }, @@ -137,7 +148,9 @@ "outputs": [], "source": [ "%%time\n", - "stop_points = detector.get_stop_points(min_duration=timedelta(seconds=60), max_diameter=100)" + "stop_points = detector.get_stop_points(\n", + " min_duration=timedelta(seconds=60), max_diameter=100\n", + ")" ] }, { @@ -155,10 +168,48 @@ "metadata": {}, "outputs": [], "source": [ - "stop_point_plot = traj_plot * stop_points.hvplot(geo=True, size='duration_s', color='deeppink')\n", + "stop_point_plot = traj_plot * stop_points.hvplot(\n", + " geo=True, size=\"duration_s\", color=\"deeppink\"\n", + ")\n", "stop_point_plot" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "stop_points_gdf = gpd.GeoDataFrame(stop_points, geometry=\"geometry\", crs=\"EPSG:4326\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "m = my_traj.explore(\n", + " color=\"blue\",\n", + " style_kwds={\"weight\": 4},\n", + " name=\"Trajectory\",\n", + ")\n", + "\n", + "stop_points_gdf.explore(\n", + " m=m,\n", + " color=\"red\",\n", + " style_kwds={\n", + " \"style_function\": lambda x: {\"radius\": x[\"properties\"][\"duration_s\"] / 10}\n", + " },\n", + " name=\"Stop points\",\n", + ")\n", + "\n", + "folium.TileLayer(\"OpenStreetMap\").add_to(m)\n", + "folium.LayerControl().add_to(m)\n", + "\n", + "m" + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -174,7 +225,9 @@ "outputs": [], "source": [ "%%time\n", - "stop_segments = detector.get_stop_segments(min_duration=timedelta(seconds=60), max_diameter=100)" + "stop_segments = detector.get_stop_segments(\n", + " min_duration=timedelta(seconds=60), max_diameter=100\n", + ")" ] }, { @@ -192,10 +245,50 @@ "metadata": {}, "outputs": [], "source": [ - "stop_segment_plot = stop_point_plot * stop_segments.hvplot(line_width=7.0, tiles=None, color='orange') \n", + "stop_segment_plot = stop_point_plot * stop_segments.hvplot(\n", + " line_width=7.0, tiles=None, color=\"orange\"\n", + ")\n", "stop_segment_plot" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "m = my_traj.explore(\n", + " color=\"blue\",\n", + " tooltip=\"trajectory_id\",\n", + " popup=True,\n", + " style_kwds={\"weight\": 4},\n", + " name=\"Trajectory\",\n", + ")\n", + "\n", + "stop_segments.explore(\n", + " m=m,\n", + " color=\"orange\",\n", + " tooltip=\"trajectory_id\",\n", + " popup=True,\n", + " style_kwds={\"weight\": 4},\n", + " name=\"Stop segments\",\n", + ")\n", + "\n", + "stop_points_gdf.explore(\n", + " m=m,\n", + " color=\"red\",\n", + " tooltip=\"stop_id\",\n", + " popup=True,\n", + " marker_kwds={\"radius\": 3},\n", + " name=\"Stop points\",\n", + ")\n", + "\n", + "folium.TileLayer(\"CartoDB positron\").add_to(m)\n", + "folium.LayerControl().add_to(m)\n", + "\n", + "m" + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -211,7 +304,9 @@ "outputs": [], "source": [ "%%time\n", - "split = mpd.StopSplitter(my_traj).split(min_duration=timedelta(seconds=60), max_diameter=100)" + "split = mpd.StopSplitter(my_traj).split(\n", + " min_duration=timedelta(seconds=60), max_diameter=100\n", + ")" ] }, { @@ -238,7 +333,22 @@ "metadata": {}, "outputs": [], "source": [ - "stop_segment_plot + split.hvplot(title='Trajectory {} split at stops'.format(my_traj.id), line_width=7.0, tiles='CartoLight')" + "split.explore(\n", + " column=\"trajectory_id\", tiles=\"CartoDB dark_matter\", style_kwds={\"weight\": 4}\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "stop_segment_plot + split.hvplot(\n", + " title=\"Trajectory {} split at stops\".format(my_traj.id),\n", + " line_width=7.0,\n", + " tiles=\"CartoLight\",\n", + ")" ] }, { @@ -259,7 +369,9 @@ "source": [ "%%time\n", "detector = mpd.TrajectoryStopDetector(tc)\n", - "stop_points = detector.get_stop_points(min_duration=timedelta(seconds=120), max_diameter=100)\n", + "stop_points = detector.get_stop_points(\n", + " min_duration=timedelta(seconds=120), max_diameter=100\n", + ")\n", "len(stop_points)" ] }, @@ -269,8 +381,37 @@ "metadata": {}, "outputs": [], "source": [ - "ax = tc.plot(figsize=(7,7))\n", - "stop_points.plot(ax=ax, color='red')" + "ax = tc.plot(figsize=(7, 7))\n", + "stop_points.plot(ax=ax, color=\"red\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "m = tc.explore(\n", + " column=\"trajectory_id\",\n", + " tooltip=\"trajectory_id\",\n", + " popup=True,\n", + " style_kwds={\"weight\": 4},\n", + " name=\"Trajectories\",\n", + ")\n", + "\n", + "stop_points.explore(\n", + " m=m,\n", + " color=\"red\",\n", + " tooltip=\"stop_id\",\n", + " popup=True,\n", + " marker_kwds={\"radius\": 5},\n", + " name=\"Stop points\",\n", + ")\n", + "\n", + "folium.TileLayer(\"CartoDB positron\").add_to(m)\n", + "folium.LayerControl().add_to(m)\n", + "\n", + "m" ] }, { diff --git a/1-tutorials/9-aggregating-trajectories.ipynb b/1-tutorials/9-aggregating-trajectories.ipynb index 30d0ed7..dd9047b 100644 --- a/1-tutorials/9-aggregating-trajectories.ipynb +++ b/1-tutorials/9-aggregating-trajectories.ipynb @@ -32,8 +32,9 @@ "import geopandas as gpd\n", "import movingpandas as mpd\n", "import shapely as shp\n", - "import hvplot.pandas \n", + "import hvplot.pandas\n", "import matplotlib.pyplot as plt\n", + "import folium\n", "\n", "from geopandas import GeoDataFrame, read_file\n", "from shapely.geometry import Point, LineString, Polygon\n", @@ -41,10 +42,13 @@ "from holoviews import opts, dim\n", "\n", "import warnings\n", - "warnings.filterwarnings('ignore')\n", "\n", - "plot_defaults = {'linewidth':5, 'capstyle':'round', 'figsize':(9,3), 'legend':True}\n", - "opts.defaults(opts.Overlay(active_tools=['wheel_zoom'], frame_width=500, frame_height=400))\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "plot_defaults = {\"linewidth\": 5, \"capstyle\": \"round\", \"figsize\": (9, 3), \"legend\": True}\n", + "opts.defaults(\n", + " opts.Overlay(active_tools=[\"wheel_zoom\"], frame_width=500, frame_height=400)\n", + ")\n", "\n", "mpd.show_versions()" ] @@ -55,8 +59,17 @@ "metadata": {}, "outputs": [], "source": [ - "gdf = read_file('../data/geolife_small.gpkg')\n", - "tc = mpd.TrajectoryCollection(gdf, 'trajectory_id', t='t')" + "gdf = read_file(\"../data/geolife_small.gpkg\")\n", + "tc = mpd.TrajectoryCollection(gdf, \"trajectory_id\", t=\"t\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tc.hvplot(line_width=7.0, tiles=\"StamenTonerBackground\")" ] }, { @@ -65,7 +78,7 @@ "metadata": {}, "outputs": [], "source": [ - "tc.hvplot(line_width=7.0, tiles='StamenTonerBackground')" + "tc.explore(column=\"trajectory_id\", cmap=\"plasma\", style_kwds={\"weight\": 4})" ] }, { @@ -99,7 +112,12 @@ "metadata": {}, "outputs": [], "source": [ - "aggregator = mpd.TrajectoryCollectionAggregator(generalized, max_distance=1000, min_distance=100, min_stop_duration=timedelta(minutes=5))" + "aggregator = mpd.TrajectoryCollectionAggregator(\n", + " generalized,\n", + " max_distance=1000,\n", + " min_distance=100,\n", + " min_stop_duration=timedelta(minutes=5),\n", + ")" ] }, { @@ -110,8 +128,26 @@ "source": [ "pts = aggregator.get_significant_points_gdf()\n", "clusters = aggregator.get_clusters_gdf()\n", - "( pts.hvplot(geo=True, tiles='StamenTonerBackground') * \n", - " clusters.hvplot(geo=True, color='red' ) )" + "(\n", + " pts.hvplot(geo=True, tiles=\"StamenTonerBackground\")\n", + " * clusters.hvplot(geo=True, color=\"red\")\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "m = pts.explore(marker_kwds={\"radius\": 3}, name=\"Significant points\")\n", + "\n", + "clusters.explore(m=m, color=\"red\", marker_kwds={\"radius\": 3}, name=\"Cluster centroids\")\n", + "\n", + "folium.TileLayer(\"CartoDB positron\").add_to(m)\n", + "folium.LayerControl().add_to(m)\n", + "\n", + "m" ] }, { @@ -129,8 +165,40 @@ "metadata": {}, "outputs": [], "source": [ - "( flows.hvplot(geo=True, hover_cols=['weight'], line_width=dim('weight')*7, color='#1f77b3', tiles='StamenTonerBackground') * \n", - " clusters.hvplot(geo=True, color='red', size=dim('n') ) )" + "(\n", + " flows.hvplot(\n", + " geo=True,\n", + " hover_cols=[\"weight\"],\n", + " line_width=dim(\"weight\") * 7,\n", + " color=\"#1f77b3\",\n", + " tiles=\"StamenTonerBackground\",\n", + " )\n", + " * clusters.hvplot(geo=True, color=\"red\", size=dim(\"n\"))\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "m = flows.explore(\n", + " style_kwds={\"weight\": 5},\n", + " name=\"Flows\",\n", + ")\n", + "\n", + "clusters.explore(\n", + " m=m,\n", + " color=\"red\",\n", + " style_kwds={\"style_function\": lambda x: {\"radius\": x[\"properties\"][\"n\"]}},\n", + " name=\"Clusters\",\n", + ")\n", + "\n", + "folium.TileLayer(\"OpenStreetMap\").add_to(m)\n", + "folium.LayerControl().add_to(m)\n", + "\n", + "m" ] }, { diff --git a/1-tutorials/99-mini-example.ipynb b/1-tutorials/99-mini-example.ipynb index 59070cc..6354db7 100644 --- a/1-tutorials/99-mini-example.ipynb +++ b/1-tutorials/99-mini-example.ipynb @@ -24,7 +24,8 @@ "outputs": [], "source": [ "import warnings\n", - "warnings.filterwarnings('ignore')" + "\n", + "warnings.filterwarnings(\"ignore\")" ] }, { @@ -37,7 +38,8 @@ "import geopandas as gpd\n", "import movingpandas as mpd\n", "from hvplot import pandas\n", - "from datetime import datetime, timedelta" + "from datetime import datetime, timedelta\n", + "import folium" ] }, { @@ -56,8 +58,17 @@ "metadata": {}, "outputs": [], "source": [ - "gdf = gpd.read_file('../data/geolife_small.gpkg')\n", - "gdf.plot(figsize=(9,5))" + "gdf = gpd.read_file(\"../data/geolife_small.gpkg\")\n", + "gdf.plot(figsize=(9, 5))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gdf.hvplot(geo=True).opts(active_tools=[\"pan\", \"wheel_zoom\"])" ] }, { @@ -66,7 +77,7 @@ "metadata": {}, "outputs": [], "source": [ - "gdf.hvplot(geo=True).opts(active_tools=['pan', 'wheel_zoom'])" + "gdf.explore()" ] }, { @@ -91,7 +102,7 @@ "metadata": {}, "outputs": [], "source": [ - "tc = mpd.TrajectoryCollection(gdf, 'trajectory_id', t='t')\n", + "tc = mpd.TrajectoryCollection(gdf, \"trajectory_id\", t=\"t\")\n", "tc" ] }, @@ -101,7 +112,16 @@ "metadata": {}, "outputs": [], "source": [ - "tc.plot(column='trajectory_id', legend=True, figsize=(9,5))" + "tc.plot(column=\"trajectory_id\", legend=True, figsize=(9, 5))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tc.explore(column=\"trajectory_id\", cmap=\"plasma\", style_kwds={\"weight\": 4})" ] }, { @@ -118,7 +138,9 @@ "metadata": {}, "outputs": [], "source": [ - "tc.plot(column='speed', linewidth=5, capstyle='round', legend=True, vmax=20, figsize=(9,5))" + "tc.plot(\n", + " column=\"speed\", linewidth=5, capstyle=\"round\", legend=True, vmax=20, figsize=(9, 5)\n", + ")" ] }, { @@ -136,7 +158,19 @@ "outputs": [], "source": [ "detector = mpd.TrajectoryStopDetector(tc)\n", - "stop_points = detector.get_stop_points(min_duration=timedelta(seconds=120), max_diameter=100)" + "stop_points = detector.get_stop_points(\n", + " min_duration=timedelta(seconds=120), max_diameter=100\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ax = tc.plot(figsize=(9, 5))\n", + "stop_points.plot(ax=ax, color=\"red\", markersize=100)" ] }, { @@ -145,8 +179,10 @@ "metadata": {}, "outputs": [], "source": [ - "ax = tc.plot(figsize=(9,5))\n", - "stop_points.plot(ax=ax, color='red', markersize=100)" + "(\n", + " tc.hvplot(line_width=7, tiles=None, frame_width=400, frame_height=400)\n", + " * stop_points.hvplot(geo=True, color=\"black\", size=100)\n", + ")" ] }, { @@ -155,8 +191,23 @@ "metadata": {}, "outputs": [], "source": [ - "( tc.hvplot(line_width=7, tiles=None, frame_width=400, frame_height=400) * \n", - " stop_points.hvplot(geo=True, color='black', size=100) )" + "m = tc.explore(\n", + " column=\"trajectory_id\",\n", + " cmap=\"autumn\",\n", + " style_kwds={\"weight\": 4},\n", + " name=\"Trajectories\",\n", + ")\n", + "\n", + "stop_points.explore(\n", + " m=m,\n", + " marker_kwds={\"radius\": 4},\n", + " name=\"Stop points\",\n", + ")\n", + "\n", + "folium.TileLayer(\"CartoDB dark_matter\").add_to(m)\n", + "folium.LayerControl().add_to(m)\n", + "\n", + "m" ] }, { diff --git a/2-analysis-examples/horse-collar.ipynb b/2-analysis-examples/horse-collar.ipynb index b11d7b2..2990bd9 100644 --- a/2-analysis-examples/horse-collar.ipynb +++ b/2-analysis-examples/horse-collar.ipynb @@ -638,6 +638,15 @@ "tc.hvplot()" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tc.to_traj_gdf().explore(color=\"orange\", tiles=\"CartoDB positron\")" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -948,6 +957,43 @@ "stops.hvplot(geo=True, tiles=\"OSM\", color=\"deeppink\", size=MAX_DIAMETER, alpha=0.2)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Preferred stop locations in another visualization: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "stops_gdf = gpd.GeoDataFrame(stops, geometry=\"geometry\", crs=\"EPSG:4326\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "stops_gdf.explore(\n", + " tiles=\"CartoDB positron\",\n", + " tooltip=\"traj_id\",\n", + " popup=True,\n", + " marker_type=\"marker\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lastly, stop duration:" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/2-analysis-examples/iceberg.ipynb b/2-analysis-examples/iceberg.ipynb index eaed201..c545f9b 100644 --- a/2-analysis-examples/iceberg.ipynb +++ b/2-analysis-examples/iceberg.ipynb @@ -138,6 +138,15 @@ ")" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "traj.explore(color=\"#ff00ff\", tiles=\"CartoDB dark_matter\", style_kwds={\"weight\": 4})" + ] + }, { "cell_type": "markdown", "metadata": {}, diff --git a/2-analysis-examples/osm-traces.ipynb b/2-analysis-examples/osm-traces.ipynb index 46c9c0f..ff74c0e 100644 --- a/2-analysis-examples/osm-traces.ipynb +++ b/2-analysis-examples/osm-traces.ipynb @@ -134,6 +134,15 @@ "track.plot()" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "track.explore(color=\"red\")" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -155,6 +164,20 @@ "osm_traces.hvplot(title=\"OSM Traces\", line_width=7, width=700, height=400)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "osm_traces.explore(\n", + " column=\"track_fid\",\n", + " tiles=\"cartoDB positron\",\n", + " cmap=\"gist_rainbow\",\n", + " style_kwds={\"weight\": 4},\n", + ")" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/2-analysis-examples/ship-data.ipynb b/2-analysis-examples/ship-data.ipynb index 8c8703e..f3c9096 100644 --- a/2-analysis-examples/ship-data.ipynb +++ b/2-analysis-examples/ship-data.ipynb @@ -42,6 +42,7 @@ "import shapely as shp\n", "import hvplot.pandas\n", "import matplotlib.pyplot as plt\n", + "import folium\n", "\n", "from geopandas import GeoDataFrame, read_file\n", "from shapely.geometry import Point, LineString, Polygon\n", @@ -237,6 +238,22 @@ ")" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "passenger.explore(\n", + " column=\"MMSI\",\n", + " cmap=\"turbo\",\n", + " tiles=\"CartoDB positron\",\n", + " tooltip=\"Name\",\n", + " popup=True,\n", + " legend=False,\n", + ")" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -286,6 +303,24 @@ ")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or the changes in speed:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "my_traj.explore(\n", + " column=\"SOG\", cmap=\"plasma\", tiles=\"CartoDB positron\", style_kwds={\"weight\": 5}\n", + ")" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -338,6 +373,15 @@ ")" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "bridge_traj.explore(color=\"red\", tiles=\"CartoDB positron\", style_kwds={\"weight\": 5})" + ] + }, { "cell_type": "code", "execution_count": null, @@ -391,6 +435,22 @@ ")" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "trips.explore(\n", + " column=\"MMSI\",\n", + " cmap=\"hsv\",\n", + " tiles=\"CartoDB positron\",\n", + " tooltip=\"Name\",\n", + " popup=True,\n", + " legend=False,\n", + ")" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -422,6 +482,24 @@ ")" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "origins_gdf = gpd.GeoDataFrame(origins, geometry=\"geometry\", crs=4326)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "origins_gdf.explore(column=\"Name\", tiles=\"CartoDB positron\", marker_kwds={\"radius\": 5})" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -447,6 +525,17 @@ ")" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "origins_gdf.explore(\n", + " column=\"SOG\", tiles=\"CartoDB positron\", legend=False, marker_kwds={\"radius\": 5}\n", + ")" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -721,6 +810,37 @@ ")" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "summary_gdf = gpd.GeoDataFrame(summary, crs=4326)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "m = trips.explore(name=\"Trips\", style_kwds={\"weight\": 1})\n", + "\n", + "summary_gdf.explore(\n", + " m=m,\n", + " column=\"sog\",\n", + " legend=False,\n", + " style_kwds={\"style_function\": lambda x: {\"radius\": x[\"properties\"][\"n\"]}},\n", + " name=\"Clusters\",\n", + ")\n", + "\n", + "folium.TileLayer(\"CartoDB positron\").add_to(m)\n", + "folium.LayerControl().add_to(m)\n", + "\n", + "m" + ] + }, { "cell_type": "markdown", "metadata": {},