---
title: "Frassette"
subtitle: "26 mai 2024 • Décollage 10:18:38 • 10m 54s • 6.19 km"
date: "2024-05-26"
categories: ["vol", "Frassette"]
description: "Vol de 10m 54s depuis Frassette (décollage 10:18:38). Gain d'altitude 0 m, vitesse max 40.4 km/h."
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE, warning = FALSE, message = FALSE)
library(jsonlite)
library(DT)
# Identité visuelle commune (tuiles de statistiques)
source("../../scripts/flightlog_theme.R")
# Chargement des données du vol
db <- fromJSON("../../data/processed/flights.json", simplifyVector = FALSE)
flight <- db$flights[sapply(db$flights, function(f) f$id == "2024-05-26-XSD-UB343B-01")][[1]]
```
## ✈️ Résumé du vol
Le **26 mai 2024**, décollage à **10:18:38** depuis **Frassette**. **Nicolas** a volé **10m 54s** avec sa voile **Hook 5P**, pour atterrir à **Vionnaz**. Vol caractérisé par un gain d'altitude de **0 m** et une vitesse maximale de **40.4 km/h**.
```{r conditions, results='asis'}
# Affichage des conditions si renseignées
conditions <- ""
if (!is.null(conditions) && conditions != "" && !is.na(conditions) && conditions != "" && conditions != "NA") {
cat("### 🌤️ Conditions\n")
cat(conditions, "\n\n")
}
```
## 📊 Statistiques clés
```{r stats-summary, results='asis'}
# Statistiques en tuiles (voir fl_stat_tiles dans scripts/flightlog_theme.R)
tile <- function(icon, label, value, unit = "") {
data.frame(
icon = icon, label = label, value = as.character(value), unit = unit,
stringsAsFactors = FALSE
)
}
stats_tiles <- rbind(
tile("🛫", "Décollage (locale)", flight$takeoff_time),
tile("🛬", "Atterrissage (locale)", flight$landing_time),
tile("⏱️", "Durée", round(flight$duration_minutes), "min"),
tile("📈", "Distance totale", flight$total_distance_km, "km"),
tile("📏", "Distance directe", flight$straight_distance_km, "km"),
tile("🏔️", "Alt. décollage", flight$takeoff_coords$elevation, "m"),
tile("🏔️", "Alt. max", flight$max_elevation, "m"),
tile("🏔️", "Alt. atterrissage", flight$landing_coords$elevation, "m"),
tile("📊", "Gain altitude", flight$elevation_gain_total, "m"),
tile("🚀", "Vitesse max", flight$max_speed_kmh, "km/h"),
tile("⬆️", "Taux montée max", flight$max_climb_rate, "m/s"),
tile("⬇️", "Taux chute max", flight$max_sink_rate, "m/s"),
tile(
"📐", "Finesse",
if (is.null(flight$glide_ratio) || length(flight$glide_ratio) == 0 || is.na(flight$glide_ratio)) {
"N/A"
} else {
paste0(flight$glide_ratio, ":1")
}
)
)
# Métriques IGC additionnelles si disponibles (avec vérification sécurisée)
if (!is.null(flight$data_quality_percent) && !is.na(flight$data_quality_percent) && flight$data_quality_percent != "") {
stats_tiles <- rbind(stats_tiles, tile("📡", "Qualité GPS", flight$data_quality_percent, "%"))
}
if (!is.null(flight$elevation_gps_available) &&
isTRUE(flight$elevation_gps_available) &&
!is.null(flight$max_elevation_gps) &&
!is.na(flight$max_elevation_gps) &&
flight$max_elevation_gps != "") {
stats_tiles <- rbind(stats_tiles, tile("🛰️", "Alt. GPS max", flight$max_elevation_gps, "m"))
}
# Hauteur-sol max (AGL via MNT) si le relief était disponible
if (!is.null(flight$terrain_available) &&
isTRUE(flight$terrain_available) &&
!is.null(flight$max_agl) &&
!is.na(flight$max_agl) &&
flight$max_agl != "") {
stats_tiles <- rbind(stats_tiles, tile("🪂", "Hauteur-sol max", flight$max_agl, "m"))
}
cat(fl_stat_tiles(stats_tiles))
```
## 📈 Profil d'altitude
::: {.flight-chart}
{fig-alt="Profil d'altitude du vol du 26 mai 2024 depuis Frassette : la courbe de la trajectoire est superposée au relief du terrain survolé, l'écart entre les deux représentant la hauteur au-dessus du sol." loading="lazy"}
:::
## 🏃 Vitesse au sol
::: {.flight-chart}
{fig-alt="Évolution de la vitesse au sol au fil des minutes de vol, avec la courbe lissée par-dessus la mesure GPS brute. Vitesse maximale atteinte : 40.4 km/h." loading="lazy"}
:::
## ⬆️⬇️ Montées et chutes
::: {.flight-chart}
{fig-alt="Taux de montée et de chute (vario) au fil du vol : les phases de montée sont remplies en bleu au-dessus de la ligne zéro, les phases de descente en rouge en dessous. Montée maximale 0.2 m/s, chute maximale 2.6 m/s." loading="lazy"}
:::
## 🗺️ Trace de vol
### Vue d'ensemble
::: {.flight-chart}
{fig-alt="Trace du vol vue du dessus, entre le décollage de Frassette et l'atterrissage de Vionnaz ; l'intensité du bleu indique l'altitude, du plus clair (bas) au plus foncé (haut)." loading="lazy"}
:::
### Carte interactive
::: {.flight-map-container}
::: {.map-header}
**🗺️ Carte interactive du vol**
::: {.map-controls}
<button class="map-control-btn" onclick="toggleFullscreen('2024-05-26-XSD-UB343B-01')">🔍 Plein écran</button>
<button class="map-control-btn" onclick="window.open('../../data/exports/2024-05-26-XSD-UB343B-01/flight_map.html', '_blank')">🔗 Ouvrir</button>
:::
:::
::: {.flight-map-wrapper #flight-map-2024-05-26-XSD-UB343B-01}
```{r map, out.width="100%", out.height="400px", results='asis'}
# Inclusion de la carte en tant que iframe pour éviter les conflicts HTML
map_path <- file.path("../../data/exports", "2024-05-26-XSD-UB343B-01", "flight_map.html")
cat(sprintf('<iframe src="%s" width="100%%" height="400px" frameborder="0" style="border-radius: 6px;"></iframe>', map_path))
```
:::
:::
```{js}
function toggleFullscreen(flightId) {
const mapWrapper = document.getElementById('flight-map-' + flightId);
const isFullscreen = mapWrapper.classList.contains('fullscreen');
if (isFullscreen) {
// Sortir du plein écran
mapWrapper.classList.remove('fullscreen');
const overlay = document.querySelector('.fullscreen-overlay');
if (overlay) overlay.remove();
} else {
// Entrer en plein écran
mapWrapper.classList.add('fullscreen');
// Ajouter un bouton de fermeture
const overlay = document.createElement('div');
overlay.className = 'fullscreen-overlay';
overlay.innerHTML = '✕ Fermer';
overlay.onclick = () => toggleFullscreen(flightId);
document.body.appendChild(overlay);
}
}
// Échapper avec la touche ESC
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') {
const mapWrapper = document.querySelector('.flight-map-wrapper.fullscreen');
if (mapWrapper) {
const flightId = mapWrapper.id.replace('flight-map-', '');
toggleFullscreen(flightId);
}
}
});
```
## 🥾 Hike & Fly
```{r hike-info, results='asis'}
# Recherche d'un fichier hike & fly
hike_file <- file.path("../../doc", paste0("2024-05-26-XSD-UB343B-01", "_hike.md"))
if (file.exists(hike_file)) {
# Lecture et affichage des infos hike
hike_content <- readLines(hike_file, warn = FALSE)
cat(paste(hike_content, collapse = "\n"))
} else {
cat("🚗 *Accès direct en véhicule*\n\n")
cat("💡 Pour ajouter des infos hike & fly, créer le fichier : `doc/2024-05-26-XSD-UB343B-01_hike.md`")
}
```
## 📖 Mon récit de vol
```{r story, results='asis'}
# Recherche d'un fichier récit
story_file <- file.path("../../doc", paste0("2024-05-26-XSD-UB343B-01", ".md"))
if (file.exists(story_file)) {
# Lecture et affichage du récit
story_content <- readLines(story_file, warn = FALSE)
cat(paste(story_content, collapse = "\n"))
} else {
cat("*Pas de récit disponible pour ce vol.*\n\n")
cat("💡 Pour ajouter un récit, créer le fichier : `doc/2024-05-26-XSD-UB343B-01.md`")
}
```
## 📸 Photos du vol
```{r photos, results='asis'}
# Recherche du dossier photos
photos_dir <- file.path("../../img", "2024-05-26-XSD-UB343B-01")
if (dir.exists(photos_dir)) {
# Lister toutes les images
image_files <- list.files(
photos_dir,
pattern = "\\.(jpg|jpeg|png|gif)$",
ignore.case = TRUE,
full.names = FALSE
)
if (length(image_files) > 0) {
cat("### Galerie\n\n")
# Afficher chaque image : pas de légende (le nom de fichier n'en est pas une),
# mais un texte alternatif descriptif + chargement différé.
for (i in seq_along(image_files)) {
img_path <- file.path("../../img", "2024-05-26-XSD-UB343B-01", image_files[i])
alt <- sprintf(
"Photo %d sur %d prise lors du vol du 26 mai 2024 depuis Frassette.",
i, length(image_files)
)
cat(sprintf("{fig-alt=\"%s\" loading=\"lazy\"}\n\n", img_path, alt))
}
} else {
cat("*Dossier photos vide.*")
}
} else {
cat("*Pas de photos disponibles pour ce vol.*\n\n")
cat("💡 Pour ajouter des photos, créer le dossier : `img/2024-05-26-XSD-UB343B-01/`")
}
```
```{r igc-info, results='asis'}
# Affichage des infos techniques IGC si disponibles (avec vérifications)
if (!is.null(flight$data_quality_percent) && !is.na(flight$data_quality_percent) && flight$data_quality_percent != "") {
cat("## 📡 Informations techniques (IGC)\n\n")
cat("### Qualité des données GPS\n")
cat(sprintf("- **Validité GPS**: %s%% des points validés\n", flight$data_quality_percent))
if (!is.null(flight$elevation_gps_available) && isTRUE(flight$elevation_gps_available)) {
cat("- **Sources d'altitude**: GPS pour affichage, barométrique pour calculs de vario\n")
if (!is.null(flight$max_elevation_gps) && !is.na(flight$max_elevation_gps) && flight$max_elevation_gps != "") {
cat(sprintf("- **Altitude GPS max**: %s m\n", flight$max_elevation_gps))
}
} else {
cat("- **Source d'altitude**: Barométrique uniquement (affichage + calculs)\n")
}
cat("\n### Métadonnées automatiques\n")
cat("Ce vol a été traité depuis un fichier IGC avec extraction automatique des métadonnées (pilote, parapente, date).\n\n")
}
```
---
*Vol enregistré avec Ultrabip - Analysé automatiquement*
*Template optimisé avec [Claude](https://claude.ai)*