L'évolution des précipitations mensuelles au fils des années

Mettez un lien vers vos créations.

Modérateurs : jturlier, Météo Villarzel

Avatar du membre
PascalWMR
Messages : 323
Enregistré le : 16 févr. 2014, 09:28
Localisation : CONFLANS EN JARNISY (F54800)
Contact :

L'évolution des précipitations mensuelles au fils des années

Message par PascalWMR » 28 févr. 2016, 18:03

Salut les amis

Tous comme pour l'évolution de la température moyenne mensuelle au fils des années, dont j'ai fait un tuto :geek: ,

voici l'évolution des précipitations mensuelles au fils des années. :D

Une légère adaptation du code des températures est nécessaire. Rien de bien compliqué ;) .

A+
Pascal
Modifié en dernier par PascalWMR le 10 mars 2019, 10:49, modifié 1 fois.
Station VP2Plus, Windows 10 64 bits,WeatherLink 6.0.5, VP2SQL, Graphiques Dynamiques à partir d'une BDD MySQL
Météo Conflans-en-Jarnisy
Image

Avatar du membre
Météo Villarzel
Administrateur du site
Messages : 524
Enregistré le : 06 févr. 2014, 09:48
Contact :

Re: L'évolution des précipitations mensuelles au fils des an

Message par Météo Villarzel » 03 mars 2016, 23:07

Une légère adaptation du code des températures est nécessaire. Rien de bien compliqué ;) .
Salut Pascal,
rien de compliqué, mais j'ai quand même mis 4 soirs pour comprendre :oops:

En fait je ne sais pas si j'ai fait tout juste, mais comme la température était prise sur une moyenne et la pluviométrie sur un total, pour les normales mensuelles j'ai créé un variable qui calcule le nombre d'années présentes dans le graphique en faisant
$Nans = $AnneeFin-$AnneeInit;

ensuite j'ai divisé la somme par $Nans

Bon il me semble que le résultat est correct

http://www.boock.ch/meteo/graphiques_ph ... eparan.php

A un moment j'ai cru devoir appeler à l'aide, mais je voulais quand même essayer d'arriver tous seul comme un grand :lol:

Encore merci pour cet excellent tuto

A+
Station Vantage Pro2+ avec station agricole - Weatherlink - GraphWeather 3.0.15b - Cumulus 1.9.4 - Windows 7/64
Graphique dynamique à partir d'une bd MySql - VP2SQL

Image

Avatar du membre
PascalWMR
Messages : 323
Enregistré le : 16 févr. 2014, 09:28
Localisation : CONFLANS EN JARNISY (F54800)
Contact :

Re: L'évolution des précipitations mensuelles au fils des an

Message par PascalWMR » 04 mars 2016, 19:12

Salut Pierre-André

Tu as raison c'est comme cela qu'il fallait raisonner :mrgreen: . Cependant il y a un petit bémol :( :( .
J'avais aussi raisonné comme cela au début. Mais avec ce raisonnement, le problème est que le calcul est juste pour les mois déjà écoulés de l'année :P . Mais pour les mois non encore écoulés, le calcul est faux :cry: , car pour obtenir la moyenne tu divise par le nombre d'années présentes dans la BDD. Or pour les mois non encore écoulés, le diviseur doit être le nombre d'années présentent moins une.

Pour cela, il faut introduire deux nouvelles variables que j'ai appelé $MoisEnCours et $MoisExtrait[$i]. Dans la requête SQl, j’extrais le mois de recdateTZ, et dans la boucle while, je dis que si le mois extrait est supérieur au mois en cours, alors le diviseur est le nombre d'années -1, sinon le diviseur est égal au nombre d'années.
Ceci c'est pour le code du dernier graphique, celui des courbes de comparaison des normales.

Dans la partie Initialisation des années de début et de fin, j'initialise également le mois en cours en utilisant la fonction PHP date("m") comme ceci
$MoisEnCours=date("m");

Pour la partie extraction des données, ça donne ça:

Code : Tout sélectionner

	$sql1="SELECT SUBSTR(recdateTZ,5,2) AS Mois, SUM(Rain_jour) AS NormPluieMoy FROM MiniMaxidata GROUP BY Mois";
	$query = mysqli_query($conn,$sql1);                   
	$i=0;
	while ($list = mysqli_fetch_assoc($query)) {
		$MoisExtrait[$i]=$list['Mois'];
		if ($MoisExtrait[$i] > $MoisEnCours){
			$Diviseur= $NbAnnee-1;}
		else {$Diviseur= $NbAnnee;}
		//echo $MoisEnCours . ' --> '. $MoisExtrait[$i]. ' : ' .$Diviseur .'<br>';
		$NormStation[$i]=$list['NormPluieMoy']/$Diviseur;
		$NormMF[$i]=$NormaleMF[$i+1];
		$EcartNorm[$i]=$NormStation[$i]-$NormMF[$i];
		$i++;
	}
Pour les graphiques mensuels, juste après la partie détermination du nom des séries à encoder, il faut rajouter ceci

Code : Tout sélectionner

		// Détermination du diviseur (nb années de calcul)
		if ($mois > $MoisEnCours){
			$Diviseur = $NbAnnee-1;}
			else {$Diviseur= $NbAnnee;}
Ici on ne compare plus $MoisExtrait[$i] mais $mois.

Bon tout ça c'est bien joli mais cette solution ne fonctionne que si l'enregistrement des données a commencé le 1er janvier de la première année :( :( :( .
Je me suis aperçu de ce problème car j'ai fait les même graphiques pour les heures d'ensoleillement. Or mes enregistrements commencent un 1er octobre.

Il faut donc indiquer à tout le schmilblic calculateur que pour les mois qui précèdent le premier enregistrement il y a donc une année de mois à diviser
Il faut donc rajouter une condition if :idea: :idea: .
Et ça donne donc ça pour le premier code

Code : Tout sélectionner

	$sql1="SELECT SUBSTR(recdateTZ,5,2) AS Mois, SUM(h_soleil_jour) AS NormSoleil FROM sundata GROUP BY Mois";
	$query = mysqli_query($conn,$sql1);                   
	$i=0;
	while ($list = mysqli_fetch_assoc($query)) {
		$MoisExtrait[$i]=$list['Mois'];
		if ($MoisExtrait[$i] < 10){
			$NbAnnee = $AnneeFin-$AnneeInit-1;}
		else {$NbAnnee= $AnneeFin-$AnneeInit;}
		if ($MoisExtrait[$i] > $MoisEnCours) {
				$Diviseur= $NbAnnee-1;}
		else {$Diviseur= $NbAnnee;}
		//echo $MoisEnCours . ' --> '. $MoisExtrait[$i]. ' : ' .$Diviseur .'<br>';
		$NormStation[$i]=$list['NormSoleil']/$Diviseur;
		$NormMF[$i]=$NormaleMF[$i+1];
		$EcartNorm[$i]=$NormStation[$i]-$NormMF[$i];
		$i++;
	}
Le nombre 10 auquel on compare $MoisExtrait[$i] est tout simplement le mois ou commence l'enregistrement des données.

Et ça pour le deuxième

Code : Tout sélectionner

		// Détermination du diviseur (nb années de calcul)
		if ($mois < 10){
			$NbAnnee = $AnneeFin-$AnneeInit-1;}
		else {$NbAnnee= $AnneeFin-$AnneeInit;}
		if ($mois > $MoisEnCours) {
				$Diviseur= $NbAnnee-1;}
		else {$Diviseur= $NbAnnee;}
Bon j'ai pas encore mis les graphiques d'ensoleillement en ligne car comme je suis un peu pointilleux, je n'aime pas l'affichage des heures avec des décimales. J'ai une fonction qui convertis les heures décimales en heures et minutes.
Mais je bloque sur un problème. L'affichage dans le tooltip ne veux pas marcher.
Ca fonctionne avec un tooltip défini par une fonction JS mais pas avec le tooltip HTML. Mai je vais trouver. C'est quand même pas de code qui va me faire c....

A+
Pascal
Modifié en dernier par PascalWMR le 05 mars 2016, 08:15, modifié 2 fois.
Station VP2Plus, Windows 10 64 bits,WeatherLink 6.0.5, VP2SQL, Graphiques Dynamiques à partir d'une BDD MySQL
Météo Conflans-en-Jarnisy
Image

Avatar du membre
Météo Villarzel
Administrateur du site
Messages : 524
Enregistré le : 06 févr. 2014, 09:48
Contact :

Re: L'évolution des précipitations mensuelles au fils des an

Message par Météo Villarzel » 04 mars 2016, 21:51

Et moi qui était fier d'avoir trouvé ça :cry:
J'ai encore du chemin à faire.

A+
Station Vantage Pro2+ avec station agricole - Weatherlink - GraphWeather 3.0.15b - Cumulus 1.9.4 - Windows 7/64
Graphique dynamique à partir d'une bd MySql - VP2SQL

Image

Avatar du membre
PascalWMR
Messages : 323
Enregistré le : 16 févr. 2014, 09:28
Localisation : CONFLANS EN JARNISY (F54800)
Contact :

Re: L'évolution des précipitations mensuelles au fils des an

Message par PascalWMR » 05 mars 2016, 14:32

Bonjour tous le monde
PascalWMR a écrit :
Bon j'ai pas encore mis les graphiques d'ensoleillement en ligne car comme je suis un peu pointilleux, je n'aime pas l'affichage des heures avec des décimales. J'ai une fonction qui convertis les heures décimales en heures et minutes.
Mais je bloque sur un problème. L'affichage dans le tooltip ne veux pas marcher.
Ca fonctionne avec un tooltip défini par une fonction JS mais pas avec le tooltip HTML. Mai je vais trouver. C'est quand même pas de code qui va me faire c....
Je te le disait Pierre-André. Çà allait pas mes les ... bien longtemps
J'ai créé un fonction supplémentaire dans le fichier statevolutiontempmois.js qui convertis les heures décimale en heures et minutes. La voici

Code : Tout sélectionner

function customtimetooltip(pointy) {
			var heure = pointy - pointy%1;
			var minute = Math.floor(Math.abs(pointy%1)*60);
			if (minute < 10) {
				minute = '0'+minute};
			pointy = heure + ' h ' + minute + ' mn '
	return pointy;	
}
J'ai également créé son équivalent en PHP car sur mon graphique de comparaison des normales, l'écart entre les totaux mensuels et le total annuel étant trop important, ça écrasait les courbes mensuelles.
La dernière colonne Année qui apparaissait sur le graphique des températures n'apparait plus sur les graphiques pluie et soleil. Cependant, ces données apparaissent dans la div d'info sous le graphique.

Voici le résultat pour les heures d'ensoleillement :P
https://www.monsite-meteo.eu/Page/stats ... lparan.php

En fin de compte, ça n'est pas documenter dans la doc Highcharts, a moins que je ne l'ai pas trouvé, mais on peut très bien insérer du HTML dans la fonction formatter: et en particulier les balises <table> <tr> et <td>
Par contre, je n'ai pas réussi à insérer l'appel d'une fonction javascript dans le code HTML du tooltip
Pour cela, dans le code du tooltip, à la place de headerFormat, pointFormat et footerFormat il suffit de mettre ceci

Code : Tout sélectionner

			formatter: function() {
				var s = '<span style="color:#FF0000; text-shadow:#900; font-size:14px"><b>' + this.x + '</b></span><table width="270px" style="border-top:ridge; font-size:12px">';
				$.each(this.points, function(i, point) {
					s = s + '<tr><td style="color:#0099FF">' + point.series.name + '</td><td style="text-align: center"><b>:</td>'
					s = s + '<td style="text-align: right"><b>' + customtimetooltip(point.y)+ '</b></td></tr>'
					});
					s = s +'</table>'
		   
				return s;
				},
Dans le code php, il faut supprimer les lignes qui inséraient une série de données de valeur NULL et faire suivre par ça

Code : Tout sélectionner

	// Requête pour récupérer les heures d'ensoleillement moyenne totale de la BDD
	$sql2="SELECT SUM(h_soleil_jour) AS SoleilTotal FROM sundata";
	$query = mysqli_query($conn,$sql2);                   
	$list = mysqli_fetch_assoc($query);
	$NST=$list['SoleilTotal']/($NbMois/12);
	$heure = (int)$NST;  
	$minute = round(($NST - $heure) * 60,0); 
	$NormStationTotal= $heure.' h '.$minute.' mn';
	
	$NMFT=$NormaleMF[13];
	$heure = (int)$NMFT;  
	$minute = round(($NMFT - $heure) * 60,0); 
	$NormMFTotal=$heure.' h '.$minute.' mn';
	
	$ENT=$NST-$NMFT;
	$heure = (int)$ENT;  
	$minute = round(($ENT - $heure) * 60,0);
	if ($minute < 0) {$minute=$minute*-1;}
	$EcartNormTotal=$heure.' h '.$minute.' mn';
Pour afficher le résultat dans la div, il suffit simplement de faire appel à un <?php echo $NormMFTotal ?>, <?php echo $NormStationTotal ?> et <?php echo $EcartNormTotal ?>

A+
Pascal
Modifié en dernier par PascalWMR le 10 mars 2019, 10:50, modifié 1 fois.
Station VP2Plus, Windows 10 64 bits,WeatherLink 6.0.5, VP2SQL, Graphiques Dynamiques à partir d'une BDD MySQL
Météo Conflans-en-Jarnisy
Image

Javier
Messages : 263
Enregistré le : 15 févr. 2014, 09:23
Localisation : San Sebastián, España
Contact :

Re: L'évolution des précipitations mensuelles au fils des an

Message par Javier » 18 mars 2016, 20:58

J'ai essayé d'obtenir le graphique "statpluiemensuelleparan.php" , mais je n'ai pas:

http://kocher.es/meteotemplate/plugins/ ... eparan.php

J'ai décidé de demander de l'aide :oops: :oops: :oops:
Davis Vantage Pro2 +, Windows 10, Windows 7 (64), Graphweather 3.0.15, Weatherlink 6.0.3, template Pierre-André, template Jachym
Image

Avatar du membre
PascalWMR
Messages : 323
Enregistré le : 16 févr. 2014, 09:28
Localisation : CONFLANS EN JARNISY (F54800)
Contact :

Re: L'évolution des précipitations mensuelles au fils des an

Message par PascalWMR » 19 mars 2016, 10:40

Bonjour Javier
Javier a écrit :J'ai essayé d'obtenir le graphique "statpluiemensuelleparan.php" , mais je n'ai pas:

http://kocher.es/meteotemplate/plugins/ ... eparan.php

J'ai décidé de demander de l'aide :oops: :oops: :oops:
Ou est-ce que tu bloque.

Regarde bien le topic 1560

Pour les précipitations, il ne s'agit plus de faire des moyennes. Il faut faire des totaux et pour la moyenne du mois il faut diviser le total par le nombre d'années.
J'ai mis des morceaux de code qui faut mettre à la place du code des températures.
Il y a également des variables à ajouter $MoisEnCours ,$MoisExtrait[$i]. Il faut aussi créer et calculer une variable $Diviseur
De plus Javier comme tes enregistrements ne commencent pas le 1er janvier 2012 , il faut appliquer la solution que j'ai trouvé pour les graphiques solaire.

Bon courage
Pascal
Station VP2Plus, Windows 10 64 bits,WeatherLink 6.0.5, VP2SQL, Graphiques Dynamiques à partir d'une BDD MySQL
Météo Conflans-en-Jarnisy
Image

Javier
Messages : 263
Enregistré le : 15 févr. 2014, 09:23
Localisation : San Sebastián, España
Contact :

Re: L'évolution des précipitations mensuelles au fils des an

Message par Javier » 19 mars 2016, 10:54

PascalWMR a écrit :Bonjour Javier
Javier a écrit :J'ai essayé d'obtenir le graphique "statpluiemensuelleparan.php" , mais je n'ai pas:

http://kocher.es/meteotemplate/plugins/ ... eparan.php

J'ai décidé de demander de l'aide :oops: :oops: :oops:
Ou est-ce que tu bloque.

Regarde bien le topic 1560

Pour les précipitations, il ne s'agit plus de faire des moyennes. Il faut faire des totaux et pour la moyenne du mois il faut diviser le total par le nombre d'années.
J'ai mis des morceaux de code qui faut mettre à la place du code des températures.
Il y a également des variables à ajouter $MoisEnCours ,$MoisExtrait[$i]. Il faut aussi créer et calculer une variable $Diviseur
De plus Javier comme tes enregistrements ne commencent pas le 1er janvier 2012 , il faut appliquer la solution que j'ai trouvé pour les graphiques solaire.

Bon courage

Pascal
J'ai essayé d'appliquer ces critères, mais, pour moi, est facile, beaucoup très facile de rater. :roll: .

Voici mon code PHP:

Code : Tout sélectionner

<?php
	
// appel du script de connexion
require("../../../graficos-highcharts/mysqli_connect2.php");   
	
// Détermination des normales Fuenterrabia (Aeropuerto) 1981-2010
$NormaleMF[1]=141;
$NormaleMF[2]=110;
$NormaleMF[3]=113;
$NormaleMF[4]=138;
$NormaleMF[5]=120;
$NormaleMF[6]=90;
$NormaleMF[7]=86;
$NormaleMF[8]=117;
$NormaleMF[9]=111;
$NormaleMF[10]=159;
$NormaleMF[11]=169;
$NormaleMF[12]=151;
$NormaleMF[13]=1507;

// Calcul de la variable indiquant le nombre de mois de collecte des données
	$sql="SELECT SUBSTR(recdateTZ,1,6) AS AnMois FROM MiniMaxidata GROUP BY AnMois";
	$query = mysqli_query($conn,$sql);                   
	$NbMois = mysqli_num_rows($query);

// Initialisation des années de début et de fin
	$sql="SELECT MIN(SUBSTR(recdateTZ,1,4)) AS AnneeInit FROM MiniMaxidata";
	$query = mysqli_query($conn,$sql);                   
	$list = mysqli_fetch_assoc($query);
	$AnneeInit=$list['AnneeInit']*1;
	$AnneeFin = date("Y")+1;
	$MoisEnCours=date("m");
// ----------------------------- Début code graphique Comparaison des normales --------------------------------	
// code pour le tab d'évolution des normales (avec récupération de la Normale Station)
	//Requête pour récupérer la pluie totale moyenne de chaque mois sur la totalité de la BDD
   $sql1="SELECT SUBSTR(recdateTZ,5,2) AS Mois, SUM(Rain_jour) AS NormtPluie' FROM sundata GROUP BY Mois";
   $query = mysqli_query($conn,$sql1);                   
   $i=0;
   while ($list = mysqli_fetch_assoc($query)) {
      $MoisExtrait[$i]=$list['Mois'];
      if ($MoisExtrait[$i] < 3){
         $NbAnnee = $AnneeFin-$AnneeInit-1;}
      else {$NbAnnee= $AnneeFin-$AnneeInit;}
      if ($MoisExtrait[$i] > $MoisEnCours) {
            $Diviseur= $NbAnnee-1;}
      else {$Diviseur= $NbAnnee;}
      //echo $MoisEnCours . ' --> '. $MoisExtrait[$i]. ' : ' .$Diviseur .'<br>';
      $NormStation[$i]=$list['NormtPluie']/$Diviseur;
      $NormMF[$i]=$NormaleMF[$i+1];
      $EcartNorm[$i]=$NormStation[$i]-$NormMF[$i];
      $i++;
   }
	// On force une série de variables à avoir la valeur NULL pour sauter une colone dans le graphique
	$NormStation[$i]=NULL;
	$NormMF[$i]=NULL;
	$EcartNorm[$i]=NULL;
	$i=$i+1;
  
	// Requête pour récupérer la pluie moyenne totale de la BDD
  
	$sql2="SELECT SUM(Rain_jour) AS PluieMoyTotal FROM MiniMaxidata";
	$query = mysqli_query($conn,$sql2);                   
	$list = mysqli_fetch_assoc($query);
	$NormStation[$i]=$list['PluieMoyTotal']*1;
	$NormMF[$i]=$NormaleMF[$i];
	$EcartNorm[$i]=$NormStation[$i]-$NormMF[$i];
      // Détermination du diviseur (nb années de calcul)
      if ($mois < 3){
         $NbAnnee = $AnneeFin-$AnneeInit-1;}
      else {$NbAnnee= $AnneeFin-$AnneeInit;}
      if ($mois > $MoisEnCours) {
            $Diviseur= $NbAnnee-1;}
      else {$Diviseur= $NbAnnee;}

// ----------------------------- Fin code graphique Comparaison des normales --------------------------------	

// ----------------------------- Début code graphique de chaque mois --------------------------------	
// Recupération des Pluviométrie moyennes de chaque année pour chaque mois
	for ($mois=1 ; $mois<13 ; $mois++){
		// Détermine le nom des séries encodées en json qui servira au paramètre data des graphiques Highcharts
		$SeriePluieExtMoy='PluieExtMoy'.$mois;
		$SerieNormaleMF='NormaleMF'.$mois;
		$SerieEcart='Ecart'.$mois;
		$SerieEcartANS='EcartANS'.$mois;
		$SerieAnnee='Annee'.$mois;
    
      // Détermination du diviseur (nb années de calcul)
      if ($mois < 3){
         $NbAnnee = $AnneeFin-$AnneeInit-1;}
      else {$NbAnnee= $AnneeFin-$AnneeInit;}
      if ($mois > $MoisEnCours) {
            $Diviseur= $NbAnnee-1;}
      else {$Diviseur= $NbAnnee;}    
    
		// Récupération des données proprement dites dans la BDD
		$i=0;                  
		for ($an=$AnneeInit ; $an < $AnneeFin; $an++){
		$sql3="SELECT SUBSTR(recdateTZ,5,2) AS Mois, SUBSTR(recdateTZ,1,4) AS Annee, SUM(Rain_jour) AS PluieMoy FROM MiniMaxidata WHERE SUBSTR(recdateTZ,5,2)=$mois AND SUBSTR(recdateTZ,1,4)=$an";
		$query = mysqli_query($conn,$sql3);
		$list = mysqli_fetch_assoc($query);
			$MoisSql3 = $list['Mois'];
			if (isset($MoisSql3)){
				$Annee[$i]=$an;
				$PluieMoy[$i]=$list['PluieMoy']*1;
				$NMF[$i]=$NormaleMF[$mois];
				$Ecart[$i]=$PluieMoy[$i]-$NMF[$i];
				$EcartANS[$i]=$PluieMoy[$i]- $NormStation[$mois-1];
				$i++;
			}
			else {
				$Annee[$i]= $an;
				$PluieMoy[$i]=NULL ;
				$NMF[$i]=NULL ;
				$Ecart[$i]=NULL ;
				$EcartANS[$i]=NULL;
				$i++;
			}
		}
		
		// Calcul de la Pluviométrie moyenne totale pour chaque mois (normale de la station) affichée dans la dernière colonne du graphique
		$sql4="SELECT SUBSTR(recdateTZ,5,2) AS Mois, SUM(Rain_jour) AS PluieMoyMois, ROUND(AVG(Rain_jour),1) as avgPluie FROM MiniMaxidata WHERE SUBSTR(recdateTZ,5,2)= $mois";
		$query = mysqli_query($conn,$sql4);                   
		$list = mysqli_fetch_assoc($query);
		$Annee[$i]='Normale<br>station';
		$PluieMoy[$i]=$list['PluieMoyMois']*1;
		$NMF[$i]=$NormaleMF[$mois];
		$Ecart[$i]=$PluieMoy[$i]-$NMF[$i];
		$EcartANS[$i]=NULL;
	?>
	<script type="text/javascript"> 
	eval(<?php echo  "'var $SeriePluieExtMoy =  ".json_encode($PluieMoy)."'" ?>);  
	eval(<?php echo  "'var $SerieAnnee =  ".json_encode($Annee)."'" ?>);  
	eval(<?php echo  "'var $SerieNormaleMF =  ".json_encode($NMF)."'" ?>);  
	eval(<?php echo  "'var $SerieEcart =  ".json_encode($Ecart)."'" ?>);  
	eval(<?php echo  "'var $SerieEcartANS =  ".json_encode($EcartANS)."'" ?>);  
	</script>
	<?php
	
	}
Modifié en dernier par Javier le 10 avr. 2017, 14:01, modifié 1 fois.
Davis Vantage Pro2 +, Windows 10, Windows 7 (64), Graphweather 3.0.15, Weatherlink 6.0.3, template Pierre-André, template Jachym
Image

Javier
Messages : 263
Enregistré le : 15 févr. 2014, 09:23
Localisation : San Sebastián, España
Contact :

Re: L'évolution des précipitations mensuelles au fils des an

Message par Javier » 19 mars 2016, 12:10

Merci à ton aide, il semble que les données "Station normale" sont maintenant correctes. :D

L'erreur que je faisais était de ne pas avoir divisé par $Diviseur:

Code : Tout sélectionner

	$NormStation[$i]=$list['PluieMoyTotal']/$Diviseur*1;
Le dernier problème est dans l'onglet de données "Comparaison de la normale" :?:

http://kocher.es/meteotemplate/plugins/ ... eparan.php
Davis Vantage Pro2 +, Windows 10, Windows 7 (64), Graphweather 3.0.15, Weatherlink 6.0.3, template Pierre-André, template Jachym
Image

Avatar du membre
PascalWMR
Messages : 323
Enregistré le : 16 févr. 2014, 09:28
Localisation : CONFLANS EN JARNISY (F54800)
Contact :

Re: L'évolution des précipitations mensuelles au fils des an

Message par PascalWMR » 19 mars 2016, 14:19

Salut Javier

Grosse erreur dans ton code
$sql1="SELECT SUBSTR(recdateTZ,5,2) AS Mois, SUM(Rain_jour) AS NormtPluie' FROM sundata GROUP BY Mois";

MiniMaxidata serait peut être mieux

Après $sql2, il n'est nul besoin de remettre le code de détermination du diviseur.
Pour calculer $NormStation[$i]
$list['PluiMoyTotal']/($NbMois/12); est quand même mieux que $list['PluieMoyTotal']*1;

idem pour $sql4
ROUND(AVG(Rain_jour),1) as avgPluie n'a rien à faire ici; Doit être supprimé

enfin
$PluieMoy[$i]=$list['PluieMoyMois']/$Diviseur;
c'est quand même mieux que
$PluieMoy[$i]=$list['PluieMoyMois']*1;

Bon allez voici le bon code

Code : Tout sélectionner

<?php
	
// appel du script de connexion
require("../Scripts/mysqli_connect.php");   
	
// Détermination des normales Météo France
$NormaleMF[1]=64.2;
$NormaleMF[2]=56.9;
$NormaleMF[3]=61.3;
$NormaleMF[4]=50.5;
$NormaleMF[5]=58.9;
$NormaleMF[6]=61.7;
$NormaleMF[7]=63.7;
$NormaleMF[8]=60.8;
$NormaleMF[9]=62.7;
$NormaleMF[10]=71.8;
$NormaleMF[11]=64;
$NormaleMF[12]=78.8;
$NormaleMF[13]=755.3;

// Calcul de la variable indiquant le nombre de mois de collecte des données
	$sql="SELECT SUBSTR(recdateTZ,1,6) AS AnMois FROM MiniMaxidata GROUP BY AnMois";
	$query = mysqli_query($conn,$sql);                   
	$NbMois = mysqli_num_rows($query);

// Initialisation des années de début et de fin
	$sql="SELECT MIN(SUBSTR(recdateTZ,1,4)) AS AnneeInit FROM MiniMaxidata";
	$query = mysqli_query($conn,$sql);                   
	$list = mysqli_fetch_assoc($query);
	$AnneeInit=$list['AnneeInit']*1;
	$AnneeFin = date("Y")+1;
	$NbAnnee= $AnneeFin-$AnneeInit;
	$MoisEnCours=date("m");

// ----------------------------- Début code graphique Comparaison des normales --------------------------------	
// code pour le tab d'évolution des normales (avec récupération de la Normale Station)
	//Requête pour récupérer les précipitations totale de chaque mois sur la totalité de la BDD
	$sql1="SELECT SUBSTR(recdateTZ,5,2) AS Mois, SUM(Rain_jour) AS NormPluieMoy FROM MiniMaxidata GROUP BY Mois";
	$query = mysqli_query($conn,$sql1);                   
	$i=0;
	while ($list = mysqli_fetch_assoc($query)) {
		$MoisExtrait[$i]=$list['Mois'];
		if ($MoisExtrait[$i] < 3){
			$NbAnnee = $AnneeFin-$AnneeInit-1;}
		else {$NbAnnee= $AnneeFin-$AnneeInit;}
		if ($MoisExtrait[$i] > $MoisEnCours) {
				$Diviseur= $NbAnnee-1;}
		else {$Diviseur= $NbAnnee;}

		//echo $MoisEnCours . ' --> '. $MoisExtrait[$i]. ' : ' .$Diviseur .'<br>';
		$NormStation[$i]=$list['NormPluieMoy']/$Diviseur;
		$NormMF[$i]=$NormaleMF[$i+1];
		$EcartNorm[$i]=$NormStation[$i]-$NormMF[$i];
		$i++;
	}
//	// On force une série de variables à avoir la valeur NULL pour sauter une colone dans le graphique
//	$NormStation[$i]=NULL;
//	$NormMF[$i]=NULL;
//	$EcartNorm[$i]=NULL;
	// Requête pour récupérer les précipitations moyenne totale de la BDD
	$sql2="SELECT SUM(Rain_jour) AS PluiMoyTotal FROM MiniMaxidata";
	$query = mysqli_query($conn,$sql2);                   
	$list = mysqli_fetch_assoc($query);
	$NormStationTotal=$list['PluiMoyTotal']/($NbMois/12);
	$NormMFTotal=$NormaleMF[13];
	$EcartNormTotal=$NormStationTotal-$NormMFTotal;
// ----------------------------- Fin code graphique Comparaison des normales --------------------------------	

// ----------------------------- Début code graphique de chaque mois --------------------------------	
// Recupération des températures moyennes de chaque année pour chaque mois
	for ($mois=1 ; $mois<13 ; $mois++){
		// Détermine le nom des séries encodées en json qui servira au paramètre data des graphiques Highcharts
		$SeriePluieMoy='PluieMoy'.$mois;
		$SerieNormaleMF='NormaleMF'.$mois;
		$SerieEcart='Ecart'.$mois;
		$SerieEcartANS='EcartANS'.$mois;
		$SerieAnnee='Annee'.$mois;
// Détermination du diviseur (nb années de calcul)
		if ($mois < 3){
			$NbAnnee = $AnneeFin-$AnneeInit-1;}
		else {$NbAnnee= $AnneeFin-$AnneeInit;}
		if ($mois > $MoisEnCours) {
				$Diviseur= $NbAnnee-1;}
		else {$Diviseur= $NbAnnee;}

		// Récupération des données proprement dites dans la BDD
		$i=0;                  
		for ($an=$AnneeInit ; $an < $AnneeFin; $an++){
		$sql3="SELECT SUBSTR(recdateTZ,5,2) AS Mois, SUBSTR(recdateTZ,1,4) AS Annee, SUM(Rain_jour) AS PluieMoy FROM MiniMaxidata WHERE SUBSTR(recdateTZ,5,2)=$mois AND SUBSTR(recdateTZ,1,4)=$an";
		$query = mysqli_query($conn,$sql3);
		$list = mysqli_fetch_assoc($query);
			$MoisSql3 = $list['Mois'];
			if (isset($MoisSql3)){
				$Annee[$i]=$an;
				$PluieMoy[$i]=$list['PluieMoy']*1;
				$NMF[$i]=$NormaleMF[$mois];
				$Ecart[$i]=$PluieMoy[$i]-$NMF[$i];
				$EcartANS[$i]=$PluieMoy[$i]- $NormStation[$mois-1];
				$i++;
			}
			else {
				$Annee[$i]= $an;
				$PluieMoy[$i]=NULL ;
				$NMF[$i]=NULL ;
				$Ecart[$i]=NULL ;
				$EcartANS[$i]=NULL;
				$i++;
			}
		}
		
		// Calcul de la température moyenne totale pour chaque mois (normale de la station) affichée dans la dernière colonne du graphique
		$sql4="SELECT SUBSTR(recdateTZ,5,2) AS Mois, SUM(Rain_jour) AS PluieMoyMois FROM MiniMaxidata WHERE SUBSTR(recdateTZ,5,2)= $mois";
		$query = mysqli_query($conn,$sql4);                   
		$list = mysqli_fetch_assoc($query);
		$Annee[$i]='Normale<br>station';
		$PluieMoy[$i]=$list['PluieMoyMois']/$Diviseur;
		$NMF[$i]=$NormaleMF[$mois];
		$Ecart[$i]=$PluieMoy[$i]-$NMF[$i];
		$EcartANS[$i]=NULL;
	?>
	<script type="text/javascript"> 
	eval(<?php echo  "'var $SeriePluieMoy =  ".json_encode($PluieMoy)."'" ?>);  
	eval(<?php echo  "'var $SerieAnnee =  ".json_encode($Annee)."'" ?>);  
	eval(<?php echo  "'var $SerieNormaleMF =  ".json_encode($NMF)."'" ?>);  
	eval(<?php echo  "'var $SerieEcart =  ".json_encode($Ecart)."'" ?>);  
	eval(<?php echo  "'var $SerieEcartANS =  ".json_encode($EcartANS)."'" ?>);  
	</script>
	<?php
Attention, j'ai désactivé le code qui insère une colonne nulle car dans le graphique de comparaison des normales, la normale annuelle n'est plus affichée sur le graphique mais dans les div d'explication sous les graphiques.
J'ai fait cela car la valeur de la normale annuelle étant beaucoup plus importante que les mensuelles, cela aplatissait la courbe mensuelle.
Voici donc ci-dessous le code html pour afficher cela dans les div d'info sous les graphiques.

Code : Tout sélectionner

<div id="explic1" class="legende_div_avec_normales" style="width:1060px">La valeur <span class="extreme_mini">Précipitations</span> de la colonne de droite intitulée <span class="extreme_maxi">Normale station</span> représente la &#8220;Normale mensuelle&#8221; pour la station, calculée à partir des données recueillies par la station depuis <?php echo $NbMois ?> mois.
<br><br>
Les normales Météo France utilisées dans ce graphique, proviennent de la station Météo France la plus proche de Conflans en Jarnisy,<br>
soit la station de Metz Marly Frescaty.</div>
<div id="explic2" class="legende_div_avec_normales" style="width:1060px; display:none">
La valeur de la <span class="extreme_maxi">Normale Station</span>, est calculée à partir des données recueillies par la station depuis <?php echo $NbMois ?> mois.<br><br>
La normale annuelle Météo France est de <span class="texte_dans_tableau_vert"><?php echo number_format($NormMFTotal,2) ?> mm</span>; La normale de la station est de <span class="texte_dans_tableau_rouge"><?php echo number_format($NormStationTotal,2) ?> mm</span>. L'écart entre les deux est de <span class="sous_titre_4"><?php echo number_format($EcartNormTotal,2) ?> mm</span>.<br><br>
Les normales Météo France utilisées dans ce graphique, proviennent de la station Météo France la plus proche de Conflans en Jarnisy,<br>
soit la station de Metz Marly Frescaty.</div>
Voila
A+
Pascal
Station VP2Plus, Windows 10 64 bits,WeatherLink 6.0.5, VP2SQL, Graphiques Dynamiques à partir d'une BDD MySQL
Météo Conflans-en-Jarnisy
Image

Répondre