High-performance trajectory splitting and analysis, powered by Rust
Project description
trucktrack
High-performance trajectory splitting, generation, and partitioning, powered by Rust.
A Python package implementing logic similar to
movingpandas trajectory splitters
(ObservationGapSplitter, StopSplitter) with a Rust backend for speed.
Data flows through Polars DataFrames, with the option
to process entirely in Rust (parquet in, parquet out) or share DataFrames
between Python and Rust zero-copy via pyo3-polars.
In addition to the Rust splitters, trucktrack ships pure-Python subpackages for trace generation, spatial partitioning, map-matching, querying, and visualization.
Install
pip install trucktrack
Optional extras:
pip install trucktrack[valhalla] # local pyvalhalla routing & map-matching
pip install trucktrack[viz] # folium-based interactive maps
From source
# Requires Python 3.11+ and Rust stable
git clone https://github.com/twedl/trucktrack.git
cd trucktrack
python3 -m venv .venv && source .venv/bin/activate
pip install "maturin>=1.7,<2.0" polars pytest
maturin develop
Pipelines
Split + partition
Process raw GPS traces into a spatially partitioned hive dataset:
from pathlib import Path
from trucktrack import run_pipeline
run_pipeline(Path("data/raw"), Path("data/partitioned"))
# Group input chunks for fewer output files (uses more memory per worker)
run_pipeline(Path("data/raw"), Path("data/partitioned"), group_size=256)
# Compact multi-file partitions into single files after processing
run_pipeline(Path("data/raw"), Path("data/partitioned"), compact=True)
To compact an existing dataset without re-running the pipeline:
from trucktrack import compact_partitions
compact_partitions("data/partitioned")
Building Valhalla tiles
Map-matching and route generation need a local Valhalla install. One-time setup (downloads Ontario from Geofabrik, builds config + admins + tiles):
uv run python scripts/setup_valhalla.py
Produces valhalla_tiles/valhalla.json, valhalla_tiles/admin.sqlite, and
valhalla_tiles/valhalla_tiles.tar — all gitignored. find_config()
discovers the json automatically. Pass --pbf path.osm.pbf to reuse an
existing OSM extract.
Map-match
Map-match all trips against a local Valhalla instance:
from trucktrack.valhalla.pipeline import run_map_matching
run_map_matching(
Path("data/partitioned"),
Path("data/matched"),
# config="valhalla.json" # omit to auto-discover in cwd
)
Querying
Pull individual trucks or trips without scanning the full dataset.
Each function filters by chunk_id (last 2 hex chars of the truck UUID)
to read only the relevant files:
import trucktrack as tt
# Raw traces — filters by chunk_id hive partition
df = tt.scan_raw_truck("data/raw", truck_id).collect()
# Partitioned trips — filters by chunk_id in filename
df = tt.scan_partitioned_truck("data/partitioned", truck_id).collect()
df = tt.scan_partitioned_trip("data/partitioned", trip_id).collect()
# Map-matched results
df = tt.scan_matched_truck("data/matched", truck_id).collect()
df = tt.scan_matched_trip("data/matched", trip_id).collect()
ChunkIndex — persistent file-path index
For repeated queries, build an index once and reload it instantly in later sessions:
# First time — one rglob, then save to disk
idx = tt.ChunkIndex.build("data/partitioned")
idx.save() # writes .chunk_index.json
# Later sessions — instant load, no filesystem scan
idx = tt.ChunkIndex.load("data/partitioned")
df = idx.scan_truck(truck_id).collect()
df = idx.scan_trip(trip_id).collect()
Visualization
One-call helpers to query, plot, and serve an interactive map:
from trucktrack.visualize import inspect_truck, inspect_trip
# All trips for a truck — opens a Flask server
inspect_truck("data/partitioned", truck_id)
# Filter to a date range
from datetime import date
inspect_truck("data/partitioned", truck_id,
date_range=(date(2025, 1, 1), date(2025, 3, 1)))
# Single trip or multiple trips
inspect_trip("data/partitioned", trip_id)
inspect_trip("data/partitioned", [trip_id_1, trip_id_2])
# Use a ChunkIndex for fast lookups on large datasets
idx = tt.ChunkIndex.load("data/partitioned")
inspect_truck("data/partitioned", truck_id, index=idx)
# Raw traces or matched results
inspect_truck("data/raw", truck_id, stage="raw")
inspect_trip("data/matched", trip_id, stage="matched")
# Get the map object without serving (e.g. for Jupyter display)
m = inspect_trip("data/partitioned", trip_id, serve=False)
# Forward kwargs to plot_trace
inspect_trip("data/partitioned", trip_id, color_by="speed")
Multi-stage overlay
Compare raw GPS, trip segments, and map-matched results on one map:
from trucktrack.visualize import inspect_pipeline
# All stages for one truck
inspect_pipeline(
truck_id,
raw_dir="data/raw",
partitioned_dir="data/partitioned",
matched_dir="data/matched",
)
# Scope to specific trips (raw layer auto-filtered to matching dates)
inspect_pipeline(
trip_id=[trip_id_1, trip_id_2],
raw_dir="data/raw",
partitioned_dir="data/partitioned",
partitioned_index=idx,
)
For more control, use the lower-level plot_trace, plot_trace_layers,
save_map, and serve_map functions directly from trucktrack.visualize.
Dev workflow
| Task | Command |
|---|---|
| Build | maturin develop |
| Tests | pytest tests/ -v |
| Lint Python | ruff check python/ tests/ |
| Format Python | ruff format python/ tests/ |
| Lint Rust | cargo clippy --all-targets --all-features -- -D warnings |
| Format Rust | cargo fmt --all |
| Type-check | mypy python/trucktrack |
| Build wheel | maturin build --release |
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file trucktrack-0.1.13.tar.gz.
File metadata
- Download URL: trucktrack-0.1.13.tar.gz
- Upload date:
- Size: 178.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0ade7aba36c044ceaafe54d3a13413c9068df4181c8d21455f591d2eff56ccaa
|
|
| MD5 |
74bda644d089b61e11921110a7c1cb72
|
|
| BLAKE2b-256 |
4104a608ce423ef1b577990eea0a195a6fe41c314b840d35968ecc0106d64b4c
|
Provenance
The following attestation bundles were made for trucktrack-0.1.13.tar.gz:
Publisher:
publish.yml on twedl/trucktrack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
trucktrack-0.1.13.tar.gz -
Subject digest:
0ade7aba36c044ceaafe54d3a13413c9068df4181c8d21455f591d2eff56ccaa - Sigstore transparency entry: 1308947758
- Sigstore integration time:
-
Permalink:
twedl/trucktrack@d10d3ec2302d41c5a3c362c0cea53ff32b06b271 -
Branch / Tag:
refs/tags/v0.1.13 - Owner: https://github.com/twedl
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d10d3ec2302d41c5a3c362c0cea53ff32b06b271 -
Trigger Event:
push
-
Statement type:
File details
Details for the file trucktrack-0.1.13-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: trucktrack-0.1.13-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 16.7 MB
- Tags: CPython 3.11+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e68c2f6cef30b8899e187718402c117f4e15c44a9d6057fe07d01d26618fd570
|
|
| MD5 |
f7f434e1ae91657a8c95a35136e11f7e
|
|
| BLAKE2b-256 |
e77d90b3936c17c4e8af2bc2b267f20d7084d8a8e4d4aa17cd7022866a474d6a
|
Provenance
The following attestation bundles were made for trucktrack-0.1.13-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
publish.yml on twedl/trucktrack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
trucktrack-0.1.13-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
e68c2f6cef30b8899e187718402c117f4e15c44a9d6057fe07d01d26618fd570 - Sigstore transparency entry: 1308947848
- Sigstore integration time:
-
Permalink:
twedl/trucktrack@d10d3ec2302d41c5a3c362c0cea53ff32b06b271 -
Branch / Tag:
refs/tags/v0.1.13 - Owner: https://github.com/twedl
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d10d3ec2302d41c5a3c362c0cea53ff32b06b271 -
Trigger Event:
push
-
Statement type:
File details
Details for the file trucktrack-0.1.13-cp311-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: trucktrack-0.1.13-cp311-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 14.1 MB
- Tags: CPython 3.11+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0633e19f1b7b304af929285cc620d4fd3d22168e60dc058b406e13287c6245a0
|
|
| MD5 |
519c152be9007b7c0c28fa1f65566058
|
|
| BLAKE2b-256 |
bf74e64d627792477b50f3903abc5fb47d4a2bee90bb7b72f848fed1bcf9a4be
|
Provenance
The following attestation bundles were made for trucktrack-0.1.13-cp311-abi3-macosx_11_0_arm64.whl:
Publisher:
publish.yml on twedl/trucktrack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
trucktrack-0.1.13-cp311-abi3-macosx_11_0_arm64.whl -
Subject digest:
0633e19f1b7b304af929285cc620d4fd3d22168e60dc058b406e13287c6245a0 - Sigstore transparency entry: 1308947972
- Sigstore integration time:
-
Permalink:
twedl/trucktrack@d10d3ec2302d41c5a3c362c0cea53ff32b06b271 -
Branch / Tag:
refs/tags/v0.1.13 - Owner: https://github.com/twedl
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d10d3ec2302d41c5a3c362c0cea53ff32b06b271 -
Trigger Event:
push
-
Statement type: