Install
$ agentstack add skill-muend-geoai-skills-movement-trajectory ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Movement & Trajectory Analytics
Purpose: turn noisy timestamped points into defensible movement facts. The recurring failure modes: speed computed through GPS noise (teleporting points → 400 km/h pedestrians), stops invented by signal drift, and privacy-blind delivery of individual-level traces.
Data model first
A trajectory = ordered fixes per object: (object_id, timestamp, x, y, [accuracy, ...]). Before analysis, report per object: fix count, time span, median sampling interval, and interval distribution — sampling rate drives every method choice (1 s vehicle traces and 1 fix/hour animal tags are different problems wearing the same schema).
import movingpandas as mpd
import geopandas as gpd
gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.lon, df.lat),
crs=4326).to_crs(gdf_utm_epsg)
tc = mpd.TrajectoryCollection(gdf, "object_id", t="timestamp")
Work in a projected CRS for all speed/distance computation; keep timestamps timezone-aware UTC (mixed local times create midnight teleports).
Cleaning pipeline (in order)
- Deduplicate identical (object, timestamp) fixes.
- Accuracy filter: drop fixes above an HDOP/accuracy threshold if
the column exists (report the threshold and % dropped).
- Speed filter: drop fixes implying impossible speed for the mode
(walk > 15 km/h sustained, car > 200 km/h...); iterate — one bad fix creates two bad segments (mpd.OutlierCleaner).
- Gap splitting: split trajectories at temporal gaps (e.g., > 5×
median interval) — interpolating across a tunnel/power-off invents movement.
- Optional smoothing (Kalman/rolling median) for jittery urban-canyon
data — AFTER outlier removal, and never before stop detection tuning.
Accounting line per step: fixes in → out.
Stops and trips
Stop = spatial dwell: fixes within a distance radius for a minimum duration (mpd.TrajectoryStopDetector(max_diameter=50, min_duration=timedelta(minutes=5))). The two parameters ARE the result — report them and run a ±50% sensitivity check; urban-canyon drift mimics movement, so diameter ~30 s degrades matching sharply — report match confidence and the % of unmatched points; don't silently keep unmatched geometry.
- Never map-match animal tracks or off-road movement (obviously) — and
don't compute "distance traveled" from raw noisy fixes either (noise inflates path length ~5-20%); smooth first, state the method.
Aggregate analytics
- Flow maps / desire lines: aggregate OD pairs before plotting
(cartography-geoviz for delivery); hairball avoidance = zone-level aggregation + minimum-flow threshold.
- Density: KDE or hex-bin of fixes vs of trips — fixes overweight slow
movement (dwell = many fixes); use trip-based or time-weighted density and say which.
- Space-time clustering (co-location, convoys): ST-DBSCAN family;
cluster parameters in both space and time reported together.
- Sequence/periodicity: hour-of-day × day-of-week activity matrices per
object class before any behavioral claims.
Privacy — non-optional
Individual trajectories are personal data almost everywhere (GDPR etc.) and are notoriously re-identifiable (home/work anchor pairs identify most people). Defaults: aggregate before sharing (zones ≥ k objects, suppress cells < k, typical k=5-10), truncate trip ends near homes, and never publish raw individual traces without explicit clearance. State the anonymization applied in every deliverable.
Verification protocol
- Speed histogram per mode after cleaning — tail must be physically
plausible.
- Map 3 sample trajectories (raw vs cleaned vs matched) over a basemap.
- Stop-detection sensitivity: parameters ±50%, report stop-count change.
- OD totals reconcile with trip counts (accounting).
Pitfalls checklist
- Speeds computed across gaps or through outlier fixes.
- Distance traveled from raw (unsmoothed, unmatched) fixes.
- Stops detected with radius below GPS noise, or drift counted as trips.
- Mixed timezones / DST jumps creating phantom teleports.
- Fix-density maps read as movement-density maps.
- Individual traces shipped without aggregation/suppression.
- Trajectories split by object but not by temporal gap.
Execution contract
- Workflow: validate identifiers, time, and CRS; segment tracks; remove impossible fixes; infer stops or trips; optionally map-match; aggregate; apply privacy controls; verify.
- Decision rules: use trajectory methods for observed timestamped movement, network analysis for possible routes or access, and point-pattern methods when sequence and identity are absent.
- Verification protocol: inspect speed and gap distributions, map raw-versus-cleaned samples, perturb stop parameters, reconcile trip and OD counts, and audit disclosure risk.
- Failure modes: suppress or qualify results for timezone ambiguity, long gaps, implausible speeds, poor network matching, sparse sampling, or re-identification risk.
- Deliverables: cleaned trajectories or approved aggregates, segmentation rules, quality report, derived stop/trip tables, privacy treatment, maps, and limitations.
- Source freshness: consult [the authoritative source registry](references/authoritative-sources.md) before using format, library, or privacy guidance and record the checked date.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: muend
- Source: muend/geoai-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.