GPS2space: An Open-source Python Library for Working with GPS data

Published: Sep 16, 2020 by Shuai Zhou

GPS2space is an open-source Python library for:

  • Compiling spatial data from raw GPS lat/long coordinates
  • Constructing Buffer- and Convex hull-based activity space and shared space at different time scales
  • Speeding up nearest distance query using cKDTree method (currently only support Point-Point nearest distance query)

See documentation for more information

Load libraries

%matplotlib inline

import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt

from gps2space import geodf
from gps2space import space

Load data

df = pd.read_csv('../data/example.csv')
gdf = geodf.df_to_gdf(df, x='longitude', y='latitude')

Construct person-time

gdf['timestamp'] = pd.to_datetime(gdf['timestamp'], infer_datetime_format=True)
gdf['week'] = gdf['timestamp'].dt.week

gdf['person_week'] = gdf['pid'].astype(str) + '_' + gdf['week'].astype(str)
gdf.head()
pid timestamp latitude longitude geometry week person_week
0 P2 2020-04-27 10:42:22.162176000 40.993799 -76.669419 POINT (-76.66942 40.99380) 18 P2_18
1 P2 2020-06-02 01:12:45.308505600 39.946904 -78.926234 POINT (-78.92623 39.94690) 23 P2_23
2 P2 2020-05-08 23:47:33.718185600 41.237403 -79.252317 POINT (-79.25232 41.23740) 19 P2_19
3 P2 2020-04-26 14:31:12.100310400 41.991390 -77.467769 POINT (-77.46777 41.99139) 17 P2_17
4 P2 2020-03-31 15:53:27.777897600 41.492674 -76.542921 POINT (-76.54292 41.49267) 14 P2_14

Calculate convex hull-based activity space

convex_space = space.convex_space(gdf, group='person_week', proj=2163)
convex_space.head()
person_week geometry convx_area
0 P1_1 POLYGON ((-79.08352 40.61927, -78.64613 41.031... 0.459119
1 P1_10 POLYGON ((-77.29803 39.81326, -78.33096 41.824... 2.980511
2 P1_11 POINT (-80.05021 41.60526) 0.000000
3 P1_12 LINESTRING (-78.86727 41.79762, -75.39833 40.5... 0.000000
4 P1_13 POLYGON ((-79.36647 39.99230, -77.46196 41.851... 1.425932

Check P1 and P2 at week 10

p1_w10 = convex_space[convex_space['person_week']=='P1_10']
p2_w10 = convex_space[convex_space['person_week']=='P2_10']
share = gpd.overlay(p1_w10, p2_w10, how='intersection')
ax = p1_w10.boundary.plot(edgecolor='green')
p2_w10.boundary.plot(ax=ax,edgecolor='black')
share.plot(ax=ax)
plt.show();

png

As shown in the figure:

  • The enclosed green line is the activity space for P1 at week 10
  • The enclosed black line is the activity space for P2 at week 10
  • The blue area is the shared space for P1 and P2 at week 10

Share