Measuring distances¶
Distances can be computed between trajectories as well as between trajectories and other geometry objects. The implemented distance measures are:
In [ ]:
import pandas as pd
import geopandas as gpd
import movingpandas as mpd
import shapely as shp
import hvplot.pandas
import matplotlib.pyplot as plt
from geopandas import GeoDataFrame, read_file
from shapely.geometry import Point, LineString, Polygon
from datetime import datetime, timedelta
from holoviews import opts, dim
import warnings
warnings.filterwarnings('ignore')
plot_defaults = {'linewidth':5, 'capstyle':'round', 'figsize':(9,3), 'legend':True}
opts.defaults(opts.Overlay(active_tools=['wheel_zoom']))
hvplot_defaults = {'tiles':'CartoLight', 'frame_height':320, 'frame_width':320, 'cmap':'Viridis', 'colorbar':True}
mpd.show_versions()
MovingPandas 0.18.1 SYSTEM INFO ----------- python : 3.10.14 | packaged by conda-forge | (main, Mar 20 2024, 12:40:08) [MSC v.1938 64 bit (AMD64)] executable : c:\Users\Agarkovam\AppData\Local\miniforge3\envs\mpd-ex\python.exe machine : Windows-10-10.0.19045-SP0 GEOS, GDAL, PROJ INFO --------------------- GEOS : None GEOS lib : None GDAL : 3.8.5 GDAL data dir: None PROJ : 9.4.0 PROJ data dir: C:\Users\Agarkovam\AppData\Local\miniforge3\envs\mpd-ex\Library\share\proj PYTHON DEPENDENCIES ------------------- geopandas : 0.14.4 pandas : 2.2.2 fiona : 1.9.6 numpy : 1.26.4 shapely : 2.0.4 rtree : 1.2.0 pyproj : 3.6.1 matplotlib : 3.8.4 mapclassify: 2.6.1 geopy : 2.4.1 holoviews : 1.17.1 hvplot : 0.8.3 geoviews : 1.9.6 stonesoup : 1.2
Measuring distances between trajectories¶
In [ ]:
df = pd.DataFrame([
{'geometry':Point(0,0), 't':datetime(2018,1,1,12,0,0)},
{'geometry':Point(6,0), 't':datetime(2018,1,1,12,6,0)},
{'geometry':Point(6,6), 't':datetime(2018,1,1,12,10,0)},
{'geometry':Point(9,9), 't':datetime(2018,1,1,12,15,0)}
]).set_index('t')
geo_df = GeoDataFrame(df, crs=31256)
toy_traj = mpd.Trajectory(geo_df, 1)
toy_traj.df
Out[ ]:
geometry | traj_id | |
---|---|---|
t | ||
2018-01-01 12:00:00 | POINT (0.000 0.000) | 1 |
2018-01-01 12:06:00 | POINT (6.000 0.000) | 1 |
2018-01-01 12:10:00 | POINT (6.000 6.000) | 1 |
2018-01-01 12:15:00 | POINT (9.000 9.000) | 1 |
In [ ]:
df = pd.DataFrame([
{'geometry':Point(3,3), 't':datetime(2018,1,1,12,0,0)},
{'geometry':Point(3,9), 't':datetime(2018,1,1,12,6,0)},
{'geometry':Point(2,9), 't':datetime(2018,1,1,12,10,0)},
{'geometry':Point(0,7), 't':datetime(2018,1,1,12,15,0)}
]).set_index('t')
geo_df = GeoDataFrame(df, crs=31256)
toy_traj2 = mpd.Trajectory(geo_df, 1)
toy_traj2.df
ax = toy_traj.plot()
toy_traj2.plot(ax=ax, color='red')
Out[ ]:
<Axes: >
In [ ]:
print(f'Distance: {toy_traj.distance(toy_traj2)} meters')
print(f'Hausdorff distance: {toy_traj.hausdorff_distance(toy_traj2):.2f} meters')
Distance: 3.0 meters Hausdorff distance: 6.08 meters
In [ ]:
print(f'Distance: {toy_traj.distance(toy_traj2, units="cm")} cm')
print(f'Hausdorff distance: {toy_traj.hausdorff_distance(toy_traj2, units="km"):.6f} km')
Distance: 300.0 cm Hausdorff distance: 0.006083 km
Measuring distances between trajectories and other geometry objects¶
In [ ]:
pt = Point(1, 5)
line = LineString([(3,3), (3,9)])
ax = toy_traj.plot()
gpd.GeoSeries(pt).plot(ax=ax, color='red')
gpd.GeoSeries(line).plot(ax=ax, color='red')
Out[ ]:
<Axes: >
In [ ]:
print(f'Distance: {toy_traj.distance(pt)}')
print(f'Hausdorff distance: {toy_traj.hausdorff_distance(pt):.2f}')
Distance: 5.0 Hausdorff distance: 8.94
In [ ]:
print(f'Distance: {toy_traj.distance(line)}')
print(f'Hausdorff distance: {toy_traj.hausdorff_distance(line)}')
Distance: 3.0 Hausdorff distance: 6.0
In [ ]:
print(f'Distance: {toy_traj.distance(line, units="cm")} cm')
print(f'Hausdorff distance: {toy_traj.hausdorff_distance(line, units="km"):.6f} km')
Distance: 300.0 cm Hausdorff distance: 0.006000 km
In [ ]: