Skip to main content

Bibliothèque de routage piéton sûr multi-objectif (A*pex, KDE, Pareto) — Londres & Le Cap

Project description

SafeRoute

Fait par Gillesto

CI PyPI Python License: MIT Documentation


Qu'est-ce que SafeRoute ?

SafeRoute est une bibliothèque Python de routage piéton sûr qui calcule simultanément trois itinéraires entre deux points d'une ville, en optimisant des objectifs contradictoires :

Itinéraire Optimise Compromis
shortest Distance minimale Peut traverser des zones à risque
safest Risque criminel minimal Peut allonger le trajet de 20–40%
balanced Équilibre distance + sécurité + familiarité Recommandé pour un usage quotidien

Le moteur de calcul est écrit en Rust (algorithme A*pex, KDE gaussien) et exposé à Python via PyO3/maturin. Les données de criminalité proviennent de sources officielles : Police UK API pour Londres et SAPS pour Le Cap.


Pourquoi SafeRoute ?

Les applications de navigation classiques (Google Maps, Waze) optimisent uniquement la distance ou le temps. SafeRoute résout un problème différent : comment rentrer chez soi en sécurité ?

La formule de coût intègre trois dimensions :

C = w₁ · Distance + w₂ · Risque − w₃ · Familiarité
  • Risque : densité criminelle sur chaque segment de rue, calculée par KDE gaussien à partir des données historiques de criminalité géolocalisées
  • Familiarité : les rues que vous empruntez régulièrement voient leur coût réduit — une rue connue est une rue plus sûre subjectivement
  • Algorithme : A*pex ε-approximé (Zhang et al., ICAPS 2022) — garantit des solutions à 10% de l'optimal Pareto exact, avec des temps de calcul < 2 secondes sur Londres

Installation

# Bibliothèque seule (calcul d'itinéraires)
pip install saferoute

# Avec le serveur REST FastAPI
pip install "saferoute[api]"

Rust n'est pas requis — le wheel PyPI contient le binaire Rust précompilé.


Exemple concret : trouver le chemin le plus sûr à Londres

from saferoute import SafeRouteEngine
from saferoute.exceptions import SafeRouteError

# 1. Initialiser le moteur (eps=0.1 → approximation à 10% de l'optimal)
engine = SafeRouteEngine(eps=0.1)

# 2. Charger la ville — utilise le cache local si disponible,
#    télécharge OSMnx + données de criminalité sinon (~5 min la première fois)
engine.load_city("london")

# 3. Convertir des coordonnées GPS en identifiants de nœuds OSM
#    Départ : Gare de London Bridge
source = engine.nearest_node(lat=51.5055, lon=-0.0873)
#    Arrivée : Borough Market
target = engine.nearest_node(lat=51.5055, lon=-0.0910)

# 4. Calculer les 3 itinéraires Pareto-optimaux
try:
    pareto = engine.compute_routes(source, target)
except SafeRouteError as e:
    print(f"Erreur : {e}")
    raise

# 5. Comparer les résultats
print(f"Plus court  : {pareto.shortest.total_distance_m:.0f}m "
      f"en {pareto.shortest.estimated_time_min:.1f} min "
      f"(risque={pareto.shortest.total_risk:.3f})")

print(f"Plus sûr    : {pareto.safest.total_distance_m:.0f}m "
      f"en {pareto.safest.estimated_time_min:.1f} min "
      f"(risque={pareto.safest.total_risk:.3f})")

print(f"Équilibré   : {pareto.balanced.total_distance_m:.0f}m "
      f"en {pareto.balanced.estimated_time_min:.1f} min "
      f"(risque={pareto.balanced.total_risk:.3f})")

# Exemple de sortie typique :
# Plus court  : 380m en 5.7 min (risque=0.847)
# Plus sûr    : 510m en 7.7 min (risque=0.112)
# Équilibré   : 430m en 6.5 min (risque=0.341)

# 6. Enregistrer le trajet effectué pour améliorer les recommandations futures
#    (les rues empruntées régulièrement voient leur coût réduit)
engine.record_trip(pareto.balanced.path)

Utiliser l'API REST

# Démarrer le serveur
uvicorn saferoute.api.main:app --reload
# → Documentation interactive : http://localhost:8000/docs
# Charger une ville
curl -X POST http://localhost:8000/api/v1/load-city \
     -H "Content-Type: application/json" \
     -d '{"city": "london"}'

# Calculer les 3 itinéraires
curl -X POST http://localhost:8000/api/v1/route \
     -H "Content-Type: application/json" \
     -d '{
       "city": "london",
       "source_node": 123456789,
       "target_node": 987654321,
       "eps": 0.1
     }'

Réponse JSON consommable directement par React ou Flutter :

{
  "city": "london",
  "shortest": {
    "path": [123456789, 111, 222, 987654321],
    "total_distance_m": 380.0,
    "distance_km": 0.38,
    "total_risk": 0.847,
    "estimated_time_min": 5.7,
    "comfort_score": 0.17,
    "route_type": "shortest"
  },
  "safest": { "..." : "..." },
  "balanced": { "..." : "..." }
}

Villes supportées

Ville Données de criminalité Graphe routier
Londres data.police.uk — 100k crimes/trimestre 501k nœuds, 1.2M arcs
Le Cap SAPS — 30 stations de police 127k nœuds, 360k arcs

Architecture

SafeRoute/
├── src/
│   ├── saferoute/          ← Package Python
│   │   ├── engine.py       ← Orchestrateur principal
│   │   ├── exceptions.py   ← SafeRouteError, GraphNotLoadedError, ...
│   │   └── api/            ← Serveur FastAPI (optionnel)
│   └── rust/               ← Core de calcul Rust
│       └── src/
│           ├── algorithms/ ← A*pex + frontière de Pareto
│           ├── graph/      ← Structures Node, Edge, Graph
│           └── scoring/    ← KDE gaussien
└── tests/                  ← 102 tests Python + 19 tests Rust

Protocole Python ↔ Rust : Python sérialise le graphe enrichi (OSMnx + scores KDE + familiarité) en JSON → Rust désérialise, exécute A*pex, retourne les 3 routes → Python convertit en dataclasses.


Documentation complète

https://gillesto66.github.io/SafeRoute/


Développement

# Prérequis : Rust (https://rustup.rs)
git clone https://github.com/Gillesto66/SafeRoute.git
cd SafeRoute
pip install -e ".[dev,api]"
python -m maturin develop --release   # compile le core Rust

# Tests
python -m pytest tests/ -q            # 102 tests Python
cargo test --test integration         # 19 tests Rust

Voir CONTRIBUTING.md pour le guide complet.


Licence

MIT — voir LICENSE

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

saferoute-0.1.0.tar.gz (48.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

saferoute-0.1.0-cp313-cp313-win_amd64.whl (200.8 kB view details)

Uploaded CPython 3.13Windows x86-64

File details

Details for the file saferoute-0.1.0.tar.gz.

File metadata

  • Download URL: saferoute-0.1.0.tar.gz
  • Upload date:
  • Size: 48.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.13.1

File hashes

Hashes for saferoute-0.1.0.tar.gz
Algorithm Hash digest
SHA256 d303b37701def64efa9b4f9b91113d9451ccef8e3ac5fe4180b63f5d018af3b6
MD5 4a5730d0f9855284486bb9fe2af4b540
BLAKE2b-256 8d3e9731b596b6cd82ba3637b90f8c55071ce186c710c3568319165ca13ae5dd

See more details on using hashes here.

File details

Details for the file saferoute-0.1.0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for saferoute-0.1.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 01e4e0ac87be552fb331e53efa0ed2cccf6df23341e5386621f695a578165054
MD5 c26edb94e34df99666df51fb1829615b
BLAKE2b-256 13d7ccbe05240f3c66b69c6bc7e80db7eb408d99d7da7e38db86ab8998d06d07

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page