/** * @param $spot :spot dont il est question * @param $em: Entity Manager, pour utiliser doctrine * @return $tabNbHoure : tableau contenant une date par ligne, puis une colonne pour chaque heure ouverte à la nav : * - l'état des marées, * - les prévisions */ static function createTabNbHoureNav($spot, $em) { $tabDataNbHoureNav = array(); $tabDataMeteo = array(); // Pour les 7 prochains jours $day = new \DateTime("now"); for ($nbPrevision = 0; $nbPrevision < 7; $nbPrevision++) { $tabHoure = array(); for ($houre = CreateNbHoureCommand::HEURE_MATIN; $houre < CreateNbHoureCommand::HEURE_SOIR; $houre++) { $tabHoure[$houre] = array(); } $tabDataNbHoureNav[$day->format('Y-m-d')] = $tabHoure; $tabDataMeteo[$day->format('Y-m-d')] = array(); $day->modify('+1 day'); } //********** Marée ********** // récupére les futures marées $listeMareeFuture = $em->getRepository('LaPoizWindBundle:MareeDate')->getFuturMaree($spot); foreach ($listeMareeFuture as $mareeDate) { // Pour chaque jour, calculer pour chaque heure le temps de navigation MareeTools::calculNbHoureNav($spot, $tabDataNbHoureNav[$mareeDate->getDatePrev()->format('Y-m-d')], $mareeDate); } //********** Wind *********** // Récupere toutes les futures prévisions de vent pour le spot $listALlPrevisionDate = $em->getRepository('LaPoizWindBundle:PrevisionDate')->getPrevDateAllWebSiteNextDays($spot); $tabAllPrevisionDate = array(); // Construit un tableau ayant des cellules contenant toutes les previsions des differents sites par jour pour le spot foreach ($listALlPrevisionDate as $previsionDate) { $tabAllPrevisionDate[$previsionDate->getDatePrev()->format('Y-m-d')][] = $previsionDate; } // $tabAllPrevisionDate with data foreach ($tabDataNbHoureNav as $keyDate => $toto) { if (array_key_exists($keyDate, $tabAllPrevisionDate)) { //$noteDate = ManageNote::getNotesDate($spot,\DateTime::createFromFormat('Y-m-d',$keyDate), $em); NbHoureWind::calculNbHoureNav($spot, $tabDataNbHoureNav[$keyDate], $tabAllPrevisionDate[$keyDate]); } } //********** Meteo *********** // Récupere la météo (T°C, nuage ....) pour le spot qui sera utilisé pour noter l'agréabilité foreach ($tabDataNbHoureNav as $keyDate => $toto) { if (array_key_exists($keyDate, $tabAllPrevisionDate)) { foreach ($tabAllPrevisionDate[$keyDate] as $previsionDate) { // pour chaque website = $previsionDate (même spot, même jour) if ($previsionDate->getDataWindPrev()->getWebSite()->getNom() == WebsiteGetData::meteoFranceName) { foreach ($previsionDate->getListPrevision() as $prevision) { $houre = intval($prevision->getTime()->format('H')); if (NbHoureWind::isInGoodTime($houre)) { $tabDataMeteo[$keyDate][$houre] = array(); $tabDataMeteo[$keyDate][$houre]["temp"] = $prevision->getTemp(); $tabDataMeteo[$keyDate][$houre]["meteo"] = $prevision->getMeteo(); $tabDataMeteo[$keyDate][$houre]["precipitation"] = $prevision->getPrecipitation(); } } } } } } return array($tabDataNbHoureNav, $tabDataMeteo); }
/** * @param $spot * @param $tabHoure : array $tabHoure[$nbHoure] for the day * @param $mareeDate : prévision de marre que l'on va analyser * Remplis le $tabHoure avec le temps de navigation possible pour chaque heure=elem du tab */ static function calculNbHoureMaree($spot, $tabHoure, $mareeDate) { $listePrevisionMaree = $mareeDate->getListPrevision(); // liste des marées extreme de la journée if ($listePrevisionMaree != null && count($listePrevisionMaree) >= 2) { // *** Calcul de la formule de la courbe: y = a sin(wt + Phi) + b *** // t=time en seconde, y=hauteur en metre, w: phase 2 pi / T , T: fréquence // résolution de l'équation // calcul le temps de nav par heure MareeTools::calculNbHoureNav($listePrevisionMaree, $spot, $tabHoure); } }
/** * @param $spot * @param $mareeDate : prévision de marre que l'on va analyser * @return: Array: un tableau contenant la liste des plages horaires OK, KO et Warn */ private static function getPlageRestriction($spot, $mareeDate) { $mareeStateArray = array(); $listePrevisionMaree = $mareeDate->getListPrevision(); if ($listePrevisionMaree != null && count($listePrevisionMaree) >= 2) { // pour chaque $restriction de $spot->getMareeRestriction() foreach ($spot->getMareeRestriction() as $mareeRestriction) { list($timeInState, $timeTab) = MareeTools::calculTimeInState($mareeRestriction, $listePrevisionMaree); $mareeStateArray[$mareeRestriction->getState()] = $timeTab; } } return $mareeStateArray; }
/** * @param $spot * @param $tabNotes : array $tabNotes['Y-m-d'] for next 7 days * @param $mareeDate : prévision de marre que l'on va analyser * return: la note vis à vis de la marée */ static function calculNoteMaree($spot, $tabNotes, $mareeDate) { // vérifie que $mareeDate->getDatePrev() soit dans $tabNotes if (NoteMaree::isInTabNotes($tabNotes, $mareeDate->getDatePrev()) && $spot->getMareeRestriction() != null) { $listePrevisionMaree = $mareeDate->getListPrevision(); if ($listePrevisionMaree != null && count($listePrevisionMaree) >= 2) { // *** Calcul de la formule de la courbe: y = a sin(wt + Phi) + b *** // t=time en seconde, y=hauteur en metre, w: phase 2 pi / T , T: fréquence // résolution de l'équation // *** calcul le temps ou la marée est OK, warn et OK *** $timeMareeOK = 0; $timeMareeWarn = 0; $timeMareeKO = 0; $timeMareeOKTab = array(); $timeMareeWarnTab = array(); $timeMareeKOTab = array(); // pour chaque $restriction de $spot->getMareeRestriction() foreach ($spot->getMareeRestriction() as $mareeRestriction) { // calcul l'heure (minute) d'intersection pour calculer le temps dans l'etat list($timeInState, $timeTab) = MareeTools::calculTimeInState($mareeRestriction, $listePrevisionMaree); $mareeState = $mareeRestriction->getState(); switch ($mareeState) { case "OK": $timeMareeOK += $timeInState; $timeMareeOKTab = $timeTab; break; case "KO": $timeMareeKO += $timeInState; $timeMareeKOTab = $timeTab; break; case "warn": $timeMareeWarn += $timeInState; $timeMareeWarnTab = $timeTab; break; } } // calcul de la note vis à vis de du temps de navigation / temps etat ok, warn et KO $tabNotes[$mareeDate->getDatePrev()->format('Y-m-d')]["marée"] = NoteMaree::getNote($timeMareeOK, $timeMareeWarn, $timeMareeKO); $tabNotes[$mareeDate->getDatePrev()->format('Y-m-d')]["maréeTimeOK"] = $timeMareeOKTab; $tabNotes[$mareeDate->getDatePrev()->format('Y-m-d')]["maréeTimeWarn"] = $timeMareeWarnTab; $tabNotes[$mareeDate->getDatePrev()->format('Y-m-d')]["maréeTimeKO"] = $timeMareeKOTab; } } return $tabNotes; }
/** * On est calé sur $tInterMin en pente montante * On calcul l'ensemble du temps de la restriction avec restriction Max et restriction Min */ static function calculTimeRestrictionFromTInterMin($tInterMin, $periode, $timeToAdd, $timeInter2tInterMax, $tEnd, $timeRestriction, $timeTab) { $t = $tInterMin; if ($t < $tEnd) { if ($t + $timeToAdd <= $tEnd) { // cas normal on ajoute $timeToAdd $timeRestriction += $timeToAdd; $timeTab[] = array("begin" => date("H:i:s", $t), "end" => date("H:i:s", $t + $timeToAdd)); $t = $t + $timeToAdd; // $t = $tInterMax // On va jusqu'à l'autre $tInterMax (pente descendante) $t = $t + $timeInter2tInterMax; if ($t + $timeToAdd <= $tEnd) { // On peut ajouter $timeToAdd $timeRestriction += $timeToAdd; $timeTab[] = array("begin" => date("H:i:s", $t), "end" => date("H:i:s", $t + $timeToAdd)); $t = $t + $timeToAdd; //$t est sur $tInterMin pente descendente $t = $tInterMin + $periode; // $t est sur $tinterMin pente montante return MareeTools::calculTimeRestrictionFromTInterMin($t, $periode, $timeToAdd, $timeInter2tInterMax, $tEnd, $timeRestriction, $timeTab); } else { //$t+$timeToAdd>$tEnd if ($t < $tEnd) { // $tEnd est entre $tInterMax et $tInterMin, cad entre $t et $t+$timeToAdd (pente descendante) $timeRestriction += $tEnd - $t; $timeTab[] = array("begin" => date("H:i:s", $t), "end" => date("H:i:s", $tEnd)); } return array($timeRestriction, $timeTab); } } else { // $tEnd est entre $tInterMin et $tInterMax, cad entre $t et $t+$timeToAdd (pente montante) $timeRestriction += $tEnd - $t; $timeTab[] = array("begin" => date("H:i:s", $t), "end" => date("H:i:s", $tEnd)); return array($timeRestriction, $timeTab); } } else { return array($timeRestriction, $timeTab); } }