src/Controller/CaniculeMeteonormController.php line 31

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Service\MeteoFranceService;
  4. use App\Service\StationService;
  5. use App\DTO\CaniculeMeteonormDTO;
  6. use App\Form\CaniculeMeteonormType
  7. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  8. use Symfony\Component\HttpFoundation\JsonResponse;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use App\Entity\Pluviometrie;
  14. use App\Entity\StationsMeteo;
  15. use Symfony\Component\HttpFoundation\File\UploadedFile;
  16. use App\Form\UploadFichierType;
  17. set_time_limit(36000);
  18. class CaniculeMeteonormController extends AbstractController {
  19.     
  20.     private StationService $stationService;
  21.     
  22.     public function __construct(private MeteoFranceService $meteoServiceStationService $stationService){//, HttpClientInterface $client, CacheInterface $cache, string $apiKey, string $meteoFranceTokenUrl, string $meteoFranceApiUrl) {
  23.        $this->stationService $stationService;
  24.     }
  25.     #[Route(path'/caniculeMeteonorm'name'caniculeMeteonorm')]
  26.     public function index(Request $requestEntityManagerInterface $em): Response
  27.     {
  28.         ini_set('memory_limit''1024M'); // ou '2G' si besoin
  29.         
  30.         // Créer une instance du DTO pour passer au formulaire
  31.         $CaniculeMeteonormDTO = new CaniculeMeteonormDTO();
  32.         // Créer le formulaire avec l'objet DTO
  33.         $form $this->createForm(CaniculeMeteonormType::class, $CaniculeMeteonormDTO);
  34.         // Gérer la soumission du formulaire
  35.         $form->handleRequest($request);
  36.         if ($form->isSubmitted() && $form->isValid()) {
  37.             // Récupérer les données du formulaire
  38.             $data $form->getData();
  39.             $fichier $form->get('fichier')->getData();
  40.             $lignes file($fichier->getPathname(), FILE_IGNORE_NEW_LINES FILE_SKIP_EMPTY_LINES);
  41.         $annee 1983;            
  42.         $donneesComfie = [];
  43.         $DH26 = [];
  44.         foreach ($lignes as $ligne) {
  45.             // Largeur fixe : extraits selon les positions données
  46.             $stationId substr($ligne03);
  47.             $temp substr($ligne34);
  48.             $rayonnementGlobal substr($ligne74);
  49.             $rayonnementDiffus substr($ligne114);
  50.             $rayonnementDirect substr($ligne154);
  51.             $ensoleillement substr($ligne194);
  52.             $humidite substr($ligne233);
  53.             $vent substr($ligne263);
  54.             $mois = (int) substr($ligne292);
  55.             $jour = (int) substr($ligne312);
  56.             $heure = (int) substr($ligne332);
  57.             // Nettoyage des valeurs "EEE"
  58.             $val = fn($x) => trim($x) === 'EEE' || str_contains($x'E') ? null intval($x);
  59.             $datetime sprintf('%04d-%02d-%02d %02d:00'$annee$mois$jour$heure 1); // heure 1 = 00h
  60.             $donneesComfie[] = [
  61.                 'datetime' => $datetime,
  62.                 'station' => $stationId,
  63.                 'temperature' => $val($temp) !== null $val($temp) / 10 null,
  64.                 'humidite' => $val($humidite),
  65.                 'vent' => $val($vent),
  66.                 'rayonnement' => $val($rayonnementGlobal),
  67.             ];
  68.         }
  69.         $donneesJournalieres = [];
  70.         $DH26['fichier'] = ;
  71. foreach ($donneesComfie as $ligne) {
  72.     $jour substr($ligne['datetime'], 010); // YYYY-MM-DD
  73.     if (!isset($donneesJournalieres[$jour])) {
  74.         $donneesJournalieres[$jour] = [
  75.             'min' => $ligne['temperature'],
  76.             'max' => $ligne['temperature'],
  77.         ];
  78.     } else {
  79.         $donneesJournalieres[$jour]['min'] = min($donneesJournalieres[$jour]['min'], $ligne['temperature']);
  80.         $donneesJournalieres[$jour]['max'] = max($donneesJournalieres[$jour]['max'], $ligne['temperature']);
  81.         if ($ligne['temperature'] >26){
  82.             $DH26['fichier'] = $DH26['fichier'] + $ligne['temperature'] - 26;
  83.         }
  84.     }
  85. }
  86.             // Tu as directement accès à l'objet StationMeteoDTO ici
  87.             $apikey $data->getApikey();  // Accès via la méthode getter
  88.             $stationAPI $data->getStationAPI();  // Accès via la méthode getter
  89.             // Appeler le service pour obtenir les données météo
  90.             $stationsData = [];
  91.             $commandeArray = []; // Initialisation pour éviter l'erreur Undefined variable
  92.             $columnDataArray = []; // Initialisation pour stocker les données des colonnes  
  93.             $AnneesEtudiees = [];
  94.             foreach (range(20022024) as $annee) {
  95.                 $AnneesEtudiees[$annee] = [
  96.                     'dateDeb' => "{$annee}-01-01T00%3A00%3A00Z",
  97.                     'dateFin' => "{$annee}-12-31T00%3A00%3A00Z",
  98.                 ];
  99.             }
  100.             foreach ($AnneesEtudiees as $annee => $AnneeEtudiee) {
  101.                 $commande $this->meteoService->getStationDataHoraire($stationAPI$AnneeEtudiee$apikey);
  102.                 $commandeArray[$stationAPI][$annee] = $commande;
  103.                 // Pause pour respecter la limite de 50 requêtes par minute
  104.                 usleep(1300000); // 1,2 secondes = 1 200 000 microsecondes
  105.             }
  106.             $erreur500 null;
  107.             $extractedData = [];
  108.             // Récupération des fichiers à partir des commandes
  109.             foreach ($commandeArray as $stationAPI => $anneesData) {
  110.                 $erreur null;
  111.                 foreach ($anneesData as $AnneeEtudiee => $commandeAnnee) {
  112.                     $commandeId $commandeAnnee['elaboreProduitAvecDemandeResponse']['return'];
  113.                     $csvString $this->meteoService->getFichier($commandeId$apikey);
  114.                     // dump($csvString);
  115.                     // Pause pour respecter la limite de 50 requêtes par minute
  116.                     usleep(1300000); // 1,2 secondes = 1 200 000 microsecondes  
  117.                     if ($csvString == 'Erreur 500') {
  118.                         $erreur500[$commandeId] = $stationAPI;
  119.                         $erreur 1;
  120.                     } else {
  121.                         // Diviser la chaîne en lignes
  122.                         $lines explode("\n"$csvString);
  123.                         // Tableau pour stocker les données extraites
  124.                         $data = [];
  125.                         foreach ($lines as $index => $line) {
  126.                             // Ignorer la première ligne (en-tête)
  127.                             if ($index === 0) {
  128.                                 continue;
  129.                             }
  130.                             // Diviser chaque ligne en colonnes par le séparateur ;
  131.                             $columns explode(";"$line);
  132.                             // Vérifier qu'il y a suffisamment de colonnes
  133.                             if (count($columns) > 2) {
  134.                                 // Extraire ce qui se situe entre le 3ème et 4ème point-virgule
  135.                                 $data['date'] = str_replace(",""."$columns[1]);
  136.                                 $data['temperature'] = str_replace(",""."$columns[10]);
  137.                                 $data['vitesse'] = str_replace(",""."$columns[48]);
  138.                                 $data['direction'] = str_replace(",""."$columns[50]);
  139.                                 $extractedData[] = $data;
  140.                                 $extractedDataParAn[$AnneeEtudiee][] = $data;
  141.                             }
  142.                         }
  143.                     }
  144.                 }
  145.             }
  146.             //////////////////////////////////////////////////////////////////////////////////
  147.             // CALCUL DES CANICULES///////////////////////////////////////////////////////////
  148.             function convertirEnDonneesJournalieres($donneesHoraires,$annee) {
  149.                 $donneesJournalieres = [];
  150.                 $DH26[$annee] = 0;
  151.                 foreach ($donneesHoraires as $donnee) {
  152.                     $dateHeure \DateTime::createFromFormat('YmdH'$donnee['date']);
  153.                     if (!$dateHeure) {
  154.                         throw new \Exception("Format de date invalide : " $donnee['date']);
  155.                     }
  156.                     $jour $dateHeure->format('Y-m-d');
  157.                     $temp floatval($donnee['temperature']);
  158.                     if (!isset($donneesJournalieres[$jour])) {
  159.                         $donneesJournalieres[$jour] = [
  160.                             'date' => $jour,
  161.                             'min' => $temp,
  162.                             'max' => $temp,
  163.                         ];
  164.                     } else {
  165.                         $donneesJournalieres[$jour]['min'] = min($donneesJournalieres[$jour]['min'], $temp);
  166.                         $donneesJournalieres[$jour]['max'] = max($donneesJournalieres[$jour]['max'], $temp);
  167.                                 if ($temp 26) {
  168.                             $DH26[$annee] = round($DH26[$annee] + $temp 26);
  169.                         }
  170.                     }
  171.                 }
  172.                 // On retourne un tableau indexé numériquement pour garder l'ordre chronologique
  173.                 return [array_values($donneesJournalieres), $DH26[$annee]];
  174.             }
  175.             function detecterCaniculesAvecIBM(array $donneesJournalieresfloat $seuilMinfloat $seuilMax): array {
  176.     $canicules = [];
  177.     $buffer = [];
  178.     for ($i 2$i count($donneesJournalieres); $i++) {
  179.         $sous_tableau array_slice($donneesJournalieres$i 23);
  180.         $moy_min array_sum(array_column($sous_tableau'min')) / 3;
  181.         $moy_max array_sum(array_column($sous_tableau'max')) / 3;
  182.         if ($moy_min >= $seuilMin && $moy_max >= $seuilMax) {
  183.             // On ajoute tous les 3 jours du trio dans le buffer
  184.             foreach ($sous_tableau as $jour) {
  185.                 $buffer$jour['date'] ] = $jour// clé = date, pour éviter les doublons
  186.             }
  187.         } else {
  188.             if (count($buffer) >= 3) {
  189.                 $canicules[] = array_values($buffer);
  190.             }
  191.             $buffer = [];
  192.         }
  193.     }
  194.     if (count($buffer) >= 3) {
  195.         $canicules[] = array_values($buffer);
  196.     }
  197.     return $canicules;
  198. }
  199.             function analyserCanicule(array $periode): array {
  200.                 if (empty($periode)) {
  201.                     return [
  202.                         'debut' => null,
  203.                         'fin' => null,
  204.                         'duree' => 0,
  205.                         'intensite_max' => null,
  206.                         'severite' => 0,
  207.                     ];
  208.                 }
  209.                 $dates array_column($periode'date');
  210.                 $maxs array_column($periode'max');
  211.                 // Nouvelle méthode de calcul de la sévérité
  212.                 $severite array_sum(array_map(function ($jour) {
  213.                     $moyenne = ($jour['min'] + $jour['max']) / 2;
  214.                     return $moyenne 24;
  215.                 }, $periode));
  216.                 return [
  217.                     'debut' => reset($dates),
  218.                     'fin' => end($dates),
  219.                     'duree' => count($periode),
  220.                     'intensite_max' => max($maxs),
  221.                     'severite' => $severite,
  222.                 ];
  223.             }
  224.           function detecterVaguesDeChaleur(array $donneesJournalieres): array {
  225.     $vagues = [];
  226.     $vagueEnCours = [];
  227.     $joursSous23 0;
  228.     foreach ($donneesJournalieres as $jour) {
  229.         $date $jour['date'];
  230.         $tmin $jour['min'];
  231.         $tmax $jour['max'];
  232.         $moyenne = ($tmin $tmax) / 2;
  233.         if ($moyenne 23) {
  234.             $vagueEnCours[] = $jour;
  235.             $joursSous23 0;
  236.         } elseif ($moyenne 20) {
  237.             // Fin immédiate de la vague
  238.             if (count($vagueEnCours) > 0) {
  239.                 $vagues[] = $vagueEnCours;
  240.             }
  241.             $vagueEnCours = [];
  242.             $joursSous23 0;
  243.         } elseif ($moyenne 23) {
  244.             if (!empty($vagueEnCours)) {
  245.                 $vagueEnCours[] = $jour;
  246.                 $joursSous23++;
  247.                 if ($joursSous23 >= 3) {
  248.                     // Fin après 3 jours consécutifs < 23°C
  249.                     $vagues[] = $vagueEnCours;
  250.                     $vagueEnCours = [];
  251.                     $joursSous23 0;
  252.                 }
  253.             }
  254.         } else {
  255.             $joursSous23 0// Sécurité, même si ce cas ne devrait pas arriver
  256.         }
  257.     }
  258.     // Cas où la vague continue jusqu’à la fin
  259.     if (count($vagueEnCours) > 0) {
  260.         $vagues[] = $vagueEnCours;
  261.     }
  262.     return $vagues;
  263. }          
  264. function resumerVaguesDeChaleur(array $vaguesParAn): array {
  265.     $synthese = [];
  266.     foreach ($vaguesParAn as $annee => $vagues) {
  267.         foreach ($vagues as $vague) {
  268.             if (empty($vague)) continue;
  269.             $duree count($vague);
  270.             if ($duree 5) continue; // On ignore les vagues < 5 jours
  271.             $sommeDJR24 0;
  272.             foreach ($vague as $jour) {
  273.                 $moyenne = ($jour['min'] + $jour['max']) / 2;
  274.                 $djr24 max(0$moyenne 24);
  275.                 $sommeDJR24 += $djr24;
  276.             }
  277.             $intensite $sommeDJR24 $duree// DJR24 moyen par jour
  278.             $synthese[] = [
  279.                 'annee' => $annee,
  280.                 'debut' => $vague[0]['date'],
  281.                 'fin' => end($vague)['date'],
  282.                 'duree' => $duree,
  283.                 'intensite' => round($intensite2),
  284.                 'severite' => round($sommeDJR242),
  285.             ];
  286.         }
  287.     }
  288.     return $synthese;
  289. }
  290.             $caniculesParAn = [];
  291.             $vagues = [];
  292.             //Préciser les seuils
  293.             $stationDB $em->getRepository(StationsMeteo::class)->findOneBy(['IdStation' => $stationAPI]);
  294.             $departement $stationDB->getDepartement();
  295.             $seuils $this->getSeuilsParDepartement()[$departement];
  296.             foreach ($extractedDataParAn as $annee => $donneesHoraires) {
  297.                 [$donneesJournalieres,$DH26[$annee]] = convertirEnDonneesJournalieres($donneesHoraires,$annee);
  298.                 //dump($donneesJournalieres);
  299.                 $caniculesParAn[$annee] = detecterCaniculesAvecIBM($donneesJournalieres$seuils['seuil_nuit'], $seuils['seuil_jour']);// Adapter les seuils ici
  300.                 $vagues[$annee] = detecterVaguesDeChaleur($donneesJournalieres);
  301.             }
  302.             $analysesParAn = [];
  303.             $severiteTotaleParAn = [];
  304.             foreach ($caniculesParAn as $annee => $canicules) {
  305.                 foreach ($canicules as $periode) {
  306.                     $analyse analyserCanicule($periode);
  307.                     $analysesParAn[$annee][] = $analyse;
  308.                     // Ajout de la sévérité à la somme annuelle
  309.                     if (!isset($severiteTotaleParAn[$annee])) {
  310.                         $severiteTotaleParAn[$annee] = 0;
  311.                     }
  312.                     $severiteTotaleParAn[$annee] += $analyse['severite'];
  313.                 }
  314.             }
  315.             dump($vagues);
  316.             $synthese resumerVaguesDeChaleur($vagues);
  317.             dump($synthese);
  318. $donneesGraphique = [];
  319. foreach ($synthese as $vague) {
  320.     $mois ucfirst(strftime('%B'strtotime($vague['debut'])));
  321.     $donneesGraphique[] = [
  322.         'x' => $vague['duree'],
  323.         'y' => $vague['intensite'],
  324.         'z' => $vague['severite'], // utile si bubble
  325.         'name' => $mois ' ' $vague['annee'],
  326.     ];
  327. }
  328. // Trier les années par sévérité décroissante
  329.             arsort($severiteTotaleParAn);
  330. // Extraire les 5 années les plus critiques
  331.             $top10Annees array_slice(array_keys($severiteTotaleParAn), 010true);
  332. // Affichage
  333.             $top10AnneesData = [];
  334.             foreach ($top10Annees as $annee) {
  335.                 if (!isset($analysesParAn[$annee])) {
  336.                     continue;
  337.                 }
  338.                 foreach ($analysesParAn[$annee] as $analyse) {
  339.                     if (empty($analyse['debut'])) {
  340.                         continue;
  341.                     }
  342.                     $dateDebut \DateTime::createFromFormat('Y-m-d'$analyse['debut']);
  343.                     $mois $dateDebut->format('F'); // en anglais (ex: July)
  344.                     $mois strtr($mois, [// option : traduction rapide
  345.                         'January' => 'janvier''February' => 'février''March' => 'mars',
  346.                         'April' => 'avril''May' => 'mai''June' => 'juin',
  347.                         'July' => 'juillet''August' => 'août''September' => 'septembre',
  348.                         'October' => 'octobre''November' => 'novembre''December' => 'décembre',
  349.                     ]);
  350.                     $top10AnneesData[] = [
  351.                         'annee' => $annee,
  352.                         'mois' => $mois,
  353.                         'duree' => $analyse['duree'],
  354.                         'intensite_max' => round($analyse['intensite_max'], 1),
  355.                         'severite' => round($analyse['severite']),
  356.                     ];
  357.                 }
  358.             }
  359.              $stationKey $this->getKeyById($stationAPI);
  360.                  // Renommer la clé "fichier" pour affichage
  361.     $categories array_map(function ($key) {
  362.         return is_int($key) ? $key 'Meteonorm';
  363.     }, array_keys($DH26));
  364.     $valeurs array_values($DH26);
  365.         dump($donneesGraphique);
  366. // Passer les données au template
  367.             return $this->render('caniculeMeteonorm.html.twig', [
  368.                         'form' => $form->createView(),
  369.                         'top10Canicules' => $top10AnneesData,
  370.                         'stationKey' => $stationKey,
  371.                 'seuils' => $seuils,
  372.                'DH26' => $DH26
  373.                 'categories' => $categories,
  374.                 'valeurs' => $valeurs,
  375.                 'donneesVagues' => $donneesGraphique,
  376.             ]);
  377. //            } catch (\Exception $e) {
  378. //                // Gérer les erreurs
  379. //                $this->addFlash('error', 'Erreur : ' . $e->getMessage());
  380. //            }
  381.         }
  382.         // Rendre la vue du formulaire
  383.         return $this->render('caniculeFormulaire.html.twig', [
  384.                     'form' => $form->createView(),
  385.         ]);
  386.     }
  387.     // Méthode pour obtenir la clé en fonction de l'ID
  388.     public function getKeyById($id)
  389.     {
  390.         // Récupérer le tableau des stations et IDs à partir de StationMeteoType
  391.         $choices $this->stationService->getStationAPIChoices();
  392.      //           caniculeMeteonormType->getStationAPIChoices();
  393.         // Rechercher la clé correspondant à l'ID
  394.         $key array_search($id$choices);
  395.         // Si l'ID est trouvé, retourne la clé, sinon retourne null
  396.         return $key !== false $key null;
  397.     }
  398.     
  399.     public function getSeuilsParDepartement(): array {
  400.     return [
  401.     '01' => ['seuil_jour' => 35'seuil_nuit' => 20],
  402.     '02' => ['seuil_jour' => 33'seuil_nuit' => 18],
  403.     '03' => ['seuil_jour' => 34'seuil_nuit' => 18],
  404.     '04' => ['seuil_jour' => 36'seuil_nuit' => 19],
  405.     '05' => ['seuil_jour' => 34'seuil_nuit' => 18],
  406.     '06' => ['seuil_jour' => 31'seuil_nuit' => 24],
  407.     '07' => ['seuil_jour' => 35'seuil_nuit' => 20],
  408.     '08' => ['seuil_jour' => 33'seuil_nuit' => 18],
  409.     '09' => ['seuil_jour' => 34'seuil_nuit' => 19],
  410.     '10' => ['seuil_jour' => 35'seuil_nuit' => 18],
  411.     '11' => ['seuil_jour' => 35'seuil_nuit' => 22],
  412.     '12' => ['seuil_jour' => 36'seuil_nuit' => 19],
  413.     '13' => ['seuil_jour' => 35'seuil_nuit' => 24],
  414.     '14' => ['seuil_jour' => 31'seuil_nuit' => 18],
  415.     '15' => ['seuil_jour' => 32'seuil_nuit' => 18],
  416.     '16' => ['seuil_jour' => 36'seuil_nuit' => 20],
  417.     '17' => ['seuil_jour' => 35'seuil_nuit' => 20],
  418.     '18' => ['seuil_jour' => 35'seuil_nuit' => 19],
  419.     '19' => ['seuil_jour' => 36'seuil_nuit' => 19],
  420.     '20' => ['seuil_jour' => 33'seuil_nuit' => 23],
  421. //    '2B' => ['seuil_jour' => 33, 'seuil_nuit' => 23],
  422.     '21' => ['seuil_jour' => 34'seuil_nuit' => 19],
  423.     '22' => ['seuil_jour' => 31'seuil_nuit' => 18],
  424.     '23' => ['seuil_jour' => 34'seuil_nuit' => 20],
  425.     '24' => ['seuil_jour' => 36'seuil_nuit' => 20],
  426.     '25' => ['seuil_jour' => 33'seuil_nuit' => 19],
  427.     '26' => ['seuil_jour' => 36'seuil_nuit' => 21],
  428.     '27' => ['seuil_jour' => 34'seuil_nuit' => 19],
  429.     '28' => ['seuil_jour' => 34'seuil_nuit' => 18],
  430.     '29' => ['seuil_jour' => 32'seuil_nuit' => 19],
  431.     '30' => ['seuil_jour' => 36'seuil_nuit' => 23],
  432.     '31' => ['seuil_jour' => 36'seuil_nuit' => 21],
  433.     '32' => ['seuil_jour' => 36'seuil_nuit' => 20],
  434.     '33' => ['seuil_jour' => 35'seuil_nuit' => 21],
  435.     '34' => ['seuil_jour' => 35'seuil_nuit' => 22],
  436.     '35' => ['seuil_jour' => 34'seuil_nuit' => 20],
  437.     '36' => ['seuil_jour' => 35'seuil_nuit' => 19],
  438.     '37' => ['seuil_jour' => 35'seuil_nuit' => 19],
  439.     '38' => ['seuil_jour' => 34'seuil_nuit' => 19],
  440.     '39' => ['seuil_jour' => 34'seuil_nuit' => 20],
  441.     '40' => ['seuil_jour' => 35'seuil_nuit' => 20],
  442.     '41' => ['seuil_jour' => 35'seuil_nuit' => 19],
  443.     '42' => ['seuil_jour' => 35'seuil_nuit' => 19],
  444.     '43' => ['seuil_jour' => 32'seuil_nuit' => 18],
  445.     '44' => ['seuil_jour' => 34'seuil_nuit' => 20],
  446.     '45' => ['seuil_jour' => 34'seuil_nuit' => 19],
  447.     '46' => ['seuil_jour' => 36'seuil_nuit' => 20],
  448.     '47' => ['seuil_jour' => 36'seuil_nuit' => 20],
  449.     '48' => ['seuil_jour' => 33'seuil_nuit' => 18],
  450.     '49' => ['seuil_jour' => 34'seuil_nuit' => 20],
  451.     '50' => ['seuil_jour' => 31'seuil_nuit' => 18],
  452.     '51' => ['seuil_jour' => 34'seuil_nuit' => 18],
  453.     '52' => ['seuil_jour' => 34'seuil_nuit' => 19],
  454.     '53' => ['seuil_jour' => 34'seuil_nuit' => 20],
  455.     '54' => ['seuil_jour' => 34'seuil_nuit' => 18],
  456.     '55' => ['seuil_jour' => 34'seuil_nuit' => 18],
  457.     '56' => ['seuil_jour' => 32'seuil_nuit' => 18],
  458.     '57' => ['seuil_jour' => 34'seuil_nuit' => 19],
  459.     '58' => ['seuil_jour' => 34'seuil_nuit' => 19],
  460.     '59' => ['seuil_jour' => 33'seuil_nuit' => 18],
  461.     '60' => ['seuil_jour' => 34'seuil_nuit' => 18],
  462.     '61' => ['seuil_jour' => 34'seuil_nuit' => 19],
  463.     '62' => ['seuil_jour' => 33'seuil_nuit' => 18],
  464.     '63' => ['seuil_jour' => 34'seuil_nuit' => 19],
  465.     '64' => ['seuil_jour' => 34'seuil_nuit' => 20],
  466.     '65' => ['seuil_jour' => 34'seuil_nuit' => 19],
  467.     '66' => ['seuil_jour' => 35'seuil_nuit' => 23],
  468.     '67' => ['seuil_jour' => 34'seuil_nuit' => 19],
  469.     '68' => ['seuil_jour' => 35'seuil_nuit' => 19],
  470.     '69' => ['seuil_jour' => 34'seuil_nuit' => 20],
  471.     '70' => ['seuil_jour' => 34'seuil_nuit' => 18],
  472.     '71' => ['seuil_jour' => 34'seuil_nuit' => 20],
  473.     '72' => ['seuil_jour' => 35'seuil_nuit' => 20],
  474.     '73' => ['seuil_jour' => 34'seuil_nuit' => 19],
  475.     '74' => ['seuil_jour' => 34'seuil_nuit' => 19],
  476.     '75' => ['seuil_jour' => 31'seuil_nuit' => 21],
  477.     '76' => ['seuil_jour' => 33'seuil_nuit' => 18],
  478.     '77' => ['seuil_jour' => 34'seuil_nuit' => 18],
  479.     '78' => ['seuil_jour' => 33'seuil_nuit' => 20],
  480.     '79' => ['seuil_jour' => 35'seuil_nuit' => 20],
  481.     '80' => ['seuil_jour' => 33'seuil_nuit' => 18],
  482.     '81' => ['seuil_jour' => 36'seuil_nuit' => 21],
  483.     '82' => ['seuil_jour' => 36'seuil_nuit' => 21],
  484.     '83' => ['seuil_jour' => 35'seuil_nuit' => 23],
  485.     '84' => ['seuil_jour' => 36'seuil_nuit' => 21],
  486.     '85' => ['seuil_jour' => 34'seuil_nuit' => 20],
  487.     '86' => ['seuil_jour' => 34'seuil_nuit' => 20],
  488.     '87' => ['seuil_jour' => 35'seuil_nuit' => 19],
  489.     '88' => ['seuil_jour' => 34'seuil_nuit' => 18],
  490.     '89' => ['seuil_jour' => 35'seuil_nuit' => 19],
  491.     '90' => ['seuil_jour' => 33'seuil_nuit' => 18],
  492.     '91' => ['seuil_jour' => 35'seuil_nuit' => 20],
  493.     '92' => ['seuil_jour' => 31'seuil_nuit' => 21],
  494.     '93' => ['seuil_jour' => 31'seuil_nuit' => 21],
  495.     '94' => ['seuil_jour' => 31'seuil_nuit' => 21],
  496.     '95' => ['seuil_jour' => 35'seuil_nuit' => 20],
  497. ];
  498. }
  499.  
  500.     
  501.     
  502. }