src/Controller/MeteoController.php line 369

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Service\MeteoFranceService;
  4. use App\DTO\StationMeteoDTO;
  5. use App\Form\StationMeteoType
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\HttpFoundation\JsonResponse;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\Routing\Annotation\Route;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use App\Entity\Pluviometrie;
  13. use App\Entity\StationsMeteo;
  14. set_time_limit(36000);
  15. class MeteoController extends AbstractController {
  16. //    private HttpClientInterface $client;
  17. //    private CacheInterface $cache;
  18. //    private string $apiKey;
  19. //    private string $tokenUrl;
  20. //    private string $apiUrl;
  21.     
  22.     public function __construct(private MeteoFranceService $meteoServiceStationMeteoType $stationMeteoType){//, HttpClientInterface $client, CacheInterface $cache, string $apiKey, string $meteoFranceTokenUrl, string $meteoFranceApiUrl) {
  23.         $this->stationMeteoType $stationMeteoType;
  24.     }
  25.     #[Route(path'/meteo/stations/tous'name'meteo_stations_tous')]
  26.     public function getAllStationsData(EntityManagerInterface $em\App\Repository\PluvioDatabaseRepository $pluvioRepo,
  27.             Request $req): Response {
  28.         // Liste des départements (exemple de 5 départements, tu peux en ajouter plus)
  29.         $departements = ['974','976','984''985','986','987','988'];
  30.             //'17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32',
  31.             //'33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50','51','52','53','54','55','56','57',
  32.             //'58','59','60','61','62','63','64','65','66','67','68','69','70','71','72','73','74','75','76','77','78','79','80','81','82',
  33.             //'83','84','85','86','87','88','89','90','91','92','93','94','95','971','972','973',
  34.          //,   ,
  35.             //'11','12','13','14','15','16',
  36.            // '01','02']; '05','06','07','08','09','10'// Remplace par la liste complète des départements
  37.         
  38.         //[
  39.             //'75','92', '69','91','13','31','44',           
  40.             //'33'//,'35','51','06','67','38','73','63','76',
  41.              //    '26','53','45','59','16','84','79','2A','37','64','34','85','49','74','29','56','95','14','25','10',
  42.              //    '86','42','77','87','54','71','39','50','60','17','22','72','41','83','90','28','52','12','05','89',
  43.              //    '18','01','04','19','40','48','47','88','57','03','30','27','46','08','58','65','15','81','36','2B',
  44.              // '66','62','82','43','61','02','24','55','11','32','07','70','09','23'
  45.             //'78'//'93'//,'93',,  '21'// 
  46.           //  ];
  47.         
  48.         
  49.         $stationsData = [];
  50.         $commandeArray = []; // Initialisation pour éviter l'erreur Undefined variable
  51.         $columnDataArray = []; // Initialisation pour stocker les données des colonnes
  52.         // Boucle pour récupérer les données pour chaque département
  53. //        foreach ($departements as $departement) {
  54. //            try {
  55. //                $stations = $this->meteoService->getStationsByDepartment($departement);
  56. //
  57. //                // Ajouter le numéro du département à chaque station
  58. //                foreach ($stations as &$station) {
  59. //                    $station['departement'] = $departement;
  60. //                }
  61. //
  62. //                $stationsData[$departement] = $stations;
  63. //            } catch (\Exception $e) {
  64. //                $stationsData[$departement] = ['error' => $e->getMessage()];
  65. //            }
  66. //            
  67. //                // Pause pour respecter la limite de 50 requêtes par minute
  68. //               usleep(1300000); // 1,2 secondes = 1 200 000 microsecondes
  69. //            
  70. //        }
  71. //
  72. //        dump($stationsData);
  73. //
  74. //        foreach ($stationsData as $listeStationsDdepartement) {
  75.             
  76.             //$listeStationsDdepartement = $em->getRepository(StationsMeteo::class)->findAll();
  77.             $listeStationsDdepartement $em->getRepository(StationsMeteo::class)
  78.     ->createQueryBuilder('s')
  79.     ->where('s.departement > :min')
  80.     ->andWhere('s.departement < :max')
  81.     ->setParameter('min'39)
  82.     ->setParameter('max'41)
  83.     ->getQuery()
  84.     ->getResult();
  85.             // Pour chaque station, on réalise une commande
  86.             foreach ($listeStationsDdepartement as $station) {
  87.                 dump($station);
  88.             //    if ($station['typePoste'] < 2) {
  89.                     $stationId $station->getIdStation();
  90.                      dump($stationId);
  91.                     $AnneesEtudiees = [];
  92.                     foreach (range(20202024) as $annee) {
  93.                         $AnneesEtudiees[$annee] = [
  94.                             'dateDeb' => "{$annee}-01-01T00%3A00%3A00Z",
  95.                             'dateFin' => "{$annee}-12-31T00%3A00%3A00Z",
  96.                         ];
  97.                     }
  98.                     
  99.                     foreach ($AnneesEtudiees as $annee => $AnneeEtudiee) {
  100.                         //check si déjà commandé ?
  101.                         $dejaCommandee null;
  102.                         $stationEntity $em->getRepository(StationsMeteo::class)->findOneBy(['IdStation' => $stationId]);
  103.                         if ($stationEntity) {
  104.                             $dejaCommandee $em->getRepository(Pluviometrie::class)->findOneBy([
  105.                                 'idStation' => $stationEntity,
  106.                                 'annee' => $annee
  107.                             ]);
  108.                         }
  109.                         if (!$dejaCommandee) {
  110.                             $commande $this->meteoService->getStationData($stationId$AnneeEtudiee);
  111.                             $commandeArray[$stationId][$annee] = $commande;
  112.                             // Pause pour respecter la limite de 50 requêtes par minute
  113.                             usleep(1300000); // 1,2 secondes = 1 200 000 microsecondes
  114.                         }
  115.                     }
  116.                     //$nomDesStations[] = $station['nom'];
  117.                     
  118.                     $stationDB $em->getRepository(StationsMeteo::class)->findOneBy(['IdStation' => $stationId]);
  119.                     if (!$stationDB) {
  120.                         // Si la station n'existe pas, alors crée-la
  121.                         //saisie dans la bdd
  122.                         $stationDB = new \App\Entity\StationsMeteo();
  123.                         $stationDB->setNomStation($station['nom']);
  124.                         $stationDB->setTypeStation($station['typePoste']);
  125.                         $stationDB->setDepartement($station['departement']);
  126.                         $stationDB->setIdStation($station['id']);
  127.                         dump($stationDB);
  128.                         $em->persist($stationDB);
  129.                         $em->flush();
  130.                     }
  131.             //    }
  132.             }
  133.        // }
  134.         dump($commandeArray);
  135.         $erreur500 null;
  136.         $extractedData null;
  137.         // Récupération des fichiers à partir des commandes
  138.         foreach ($commandeArray as $stationId => $anneesData) {
  139.             dump($anneesData);
  140.             $erreur null;
  141.             
  142.             foreach ($anneesData as $AnneeEtudiee => $commandeAnnee) {
  143.                 $commandeId $commandeAnnee['elaboreProduitAvecDemandeResponse']['return'];
  144.                 dump($commandeId);
  145.                 $csvString $this->meteoService->getFichier($commandeId);
  146.                 // Pause pour respecter la limite de 50 requêtes par minute
  147.                 usleep(1300000); // 1,2 secondes = 1 200 000 microsecondes  
  148.                 
  149.                 if ($csvString == 'Erreur 500'){
  150.                     $erreur500[$commandeId] = $stationId;                    
  151.                     $erreur 1;
  152.                 } else {
  153.                                    // Diviser la chaîne en lignes
  154.                     $lines explode("\n"$csvString);
  155.                     // Tableau pour stocker les données extraites
  156.                     $extractedData = [];
  157.                     foreach ($lines as $index => $line) {
  158.                         // Ignorer la première ligne (en-tête)
  159.                         if ($index === 0) {
  160.                             continue;
  161.                         }
  162.                         // Diviser chaque ligne en colonnes par le séparateur ;
  163.                         $columns explode(";"$line);
  164.                         // Vérifier qu'il y a suffisamment de colonnes
  165.                         if (count($columns) > 2) {
  166.                             // Extraire ce qui se situe entre le 3ème et 4ème point-virgule
  167.                             $data $columns[2]; // Récupère la valeur de l'élément à l'index 2 (entre 3ème et 4ème point-virgule)
  168.                             // Remplacer les virgules par des points
  169.                             $data str_replace(",""."$data);
  170.                             $extractedData[] = $data;
  171.                         }
  172.                     }
  173.                     // Création de l'entité Pluviometrie
  174.                     $entity = new \App\Entity\Pluviometrie();
  175.                     $entity->setRainData($extractedData);
  176.                     dump($stationId);
  177.                     // Vérifie si tu récupères bien l'entité StationsMeteo avant de l'assigner
  178.                     $station $em->getRepository(StationsMeteo::class)->findOneBy(['IdStation' => $stationId]);
  179.                     if ($station) {
  180.                         $entity->setIdStation($station); // Assigner l'entité StationMeteo
  181.                     } else {
  182.                         // Gérer le cas où la station n'existe pas
  183.                         throw new \Exception("Station not found");
  184.                     }
  185.                     // Lier l'année à Pluviometrie
  186.                     $entity->setAnnee($AnneeEtudiee);
  187.                     // Persister l'entité
  188.                     $em->persist($entity);
  189.                     
  190.                 }
  191.             }
  192.             
  193.             if (!$erreur){
  194.                 $em->flush();
  195.             }
  196.             
  197.         }
  198. // Flush une seule fois après avoir traité toutes les données
  199.         
  200. $query $em->createQueryBuilder()
  201.     ->select('s.id')  // On récupère uniquement l'ID de la station météo
  202.     ->from(\App\Entity\Pluviometrie::class, 'p')
  203.     ->join('p.idStation''s')  // Jointure avec StationsMeteo
  204.     ->getQuery();
  205. $idStations $query->getResult();
  206.     dump($idStations); //die();
  207.     
  208.     // Extraction des ID des stations météorologiques
  209.     $idStation = [];
  210.     foreach ($idStations as $idStation) {
  211.         
  212.             $idStationArray[] = $idStation['id'];
  213.         
  214.     }
  215. dump($idStationArray);
  216.     // Supprimer les doublons d'ID
  217.     $listeUniqueIdStation array_unique($idStationArray);
  218. dump($listeUniqueIdStation); 
  219.     // Récupérer toutes les stations correspondantes
  220.     $stationDBAll $em->getRepository(\App\Entity\StationsMeteo::class)
  221.                        ->findBy(['id' => $listeUniqueIdStation], ['departement' => 'ASC']);
  222. dump($stationDBAll); //die();
  223.     return $this->render('meteoFrance.html.twig', ['stationDBAll' => $stationDBAll]);
  224.     }
  225.     #[Route(path'/meteo/listeStation'name'listeStation')]
  226.     public function listeStation(EntityManagerInterface $em\App\Repository\PluvioDatabaseRepository $pluvioRepo,
  227.             Request $req): Response {
  228. $stationDBAll $em->getRepository(StationsMeteo::class)->findAll();
  229. return $this->render('meteoFrance.html.twig', ['stationDBAll' => $stationDBAll]);
  230.     }
  231.     
  232.     
  233.     #[Route(path'/meteo/station/{stationId}'name'meteo_station_data')]
  234.     public function getStationData(string $stationId): JsonResponse {
  235.         try {
  236.             // Récupérer les données pour la station spécifiée et la période
  237.             $data $this->meteoService->getStationData($stationId);
  238.             return new JsonResponse($data); // Retourner les données au format JSON
  239.         } catch (\Exception $e) {
  240.             return new JsonResponse(['error' => $e->getMessage()]);
  241.         }
  242.     }
  243.     #[Route(path'/meteo/commande/{commandeId}'name'meteo_commande')]
  244.     public function getFichier(string $commandeId): Response {
  245.         // Récupérer les données pour la station spécifiée et la période
  246.         $data $this->meteoService->getFichier($commandeId);
  247.         return new Response(
  248.                 $data,
  249.                 Response::HTTP_OK,
  250.                 ['Content-Type' => 'text/plain']
  251.         );
  252.     }
  253.     
  254.     
  255.     #[Route(path'/meteo/stations/{departmentId}/precipitation'name'meteo_stations'methods: ['GET'])]
  256.     public function getStations(string $departmentId) {
  257.         // Récupérer les données pour le département spécifié
  258.         $data $this->meteoService->getStationsByDepartment($departmentId);
  259.         dump($data);
  260.         // Retourner les données sous forme de réponse JSON
  261.         return new JsonResponse($data);
  262.     }
  263.     #[Route(path'/meteo/commande/tous'name'commande_tous')]
  264.     public function getCommandeData(): JsonResponse {
  265.         // Liste des départements (exemple de 5 départements, tu peux en ajouter plus)
  266.         $departements = ['01''02']; // Remplace par la liste complète des départements
  267.         $stationsData = [];
  268.         // Boucle pour récupérer les données pour chaque département
  269.         foreach ($departements as $departement) {
  270.             //           try {
  271.             dump($departement);
  272.             $stationsData[$departement] = $this->meteoService->getStationsByDepartment($departement);
  273.             //           } catch (\Exception $e) {
  274.             //               $stationsData[$departement] = ['error' => $e->getMessage()];
  275.             //           }
  276.         }
  277.         dump($stationsData);
  278.         // Pour chaque station, on réalise une commande
  279.         //$commandeArray = $this->meteoService->getStationData($stationId);
  280.         // Pour chaque commande, on obtient un fichier
  281.         //$fichier = $this->meteoService->getFichier($commandeId);
  282.         return $this->render('meteoFrance.html.twig');
  283.     }
  284.     
  285. //    #[Route(path: '/meteo/testToken', name: 'testToken')]
  286. //    public function gettestToken(string $tokenUrl): Response {
  287. //
  288. //        // Récupérer les données pour la station spécifiée et la période
  289. //        $tokenUrl = $this->meteoService->getrefreshToken();
  290. //        return new Response(
  291. //                $tokenUrl,
  292. //                Response::HTTP_OK,
  293. //                ['Content-Type' => 'text/plain']
  294. //        );
  295. //    }
  296.     
  297. #[Route(path'/meteo/listeDesStations'name'listeDesStations')]
  298. public function listeDesStations(EntityManagerInterface $em\App\Repository\PluvioDatabaseRepository $pluvioRepoRequest $req): Response 
  299. {
  300.     // Récupération de toutes les données de pluviométrie
  301.     //$pluviometrieAll = $em->getRepository(\App\Entity\Pluviometrie::class)->findAll();
  302.     
  303. $query $em->createQueryBuilder()
  304.     ->select('s.id')  // On récupère uniquement l'ID de la station météo
  305.     ->from(\App\Entity\Pluviometrie::class, 'p')
  306.     ->join('p.idStation''s')  // Jointure avec StationsMeteo
  307.     ->getQuery();
  308. $idStations $query->getResult();
  309.     dump($idStations); //die();
  310.     
  311.     // Extraction des ID des stations météorologiques
  312.     $idStation = [];
  313.     foreach ($idStations as $idStation) {
  314.         
  315.             $idStationArray[] = $idStation['id'];
  316.         
  317.     }
  318. dump($idStationArray);
  319.     // Supprimer les doublons d'ID
  320.     $listeUniqueIdStation array_unique($idStationArray);
  321. dump($listeUniqueIdStation); 
  322.     // Récupérer toutes les stations correspondantes
  323.     $stationDBAll $em->getRepository(\App\Entity\StationsMeteo::class)
  324.                        ->findBy(['id' => $listeUniqueIdStation], ['departement' => 'ASC']);
  325. dump($stationDBAll); //die();
  326.     return $this->render('meteoFrance.html.twig', ['stationDBAll' => $stationDBAll]);
  327. }
  328.     /**
  329.      * @Route("/chart", name="chart")
  330.      */
  331.     public function index(Request $request): Response
  332.     {    
  333.         // Créer une instance du DTO pour passer au formulaire
  334.         $stationMeteoDTO = new StationMeteoDTO();
  335.         
  336.         // Créer le formulaire avec l'objet DTO
  337.         $form $this->createForm(StationMeteoType::class, $stationMeteoDTO);
  338.         // Gérer la soumission du formulaire
  339.         $form->handleRequest($request);
  340.         if ($form->isSubmitted() && $form->isValid()) {
  341.             // Récupérer les données du formulaire
  342.             $data $form->getData();
  343.             dump($data);
  344.             // Tu as directement accès à l'objet StationMeteoDTO ici
  345.             $apikey $data->getApikey();  // Accès via la méthode getter
  346.             $stationAPI $data->getStationAPI();  // Accès via la méthode getter
  347.            
  348.             // Appeler le service pour obtenir les données météo
  349.           //  try {
  350.                 
  351.                 
  352.                // $result = $this->météoService->getStationDataHoraire($data['stationId'], $AnneeEtudiee, $data['apiKey']);
  353.                
  354.     
  355.         
  356.         
  357.         
  358.         
  359.         
  360.         $stationsData = [];
  361.         $commandeArray = []; // Initialisation pour éviter l'erreur Undefined variable
  362.         $columnDataArray = []; // Initialisation pour stocker les données des colonnes  
  363.                     $AnneesEtudiees = [];
  364.                     foreach (range(20182024) as $annee) {
  365.                         $AnneesEtudiees[$annee] = [
  366.                             'dateDeb' => "{$annee}-01-01T00%3A00%3A00Z",
  367.                             'dateFin' => "{$annee}-12-31T00%3A00%3A00Z",
  368.                         ];
  369.                     }
  370.                     
  371.                     foreach ($AnneesEtudiees as $annee => $AnneeEtudiee) {
  372.                             $commande $this->meteoService->getStationDataHoraire($stationAPI$AnneeEtudiee$apikey);
  373.                             $commandeArray[$stationAPI][$annee] = $commande;
  374.                             // Pause pour respecter la limite de 50 requêtes par minute
  375.                             usleep(1300000); // 1,2 secondes = 1 200 000 microsecondes
  376.                         }
  377.         dump($commandeArray);
  378.         $erreur500 null;
  379.         $extractedData = [];
  380.         // Récupération des fichiers à partir des commandes
  381.         foreach ($commandeArray as $stationAPI => $anneesData) {
  382.             dump($anneesData);
  383.             $erreur null;
  384.             
  385.             foreach ($anneesData as $AnneeEtudiee => $commandeAnnee) {
  386.                 $commandeId $commandeAnnee['elaboreProduitAvecDemandeResponse']['return'];
  387. //                dump($commandeId);
  388.                 $csvString $this->meteoService->getFichier($commandeId$apikey);
  389.                // dump($csvString);
  390.                 // Pause pour respecter la limite de 50 requêtes par minute
  391.                 usleep(1300000); // 1,2 secondes = 1 200 000 microsecondes  
  392.                 
  393.                 if ($csvString == 'Erreur 500'){
  394.                     $erreur500[$commandeId] = $stationId;                    
  395.                     $erreur 1;
  396.                 } else {
  397.                                    // Diviser la chaîne en lignes
  398.                     $lines explode("\n"$csvString);
  399.                     // Tableau pour stocker les données extraites
  400.                     $data = [];
  401.                     
  402.                     foreach ($lines as $index => $line) {
  403.                         // Ignorer la première ligne (en-tête)
  404.                         if ($index === 0) {
  405.                             continue;
  406.                         }
  407.                         // Diviser chaque ligne en colonnes par le séparateur ;
  408.                         $columns explode(";"$line);
  409.                         // Vérifier qu'il y a suffisamment de colonnes
  410.                         if (count($columns) > 2) {
  411.                             // Extraire ce qui se situe entre le 3ème et 4ème point-virgule
  412.                             $data['date'] = str_replace(",""."$columns[1]);
  413.                             $data['temperature'] = str_replace(",""."$columns[10]);
  414.                             $data['vitesse'] = str_replace(",""."$columns[48]);
  415.                             $data['direction'] = str_replace(",""."$columns[50]);
  416.                             
  417.                             $extractedData[] = $data;
  418.                             $extractedDataParAn[$AnneeEtudiee][] = $data;
  419.                         }
  420.                     }                    
  421.                 }
  422.             }                     
  423.         }
  424. //        dump($extractedDataParAn);
  425.         
  426.         
  427.         $directions = ['N''NNE''NE''ENE''E''ESE''SE''SSE',
  428.             'S''SSW''SW''WSW''W''WNW''NW''NNW'];
  429.         $classesVitesse = [
  430.             '<1' => [01],
  431.             '1–5' => [15],
  432.             '5–10' => [510],
  433.             '10–15' => [1015],
  434.             '>15' => [15INF],
  435.         ];
  436.         $roseDesVents = [];
  437.         foreach ($directions as $dir) {
  438.             foreach ($classesVitesse as $classe => $_) {
  439.                 $roseDesVents[$dir][$classe] = 0;
  440.             }
  441.             $roseDesVents[$dir]['Total'] = 0;
  442.         }
  443.         function getWindDirection16($deg) {
  444.             $dirs = ['N''NNE''NE''ENE''E''ESE''SE''SSE',
  445.                 'S''SSW''SW''WSW''W''WNW''NW''NNW'];
  446.             $index = (int) round($deg 22.5) % 16;
  447.             return $dirs[$index];
  448.         }
  449.         function getVitesseClasse($vitesse$classesVitesse) {
  450.             foreach ($classesVitesse as $label => [$min$max]) {
  451.                 if ($vitesse >= $min && $vitesse $max) {
  452.                     return $label;
  453.                 }
  454.             }
  455.             return '>10'// fallback
  456.         }
  457.         $totalObservations 0;
  458.         foreach ($extractedData as $data) {
  459.             $direction floatval($data['direction']);
  460.             $vitesse floatval($data['vitesse']);
  461.             if ($vitesse || $direction || $direction 360)
  462.                 continue;
  463.             $dirName getWindDirection16($direction);
  464.             $classeVitesse getVitesseClasse($vitesse$classesVitesse);
  465.             $roseDesVents[$dirName][$classeVitesse]++;
  466.             $roseDesVents[$dirName]['Total']++;
  467.             $totalObservations++;
  468.         }
  469.         // Convertir en % de fréquence
  470.         foreach ($roseDesVents as $dir => $classes) {
  471.             foreach ($classesVitesse as $classe => $_) {
  472.                 $count $roseDesVents[$dir][$classe];
  473.                 $roseDesVents[$dir][$classe] = round(($count $totalObservations) * 1002);
  474.             }
  475.             // Total (par direction, toutes vitesses confondues)
  476.             $countTotal $roseDesVents[$dir]['Total'];
  477.             $roseDesVents[$dir]['Total'] = round(($countTotal $totalObservations) * 1002);
  478.         }
  479.         
  480.         $stationKey $this->getKeyById($stationAPI);
  481.         
  482.         $summerData = [];
  483.                 $winterData = [];
  484.                 foreach ($extractedData as $data) {
  485.                     // Récupérer l'année, le mois et le jour de la date
  486.                     $date $data['date'];  // Assurez-vous que la date est au format AAAAMMJJHH
  487.                     $year substr($date04); // AAAA
  488.                     $month substr($date42); // MM
  489.                     $day substr($date62);   // JJ
  490.                     // Vérifier si la date correspond à l'été (juin, juillet, août)
  491.                     if (in_array($month, ['06''07''08'])) {
  492.                         $summerData[] = $data;
  493.                     }
  494.                     // Vérifier si la date correspond à l'hiver (décembre, janvier, février)
  495.                     elseif (in_array($month, ['12''01''02'])) {
  496.                         $winterData[] = $data;
  497.                     }
  498.                 }
  499. // Traiter les données d'été et d'hiver de la même manière que pour les données globales
  500.                 $summerRoseDesVents $this->processWindData($summerData$classesVitesse);
  501.                 $winterRoseDesVents $this->processWindData($winterData$classesVitesse);
  502.                 
  503. //                dump($summerRoseDesVents);
  504. //                dump($roseDesVents);
  505.                 
  506. // Passer les données au template
  507.         return $this->render('chart.html.twig', [
  508.                             'roseDesVents' => $roseDesVents,
  509.                             'summerRoseDesVents' => $summerRoseDesVents,
  510.                             'winterRoseDesVents' => $winterRoseDesVents,
  511.                             'directions' => $directions,
  512.                             'stationKey' => $stationKey,
  513.             'form' => $form->createView(),
  514.         ]);
  515.         
  516. //            } catch (\Exception $e) {
  517. //                // Gérer les erreurs
  518. //                $this->addFlash('error', 'Erreur : ' . $e->getMessage());
  519. //            }
  520.         }
  521.         // Rendre la vue du formulaire
  522.         return $this->render('formulaireWindrose.html.twig', [
  523.             'form' => $form->createView(),
  524.         ]);
  525.         
  526.         
  527.     }
  528.     // Méthode pour obtenir la clé en fonction de l'ID
  529.     public function getKeyById($id)
  530.     {
  531.         // Récupérer le tableau des stations et IDs à partir de StationMeteoType
  532.         $choices $this->stationMeteoType->getStationAPIChoices();
  533.         // Rechercher la clé correspondant à l'ID
  534.         $key array_search($id$choices);
  535.         // Si l'ID est trouvé, retourne la clé, sinon retourne null
  536.         return $key !== false $key null;
  537.     }
  538.     
  539.     
  540.     private function processWindData(array $data, array $classesVitesse)
  541. {
  542.     $roseDesVents = [];
  543.     foreach ($data as $dataPoint) {
  544.         $direction floatval($dataPoint['direction']);
  545.         $vitesse floatval($dataPoint['vitesse']);
  546.     
  547.         if ($vitesse || $direction || $direction 360) {
  548.             continue;
  549. }
  550.         $dirName getWindDirection16($direction);
  551.         $classeVitesse getVitesseClasse($vitesse$classesVitesse);
  552.         if (!isset($roseDesVents[$dirName])) {
  553.             $roseDesVents[$dirName] = [];
  554.         }
  555.         if (!isset($roseDesVents[$dirName][$classeVitesse])) {
  556.             $roseDesVents[$dirName][$classeVitesse] = 0;
  557.         }
  558.         $roseDesVents[$dirName][$classeVitesse]++;
  559.     }
  560.     // Convertir en % de fréquence
  561.     $totalObservations array_sum(array_map(function ($direction) {
  562.         return array_sum($direction);
  563.     }, $roseDesVents));
  564.     //dump($roseDesVents);
  565. // S'assurer que chaque direction contient toutes les classes avec une valeur par défaut
  566. foreach ($roseDesVents as $dir => &$classes) {
  567.     foreach ($classesVitesse as $classe => $_) {
  568.         if (!isset($classes[$classe])) {
  569.             $classes[$classe] = 0;
  570.         }
  571.     }
  572. }
  573. // Important : libérer la référence
  574. unset($classes);
  575. // Ensuite, tu peux faire le calcul des pourcentages
  576. foreach ($roseDesVents as $dir => $classes) {
  577.     foreach ($classesVitesse as $classe => $_) {
  578.         $count $roseDesVents[$dir][$classe];
  579.         $roseDesVents[$dir][$classe] = round(($count $totalObservations) * 1002);
  580.     }
  581.     // Pareil pour Total (si tu veux l’inclure dans le tableau final)
  582.     $roseDesVents[$dir]['Total'] = round((array_sum($roseDesVents[$dir]) / 100), 2);
  583. }
  584.     return $roseDesVents;
  585. }
  586.     
  587.     
  588.     
  589. }