BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
Trouver près de soi des segments plats et des côtes pour le fractionné et le travail en montée.
Translation pending
Sports & fitnessPython · JavaScriptGitHub @jsilobreOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Trouver, près de chez soi, les bouts de chemin parfaits pour une séance de course. Spot Fractionné (pipeline flat-segments) repère des tronçons courts exploitables pour l'entraînement autour d'une position (adresse, coordonnées GPS, point placé sur la carte ou position de l'appareil) :Read the full README ↗
Trouver, près de chez soi, les bouts de chemin parfaits pour une séance de course.
Le site : https://spot-fractionne.fr/ (toute la France métropolitaine ; il s'installe aussi comme une appli sur téléphone).
Spot Fractionné (pipeline flat-segments) repère des tronçons courts exploitables pour l'entraînement
autour d'une position (adresse, coordonnées GPS, point placé sur la carte ou
position de l'appareil) :
Contrairement à Strava ou Komoot, on ne cherche pas de parcours, mais des tronçons courts : une ligne droite plate de 400 m sans traversée de route, ou une montée régulière à 6 % sur 200 m.
| Critère | Plat | Côte | Côte longue |
|---|---|---|---|
| Longueur | ≥ longueur cible (200 / 400 / 1000 m) | ≥ longueur cible (100 m à 1 km) | ≥ 1 km, ou la longueur d'un effort de N minutes à l'allure choisie |
| Pente | pente locale max faible (2 %), pente moyenne ≤ 1 % | pente moyenne dans une plage (3 à 15 %), sans replat ; le site filtre sur le passage le plus raide | pente moyenne ≥ 2,5 %, replats et petites descentes tolérés sur 150 m |
| Traversées | aucune route importante, peu de routes secondaires | idem | idem |
| Tracé | droit ou peu sinueux | sinuosité tolérée plus forte (lacets) | lacets tolérés |
| Revêtement / éclairage | asphalte, stabilisé, terre… ; éclairage si connu | idem | idem |
| Accès | praticable en aller-retour (pas d'accès privé, pas de sens unique piéton, pas de route de service d'aéroport) | idem | idem |
| Proximité | distance à la position de l'utilisateur | idem | idem |
Le détail des calculs est dans docs/algorithm.md.
✅ Phase 1 terminée : prototype sur la zone pilote.
Déjà en place :
algorithm.md § 11).✅ Phase 2 terminée : toute la France par précalcul statique. Voir l'ADR 0008 et le plan.
Ajouts depuis la mise en ligne nationale :
algorithm.md § 7.3).algorithm.md § 1).Zone pilote : Labège / Caraman (sud-est de Toulouse, Haute-Garonne),
emprise 1.48,43.48,1.80,43.59 (lon/lat WGS84).
Prérequis : uv (installe Python ≥ 3.12 si besoin) et, pour les tests du front, Node.js ≥ 20.
# Environnement et outils de développement
uv sync
uv run pre-commit install
# Qualité
uv run ruff check .
uv run ruff format --check .
uv run mypy
uv run pytest
# CLI du pipeline
uv run flat-segments --help
Les données brutes et intermédiaires vont dans data/ (ignoré par Git). Voir
docs/data-sources.md pour le détail des sources.
uv run flat-segments download-osm # extrait Geofabrik (MD5) + découpe → data/raw/pilot.osm.pbf
uv run flat-segments download-dem # dalles MNT LiDAR HD de l'emprise → data/raw/dem/pilot.vrt
uv run flat-segments pipeline # extract + elevation + detect + export → data/processed/
uv run flat-segments export-pmtiles # publication pour le site → web/data/segments.pmtiles (tippecanoe)
export-pmtiles demande tippecanoe
en version 2.55 ou plus (brew install tippecanoe, ou compilation depuis les
sources : le paquet Ubuntu, en 2.49, mélange des attributs, voir
ADR 0009). Il accepte plusieurs
fichiers de segments, par exemple ceux de plusieurs départements :
export-pmtiles data/departments/*/segments.parquet.
Production par département (phase 2) : le traitement reprend après une interruption, et le MNT est supprimé une fois utilisé.
uv run flat-segments download-departments # contours (Admin Express)
uv run flat-segments department 31 --pbf data/raw/midi_pyrenees.osm.pbf
uv run flat-segments departments 09 31 82 --pbf data/raw/midi_pyrenees.osm.pbf
En production, le workflow produce.yml (lancé à la main sur GitHub) fait
tout cela en parallèle, un département par tâche, puis publie le jeu
(ADR 0011). En local, ses
étapes sont :
uv run flat-segments cut-osm data/raw/france-latest.osm.pbf 31 81 # un extrait par département (osmium)
uv run flat-segments department 31 --pbf data/osm/31.osm.pbf
uv run flat-segments export-pmtiles data/departments/*/segments.parquet --previous web/data
--previous garde les identifiants du jeu déjà publié : les liens partagés
continuent de fonctionner (ADR 0012).
Pour republier sans tout recalculer (assemblage seul avec reuse_run, boucles
du réseau seules avec circuits_run, détection seule avec detect_run, voies
retirées seules avec prune_run), voir
architecture.md § 8.
Si Geofabrik est inaccessible, download-osm --url accepte le miroir
d'OpenStreetMap France (voir docs/data-sources.md).
Chaque étape existe aussi séparément : extract, elevation, detect et
export. Les boucles ont leurs propres commandes, hors de pipeline :
loops (pistes d'athlétisme) et circuits (boucles du réseau), qui lisent
l'extrait OSM complet. Toutes acceptent un fichier de paramètres et des surcharges ponctuelles :
uv run flat-segments config > mes-parametres.toml # paramètres effectifs (TOML)
uv run flat-segments detect --config mes-parametres.toml --set flat.max_local_grade_pct=1.5
Les valeurs par défaut sont dans configs/default.toml.
Elles sont documentées dans docs/algorithm.md.
uv run flat-segments report # résumé des segments détectés
uv run flat-segments sweep flat.max_local_grade_pct 1 1.5 2 # sensibilité à un paramètre
uv run flat-segments compare a.parquet b.parquet # recouvrement de deux jeux de segments
uv run flat-segments inspect flat-3fa2b1c9d0e4 # profil d'un segment (PNG, matplotlib)
uv run flat-segments validation-sheet --count 20 # fiche terrain → docs/validation/pilot.md
inspect utilise matplotlib : il est installé par uv sync (outils de
développement) ou avec l'extra viz (uv sync --extra viz).
Site statique, sans étape de build :
npx http-server web -p 8000 -c-1
# puis ouvrir http://localhost:8000
Il faut un serveur qui accepte les requêtes partielles (Range), ce que ne
fait pas python -m http.server. La page lit les tuiles
web/data/segments.pmtiles ; si web/data/segments.json manque, elle prend
le jeu d'exemple web/data/sample/ (données fictives, signalées par un
bandeau).
Le jeu publié n'est pas dans le dépôt (ADR 0011). Pour l'avoir en local :
gh release download data-latest --dir web/data && tar -xzf web/data/ids.tar.gz -C web/data
Liens directs : ?id=<segment> ouvre un segment, ?lat=…&lon=… fixe la
position, ?kind=climb affiche les côtes, ?kind=long_climb les côtes
longues et ?kind=loop les boucles. Le workflow Pages publie web/ à
chaque modification sur main, sur Cloudflare (variable
CLOUDFLARE_ACCOUNT_ID, secret CLOUDFLARE_API_TOKEN) et sur GitHub Pages
(Settings → Pages → Source : GitHub Actions). Quand la variable SITE_URL
est définie, GitHub Pages ne sert plus qu'une redirection des anciens liens
vers cette adresse (ADR 0017).
Régénérer le jeu d'exemple (tippecanoe requis) : uv run python scripts/make_sample_data.py.
Le site s'installe comme une appli (PWA : manifest.webmanifest, service
worker sw.js) ; hors ligne, la page s'ouvre mais sans segments. Les visites
sont comptées avec GoatCounter,
sans cookie, et la position n'est jamais transmise. Elle part vers l'IGN
seulement si l'on demande un itinéraire.
Tout nouveau fichier du site doit être ajouté à la liste de copie de
.github/workflows/pages.yml et, s'il est chargé par la page, à la liste
SHELL de sw.js ; des tests le vérifient.
Tests du front (filtrage, décodage des tuiles, géocodage, itinéraire, profil, fonds de carte,
PWA, déploiement) : cd web && node --test.
docs/ documentation (architecture, algorithme, données, ADR, validation)
configs/ paramètres par défaut (TOML)
src/flat_segments/ pipeline Python (package)
tests/ tests pytest (profils et réseaux synthétiques)
scripts/ scripts utilitaires (jeu d'exemple)
web/ front statique MapLibre
data/ données téléchargées et produites (non versionné)
LICENSE.Ces mentions, sauf les trois dernières, sont aussi affichées sur la carte du site.