Analysis Overview

The analysis module provides tools for extracting insights from spatial narratives.

Features

FeatureDescriptionTypes
Spatial MetricsGeographic extent, distances, dispersion[SpatialMetrics]
Temporal MetricsDuration, rates, gaps, bursts[TemporalMetrics]
MovementTrajectory extraction and stop detection[Trajectory], [Stop]
ClusteringDensity and centroid-based clustering[DBSCAN], [KMeans]
ComparisonSimilarity scoring between narratives[compare_narratives]

Quick Examples

Spatial Metrics

use spatial_narrative::analysis::SpatialMetrics;
use spatial_narrative::core::{Event, Location, Timestamp};

let events = vec![
    Event::new(Location::new(40.7128, -74.0060), Timestamp::now(), "NYC"),
    Event::new(Location::new(34.0522, -118.2437), Timestamp::now(), "LA"),
    Event::new(Location::new(41.8781, -87.6298), Timestamp::now(), "Chicago"),
];

let metrics = SpatialMetrics::from_events(&events);

println!("Total distance: {:.0} km", metrics.total_distance / 1000.0);
println!("Geographic extent: {:.0} km", metrics.max_extent / 1000.0);
println!("Centroid: ({:.4}, {:.4})", metrics.centroid.0, metrics.centroid.1);

Temporal Metrics

use spatial_narrative::analysis::TemporalMetrics;

let metrics = TemporalMetrics::from_events(&events);

println!("Duration: {:?}", metrics.duration);
println!("Event count: {}", metrics.event_count);
println!("Average interval: {:?}", metrics.avg_interval);

DBSCAN Clustering

use spatial_narrative::analysis::DBSCAN;

// Cluster events within 5km, requiring 2+ points per cluster
let dbscan = DBSCAN::new(5000.0, 2);
let result = dbscan.cluster(&events);

println!("Found {} clusters", result.num_clusters());
println!("Noise points: {}", result.noise.len());

K-Means Clustering

use spatial_narrative::analysis::KMeans;

// Partition events into 3 clusters
let kmeans = KMeans::new(3);
let result = kmeans.cluster(&events);

for (i, cluster) in result.clusters.iter().enumerate() {
    println!("Cluster {}: {} events", i, cluster.events.len());
}

Trajectory Analysis

use spatial_narrative::analysis::{Trajectory, detect_stops, StopThreshold};

// Extract trajectory from events
let trajectory = Trajectory::from_events(&events);

println!("Trajectory length: {:.0} m", trajectory.total_distance());
println!("Duration: {:?}", trajectory.duration());

// Detect stops (stationary periods)
let threshold = StopThreshold::new(50.0, std::time::Duration::from_secs(300));
let stops = detect_stops(&events, &threshold);

for stop in stops {
    println!("Stop at ({:.4}, {:.4}) for {:?}", 
        stop.location.lat, stop.location.lon, stop.duration);
}

Comparing Narratives

use spatial_narrative::analysis::{compare_narratives, ComparisonConfig};
use spatial_narrative::core::Narrative;

let similarity = compare_narratives(&narrative1, &narrative2, &ComparisonConfig::default());

println!("Spatial similarity: {:.2}", similarity.spatial);
println!("Temporal similarity: {:.2}", similarity.temporal);
println!("Thematic similarity: {:.2}", similarity.thematic);
println!("Overall similarity: {:.2}", similarity.overall);

Module Structure

spatial_narrative::analysis
├── SpatialMetrics      # Geographic analysis
├── TemporalMetrics     # Time-based analysis
├── Trajectory          # Movement paths
├── DBSCAN              # Density clustering
├── KMeans              # K-means clustering
├── detect_stops        # Stop detection
├── detect_gaps         # Gap detection
├── detect_bursts       # Burst detection
└── compare_narratives  # Narrative comparison

Next Steps