Page 1 sur 5

Tuto Pluviométrie Mensuelle Comparée aux Normales 1981-2010

Posté : 24 août 2014, 14:08
par PascalWMR
Tuto Pluviométrie Mensuelle Comparée aux Normales 1981-2010

Le but de ce tuto, est d'afficher un graphique Highstock qui compare la pluviométrie mensuelle aux Normales 1981-2010.
A la fin de ce tuto, vous devriez obtenir un graphique ressemblant à celui-ci.
http://www.monsite-meteo.eu/Page/graphd ... rmales.php
Ce graphique est inspiré de celui que Pierre-André avait fait il y a un moment. Cependant, il présentait quelques inconvénients.
Pour afficher les "Normales, il fallait les saisir manuellement tous les ans. C'était fastidieux et on loupait le réveillon de nouvel an pour mettre à jour les données en temps réel :roll: .
Le code PHP de la page s’allongeait tous les ans et la courbe des Normales était affichée jusqu'à la fin de l'année sans qu'il y ait de données pluie correspondantes.
Avec la méthode employée pour extraire les données de la BDD on utilisait la fonction DataGrouping de Highstock pour les afficher.
Le problème avec cette méthode, est que le nombre de données "Rain_jour" (des centaines voire plus), extraites de la BDD et le nombre de données "Normales" (12 par an) n'est pas le même.
Ceci a pour conséquence, si l'on fait un zoom sur le graphique, d'avoir des courbes qui ne veulent plus dire grand-chose car elles ne sont pas synchronisées.
J'ai donc trouvé la solution que je vous donne ici :idea: .

Informations préalables

Je reprends ici la citation de Helmain dans son tuto "Rose des Vents";
Les requêtes indiquées dans ce tuto sont faites sur une base MySql créée avec le logiciel Data2Sql de Jean TURLIER.
Si votre table ou vos rubriques ont été créés par un autre soft, il convient de changer les noms de la table et de la rubrique indiqués dans ce tutoriel.
Et je lui ajoute;
Suivant les conseils de Helmain, le code PHP de ce tuto utilise l'extension mysqli. Donc si vous utilisez toujours mysql, vous devrez adapter votre code. Le mieux, je pense, et de passer à mysqli.
Pour ce faire, vous pouvez suivre les conseil de Helmain dans ce post http://www.boock.ch/meteo/forum/viewtopic.php?f=6&t=48.

Vous devez également récupérer les "Normales" valables pour votre situation géographique .
A moins que vous n'habitiez dans ma région, n'utilisez pas celles de ce tuto. Ces "Normales" sont celles de la station Météo France de Metz Marly Frescaty, la station Météo France de référence la plus proche de ma station.

Passons maintenant au code PHP .

En premier lieu, il faut se connecter à la base de données en utilisant un script de connexion (rechercher dans ce forum comment faire, c'est déjà expliqué à plusieurs reprises).
Pour ce faire, on utilise le code suivant;

Code : Tout sélectionner

<?php
// Appel du script de connexion
require("Votre Chemin/mysqli_connect.php");                     
N'oubliez pas de changer le chemin du répertoire ou se trouve votre fichier .php de connexion.

Ensuite, on récupère les données dans la BDD.
Ici on n’a pas besoin de $Start ni de $Stop car on récupère la totalité des données.
Pour ce faire, on utilise la requête SQL suivante.

Code : Tout sélectionner

// Récupération des données en faisant la somme de Rain_jour en créant une variable AnneeMois et en groupant les données sur cette variable AnneeMois.
$sql = "SELECT tstamp, SUM(Rain_jour), substr(recdateTZ,1,6) AS AnneeMois FROM `MiniMaxidata` GROUP BY AnneeMois";  
$query = mysqli_query($conn,$sql);                   
Explication de la requête:
  1. On récupère SELECT
  2. les données
    1. tstamp
    2. Rain_jour en en faisant la somme SUM
    3. la variable AnneeMois que l'on créé à partir de la donnée recdateTZ dont on extrait l'année et le mois substr(recdateTZ,1,6) AS AnneeMois
  3. depuis FROM la table MiniMaxidata
  4. et que l'on groupe GROUP BY par la variable précédemment créée AnneeMois
Enfin on envoie la requête au serveur: $query = mysqli_query($conn,$sql);

Voilà, c'est tout simple. Essayez cette requête directement sur votre BDD avec phpMyAdmin et vous verrez que vous aurez un tableau ou tous les cumuls ont déjà été calculé ;).

Ensuite, nous allons faire une boucle While pour mettre nos données sous forme de tableau et dans laquelle nous allons ajouter une boucle if elseif pour y insérer les données Normales, puis nous allons calculer la variable Ecart entre les précipitations réelles et les Normales.

Code : Tout sélectionner

$i=0;
while ($list = mysqli_fetch_assoc($query)) {      
if (date("I",time())==0) { 
	$time[$i]=($list['tstamp']+3600)*1000;
	} 
else {
	$time[$i]=($list['tstamp']+7200)*1000;
  } 

$Rain_jour[$i]=$list['SUM(Rain_jour)']*1;

	if (date("m",$time[$i]/1000)==1) {$NormaleMensuelle[$i]=64.2;}
	elseif (date("m",$time[$i]/1000)==2) {$NormaleMensuelle[$i]=56.9;}
	elseif (date("m",$time[$i]/1000)==3) {$NormaleMensuelle[$i]=61.3;}
	elseif (date("m",$time[$i]/1000)==4) {$NormaleMensuelle[$i]=50.5;}
	elseif (date("m",$time[$i]/1000)==5) {$NormaleMensuelle[$i]=58.9;}
	elseif (date("m",$time[$i]/1000)==6) {$NormaleMensuelle[$i]=61.7;}
	elseif (date("m",$time[$i]/1000)==7) {$NormaleMensuelle[$i]=63.7;}
	elseif (date("m",$time[$i]/1000)==8) {$NormaleMensuelle[$i]=60.8;}
	elseif (date("m",$time[$i]/1000)==9) {$NormaleMensuelle[$i]=62.7;}
	elseif (date("m",$time[$i]/1000)==10) {$NormaleMensuelle[$i]=71.8;}
	elseif (date("m",$time[$i]/1000)==11) {$NormaleMensuelle[$i]=64.0;}
	elseif (date("m",$time[$i]/1000)==12) {$NormaleMensuelle[$i]=78.8;}

$Ecart[$i]=$Rain_jour[$i]-$NormaleMensuelle[$i];

$i++;
} 	
?>
Explications:
  1. On initialise la variable $i
  2. On commence la boucle while while ($list = mysqli_fetch_assoc($query)) {
  3. On vérifie si le tstamp est à l'heure d'été ou pas (rappelez-vous que le tstamp est en temps Unix)
    if (date("I",time())==0) {
    $time[$i]=($list['tstamp']+3600)*1000;
    }
    , si oui, on lui ajoute 1 heure à la variable $time[$i]
    else {
    $time[$i]=($list['tstamp']+7200)*1000;
    }
    , si non, on y ajoute 2 heures à la variable $time[$i]

    Attention, le calcul ci-dessus n'est valable que pour ceux qui sont dans le même fuseau horaire que moi soit GMT+1 en été et GMT+2 en hiver.
  4. On définit la variable Rain_jour[$i] en disant qu'elle est égale à la somme de Rain_jour[$i] de la requête SQL $Rain_jour[$i]=$list['SUM(Rain_jour)']*1; et on la multiplie par 1 pour obtenir une variable numérique exploitable
  5. On fait une boucle de test if elseif pour définir la variable $NormaleMensuelle[$i]
    if (date("m",$time[$i]/1000)==1) {$NormaleMensuelle[$i]=64.2;}
    En français dans le texte; Si le mois "m" de la variable $times[$i] est comme "==" 1 (janvier), alors la variable $NormaleMensuelle[$i] est égale "=" à la valeur de la normale mensuelle de janvier valable pour votre station (soit 64.2mm pour ma station)
    sinon elseif Si le mois "m" de la variable $times[$i] est comme "==" 2 (février), alors la variable $NormaleMensuelle[$i] est égale "=" à la valeur de la normale mensuelle de février valable pour votre station (soit 56.9mm pour ma station)
    Etc., etc. jusqu'a 12.
    Attention au signe double "==". C'est un opérateur de comparaison dans une chaîne alors que le signe simple "=" défini une valeur numérique .
    Voir ici pour mieux comprendre http://php.net//manual/fr/language.oper ... arison.php

    ATTENTION ici, de bien remplacer les valeurs mensuelles des variables $NormalesMensuelle[$i] par celle valables pour l'emplacement géographique de votre station !!!
  6. On calcule maintenant la valeur de la variable $Ecart[$i]
    $Ecart[$i]=$Rain_jour[$i]-$NormaleMensuelle[$i];
    En clair, l'écart est égal au cumul des précipitations mensuelles, moins la valeur de la normale mensuelle.
  7. Enfin on incrémente $i et la boucle recommence jusqu’à la fin des enregistrement trouvés dans la BDD
    $i++;
    }
    ?>
Voilà, la partie PHP est terminée.

Encodage des données

Maintenant, avant de pour voir être exploitées par Highstock, les données doivent êtres encodées en json. C'est ce que fait le code java script suivant.

Code : Tout sélectionner

<script type="text/javascript"> 
eval(<?php echo  "'var time =  ".json_encode($time)."'" ?>);
eval(<?php echo  "'var Rain_jour =  ".json_encode($Rain_jour)."'" ?>);  
eval(<?php echo  "'var NormaleMensuelle =  ".json_encode($NormaleMensuelle)."'" ?>);  
eval(<?php echo  "'var Ecart =  ".json_encode($Ecart)."'" ?>);  
</script>
Et enfin, le code html Highstock

Je ne vous décrit pas ici tous le code, Pierre-André l'a déjà excellemment fait dans son tuto Tutoriel MySQL - Highcharts.

Je vous mets donc le code sans explications.
Cependant n'oubliez pas, dans le code suivant, de changer les chemins des répertoires contenant les fichiers java script et autres images (là ou j'ai mis A changer ou Nom de votre site, etc...
J'ai également supprimé du code les chemins absolus d'accès à mon serveur. Ceci pour éviter que des petits malins qui aurait la flemme de changer ces chemins n'utilisent la bande passante de mon serveur (comme cela s'est déjà vu dans ce forum).

Vous pouvez faire votre propre page html avec votre propre code Highstock. Mais ça serait sympa de ne pas vous approprier le code et de laisser la partie credits de Highstock.

Code : Tout sélectionner

<!DOCTYPE HTML>
<html>
<head>
<title>Votre site</title>
<meta name="title" content="Votre site">
<meta name="description" content="à changer">
<meta name="keywords" content="à changer">
<meta name="robots" content="index, follow, archive">
<meta name="category" content="education, information, weather">
<meta name="author" content="Pascal WERMELINGER">
<meta name="copyright" content="© monsite-meteo.eu 2014">
<meta name="language" content="fr">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <!-- 1. Add these JavaScript inclusions in the head of your page -->
<script type="text/javascript" src=".A changer/jquery.min.js"></script>
<script src="A changer/Highstock/js/highstock.js"></script>
<script src="A changer/Highstock/js/highcharts-more.js"></script>
<script src="A changer/Highstock/js/modules/exporting.js"></script>
<script src="A changer/Highstock/js/themes/grid.js"></script>
<link rel="stylesheet" href="A changer/jquery.ui.all.css">
<script A changer/jquery-1.9.1.js"></script>
<script src="A changer/jquery.ui.core.js"></script>
<script src="A changer/jquery.ui.widget.js"></script>
<script src="A changer/jquery.ui.datepicker.js"></script>
<script src="A changer/jquery.ui.datepicker-fr.js"></script>
<link rel="stylesheet" href="A changer/demos.css">	
<script type="text/javascript" src="A changer/overlib.js"></script>
<script type="text/javascript" src="A changer/overlib_fade.js"></script>
  
   
      <!-- 2. Add the JavaScript to initialize the chart on document ready -->
<script type="text/javascript"> 
	  
    function comArr(unitsArray) { 
        var outarr = [];
        for (var i = 0; i < time.length; i++) {
         outarr[i] = [time[i], unitsArray[i]];
        }
      return outarr;
    } 
$(function () {
    var chart;        
         $(document).ready(function() { 
	var highchartsOptions = Highcharts.setOptions(Highcharts.theme);		 
		Highcharts.setOptions({
			lang: {
            months: ["Janvier "," Février "," Mars "," Avril "," Mai "," Juin "," Juillet "," Août "," Septembre "," Octobre "," Novembre "," Décembre"],
            weekdays: ["Dim "," Lun "," Mar "," Mer "," Jeu "," Ven "," Sam"],
			shortMonths: ['Jan', 'Fev', 'Mar', 'Avr', 'Mai', 'Juin', 'Juil','Août', 'Sept', 'Oct', 'Nov', 'Déc'],
            decimalPoint: ',',
            resetZoom: 'Réinitialiser le zoom',
            resetZoomTitle: 'Réinitialiser le zoom à 1:1',
            downloadPNG: "Télécharger au format PNG image",
            downloadJPEG: "Télécharger au format JPEG image",
            downloadPDF: "Télécharger au format PDF document",
            downloadSVG: "Télécharger au format SVG vector image",
            exportButtonTitle: "Exporter image ou document",
            printButtonTitle: "Imprimer le graphique",
			printChart: "Imprimer le graphique",
            loading: "Chargement en cours...",
			rangeSelectorFrom: "Du",
			rangeSelectorTo: "Au"
				}
			});
			window.chart = new Highcharts.StockChart({
            chart: {
                renderTo: 'container',
				zoomType: 'x',
                type: 'column',
				alignTicks: false,
				plotShadow: true,
				spacingLeft: 1,
				spacingRight: 20,
				//marginTop: 60,
				//marginLeft: 80,
                //marginRight: 30,
                marginBottom: 60,
				borderRadius: 10,
				backgroundColor: {
					linearGradient: [0, 0, 600, 570],
					stops: [
						[0, '#FFFFFF'],
						[1, '#CDDEFE'],
					]
				},
				plotBorderColor: '#346691',
				plotBorderWidth: 1,
				plotBackgroundColor: {
                linearGradient: [0, 0, 0, 400],
                stops: [
                    [0, '#A8D3FF'],
                    [1, '#FFFFFF']
                      ]
            	},
            },
			title: {
                text: 'Pluviométrie mensuelle depuis 2012 comparée aux normales 1981-2010',
                align: 'center',
				x: 0 //center
            },
            subtitle: {
                text: 'Source : Le nom de votre site',
                align: 'center',
                x: 0
            },
			credits: {
            text: 'Météo Conflans en Jarnisy',
            href: 'http://www.monsite-meteo.eu'
			},
			rangeSelector : {
				inputEditDateFormat: '%d-%m-%Y',
				inputDateFormat: '%d-%m-%Y',
				buttonSpacing: 2,
				labelStyle: {
	    			color: 'red',
	    			fontWeight: 'bold'
	    			},
			inputBoxBorderColor: 'gray',
	    	inputBoxWidth: 120,
	    	inputBoxHeight: 18,
	    	inputStyle: {
	    		color: '#0000A0',
	    		fontWeight: 'bold'
	    	},
	    	buttonTheme: { // styles for the buttons
	    		width: 100,
				fill: 'white',
	    		stroke: 'none',
	    			'stroke-width': 1,
	    		r: 3,
	    		style: {
	    			color: '#0000A0',
	    			fontWeight: 'bold'
	    		},
	    		states: {
	    			hover: {
	    				fill: '#FF0000',
	    				style: {
	    					color: '#FFFF00'
	    				}
					},
	    			select: {
	    				fill: '#0000A0',
	    				style: {
	    					color: 'white'
	    				}
	    			}
	    		}
	    	},
			buttons: [{
						type: 'year',
						count: 1,
						text: '1 an'
					},{
						type: 'ytd',
						count: 1,
						text: 'Cette année'
					},{
						type: 'all',
						count: 1,
						text: 'Tout'
					}],
				inputEnabled: true,
				selected : 1,	
			},
			scrollbar: {
				barBackgroundColor: '#0000A0',
				barBorderRadius: 7,
				barBorderWidth: 0,
				buttonBackgroundColor: 'silver',
				buttonBorderWidth: 0,
				buttonArrowColor: 'yellow',
				buttonBorderRadius: 3,
				rifleColor: 'yellow',
				trackBackgroundColor: '#DFF4FF',
				trackBorderWidth: 1,
				trackBorderColor: 'silver',
				trackBorderRadius: 3
			},
			navigator: {
				outlineColor: 'blue',
				outlineWidth: 1,
				maskFill: 'rgba(230, 242, 255, 0.75)',
				handles: {
					backgroundColor: 'yellow',
					borderColor: 'red'
					}
				},
			legend: {
			enabled: true,
            align: 'center',
            verticalAlign: 'center',
            x: 0,
            y: 460,
            backgroundColor: '#FFFFCC',
			borderColor: 'royalblue',
			borderWidth: 1,
			borderRadius: 5,
			layout: 'horizontal',
			shadow: true,
			},
             yAxis: { // 1er yAxis (numero 0)
			 	opposite:false,
				showFirstLabel: true,
	    		showLastLabel: true,
				labels: {
                    formatter: function() {
                        return this.value +' mm';
                    },
					align : 'right',
					x : -10,
					y : 3,
                    style: {
                        color: '#0000FF'
                    }
                },
                title: {
                    text: 'Précipitations en mm',
					style: {
                        color: '#0000FF'
                    }
                }
            },
			 xAxis: {
				type: 'datetime',
				labels: {
				format: '{value: %b<br/>%Y}',
				align: 'center',
				}
			},
			    
		    tooltip: {
				crosshairs: true,
				borderColor: 'royalblue',
				valueDecimals: 2,
				shared: true,
				backgroundColor: {
					linearGradient: [0, 0, 0, 60],
					stops: [
						[0, '#6495ed'],
						[1, '#ffffff'],
					]
				},				
				borderRadius: 5,
				formatter: function() {
                var s = '<b>'+ Highcharts.dateFormat('%B %Y', this.x) +'</b>';
                $.each(this.points, function(i, point) {
				var unit = {
                        'Précipitations': ' mm',
						'Normales 1981-2010': ' mm',
						'Ecart': ' mm',
                    }[this.point.series.name];
				    s = s + '<br/>' + '<span style="color:'+ point.series.color +'">' + point.series.name + '</span> : '  +Highcharts.numberFormat(point.y,1,","," ")
                       + unit;
                });
                
                return s;
            },
			

            },
			plotOptions: {
				column: {
					grouping: false,
                	shadow: false,
					},
			},
			series: [{
		        name: 'Précipitations',
				id :'Precipitations',
				type: 'column',
				pointPadding: -0.2,
				color: {
					linearGradient: { x1: 0, x2: 0, y1: 1, y1: 1.5 },
					stops: [
						[0, 'rgba(0, 0, 160, .9)'],
						[1, 'rgba(0, 128, 192, .8)']
					]
				},
		        data: comArr(Rain_jour),
		    },{
		        name: 'Ecart',
				id : 'Ecart',
		        type: 'column',
				color: {
					linearGradient: { x1: 0, x2: 0, y1: 1, y1: 1.5 },
					stops: [
						[0, 'rgba(255, 0, 0, .9)'],
						[1, 'rgba(255, 255, 0, .8)']
					]
				},
		        data: comArr(Ecart),
			},{
		        name: 'Normales 1981-2010',
				id : 'Normales',
		        type: 'spline',
                color: '#008080',
				lineWidth : 0.5,
				marker: {
					enabled: true,
                	radius: 4,
                  	symbol: 'triangle',
                	lineWidth: 2,
                	lineColor: '#FF0000',
                	fillColor: 'white'
                },
		        data: comArr(NormaleMensuelle),
			},
			]
		}, 
		
		function(chart) {// on complete
             	chart.renderer.image('http://www.votre site.xx/Images de votre choix.png', 80, 5, 45, 50) // Doit etre un chemin absolu
				.add()
             	chart.renderer.image('http://www.votre site.xx/Images de votre choix.png', 1131, 5, 39, 50) // Doit etre un chemin absolu
            	.add();
				// apply the date pickers
				setTimeout(function() {
					$('input.highcharts-range-selector', $('#' + chart.options.chart.renderTo)).datepicker({minDate:-880,maxDate:0,})
				},0)
		// Set the datepickers date format
		$.datepicker.setDefaults({
			dateFormat: 'yy-mm-dd',
			//dateFormat: 'dd-mm-yyyy',
			onSelect: function(dateText) {
				this.onchange();
				this.onblur();
			}
        });
		});

    });
});    
/**
 * @license
 * Highcharts compatibilty pack for bringing the 2.x look for the print/export buttons back in Highcharts 3.
 * License: MIT
 * Author: Torstein Honsi
 */
(function (Highcharts) {

	var defaultOptions = Highcharts.getOptions(),
		symbols = Highcharts.Renderer.prototype.symbols,
		extend = Highcharts.extend,
		merge = Highcharts.merge;

	// Add language keys
	extend(defaultOptions.lang, {
		exportButtonTitle: 'Export to raster or vector image',
		printButtonTitle: 'Print the chart'
	});

	// The old button look
	defaultOptions.navigation.buttonOptions = merge(defaultOptions.navigation.buttonOptions, {

		borderColor: '#B0B0B0',
		height: 20,
		theme: {
			fill: {
				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
				stops: [
					[0, '#FFF'],
					[1, '#DDD']
				]
			},
			stroke: '#BBB'
		},
		symbolSize: 12,
		symbolStroke: '#A0A0A0',
		symbolStrokeWidth: 1
	});

	// Add the buttons to default options
	extend(defaultOptions.exporting.buttons, {
		exportButton: {
			//enabled: true,
			symbol: 'exportIcon',
			x: -10,
			symbolFill: '#A8BF77',
			_id: 'exportButton',
			_titleKey: 'exportButtonTitle',
			menuItems: defaultOptions.exporting.buttons.contextButton.menuItems.splice(2, 4)

		},
		printButton: {
			//enabled: true,
			symbol: 'printIcon',
			x: -36,
			symbolFill: '#B5C9DF',
			_id: 'printButton',
			_titleKey: 'printButtonTitle',
			onclick: function () {
				this.print();
			}
		}
	});
	delete defaultOptions.exporting.buttons.contextButton;

	/**
	 * Crisp for 1px stroke width, which is default. In the future, consider a smarter,
	 * global function.
	 */
	function crisp(arr) {
		var i = arr.length;
		while (i--) {
			if (typeof arr[i] === 'number') {
				arr[i] = Math.round(arr[i]) - 0.5;		
			}
		}
		return arr;
	}

	// Create the export icon
	symbols.exportIcon = function (x, y, width, height) {
		return crisp([
			'M', // the disk
			x, y + width,
			'L',
			x + width, y + height,
			x + width, y + height * 0.8,
			x, y + height * 0.8,
			'Z',
			'M', // the arrow
			x + width * 0.5, y + height * 0.8,
			'L',
			x + width * 0.8, y + height * 0.4,
			x + width * 0.4, y + height * 0.4,
			x + width * 0.4, y,
			x + width * 0.6, y,
			x + width * 0.6, y + height * 0.4,
			x + width * 0.2, y + height * 0.4,
			'Z'
		]);
	};
	// Create the print icon
	symbols.printIcon = function (x, y, width, height) {
		return crisp([
			'M', // the printer
			x, y + height * 0.7,
			'L',
			x + width, y + height * 0.7,
			x + width, y + height * 0.4,
			x, y + height * 0.4,
			'Z',
			'M', // the upper sheet
			x + width * 0.2, y + height * 0.4,
			'L',
			x + width * 0.2, y,
			x + width * 0.8, y,
			x + width * 0.8, y + height * 0.4,
			'Z',
			'M', // the lower sheet
			x + width * 0.2, y + height * 0.7,
			'L',
			x, y + height,
			x + width, y + height,
			x + width * 0.8, y + height * 0.7,
			'Z'
		]);
	};
}(Highcharts));
    

</script>


<style type="text/css">
body {
	background-image: url(A changer/PapierGris.jpg);
	background-repeat: repeat;
	text-align: center;
}
ul {
	text-align:left
}
</style>

<link href="StyleCssPourLesPages.css" rel="stylesheet" type="text/css">

</head>
<body>
<a id="Haut"></a>
<table width="1260" border="0" align="center">
  <tr>
    <td align="right" valign="middle">
    	<a href="" onMouseOver="return overlib('<ul><li>Vous pouvez zoomer sur une zone spécifique d&rsquo;un graphique en maintenant le bouton de la souris et en faisant glisser le curseur à l&rsquo;intérieur du graphique. <li>Vous pouvez changer la façon dont les mesures sont affichées dans un graphique en cliquant dans la légende sur le nom de la donnée dont vous voulez modifier l&rsquo;affichage.<li> Les graphiques sont automatiquement mis à jour toutes les 5 minutes</ul>',OPACITY, 90, LEFT, FGCOLOR, '#b5cee1', BGCOLOR, '#4682b4', BORDER, 2, WIDTH, 250, TEXTSIZE, 2, CAPTION, 'Informations' ,CAPTIONSIZE,'3');" onMouseOut="return nd();"><img src="A changer/info.png" width="40" height="40" border="0"></a>
      <a href="javascript:void(0);" onMouseOver="return overlib('Actualiser le graphique', OPACITY, 90, LEFT, FGCOLOR, '#b5cee1', TEXTSIZE,'2', WIDTH, 160 );" onMouseOut="return nd();"><img src="A changer/refresh.png" width="42" height="43" onClick="javascript:location.reload();"></a></td>
  </tr>
</table>

      
    <div id="container" style="width: 1260px; height: 570px; margin: 0 auto"></div><br>

</div>


</html>
Et voilà. J'ai commencé par le plus simple, car le code pour afficher les même données annuellement ou pour un seul mois, comme sur cette page de mon site,contrairement à ce que l'on pourrait penser, est plus compliqué.

Mais cela vous sera expliqué dans d'autres tutos.

Bon un rayon de soleil est de retour, je vais en profiter pour aller tondre la pelouse.

Re: Tuto Pluviométrie Mensuelle Comparée aux Normales 1981-2

Posté : 24 août 2014, 14:48
par Météo Villarzel
Salut Pascal,
Chapeau bas, c'est un superbe tutoriel que tu nous a pondu là.
J'ai vu que tu avais passé pas mal de temps pour pondre un tutoriel aussi complet, merci beaucoup.

Je vais regarder ça ce soir, car là on a notre premier rayon de soleil depuis 2 mois et c'est certainement le dernier de ce que l'on appel l' été :lol:
je viens de recevoir une alerte météo, on s'habitue c'est pratiquement tous les jours.
Villarzel (1555)
Pré-alerte de tempête,
niveau d'alerte orange attendu
valide à partir du: 25.08.2014 22:00
jusqu'au: 26.08.2014 16:00
valide pour: toutes les altitudes

A partir de Lundi soir, des rafales de vent qui atteignent le niveau d'alerte sont possibles de temps en temps. Il y aura des rafales comprises entre 70 et 90 km/h, localement même plus. Le vent souffle de secteur sud-ouest à ouest. Mardi après-midi, les rafales cessent rapidement.
je vais en profiter pour aller tondre la pelouse.
tu tonds ta pelouse le dimanche !!! ils sont pas chiants tes voisins :lol:

Bonne fin de dimanche.
A+

Re: Tuto Pluviométrie Mensuelle Comparée aux Normales 1981-2

Posté : 24 août 2014, 22:53
par Javier
Saludos Pascal
Bravo pour ce superbe, et bien expliqué tutoriel .
Et maintenant j'essaie effectivement de le faire sur mon site:

http://kocher.es/graficos-highcharts/Pl ... rmales.php

Merci beaucoup de Saint-Sébastien (Espagne) :D


Javier

===============================================================
Saludos Pascal
Enhorabuena por este magnífico, y bién explicado, tutorial.
Ahora mismo voy a intentar hacerlo realidad en mi página web.

Muchas gracias desde San Sebastián (Espagne)

Javier

Re: Tuto Pluviométrie Mensuelle Comparée aux Normales 1981-2

Posté : 24 août 2014, 23:48
par Javier
Il ya une petite erreur:


<!-- 1. Add these JavaScript inclusions in the head of your page -->
<script type="text/javascript" src=".A changer/jquery.min.js"></script>
<script src="A changer/Highstock/js/highstock.js"></script>
<script src="A changer/Highstock/js/highcharts-more.js"></script>
<script src="A changer/Highstock/js/modules/exporting.js"></script>
<script src="A changer/Highstock/js/themes/grid.js"></script>
<link rel="stylesheet" href="A changer/jquery.ui.all.css">
<script A changer/jquery-1.9.1.js"></script>
<script src="A changer/jquery.ui.core.js"></script>
<script src="A changer/jquery.ui.widget.js"></script>
<script src="A changer/jquery.ui.datepicker.js"></script>
<script src="A changer/jquery.ui.datepicker-fr.js"></script>
<link rel="stylesheet" href="A changer/demos.css">
<script type="text/javascript" src="A changer/overlib.js"></script>
<script type="text/javascript" src="A changer/overlib_fade.js"></script>

Re: Tuto Pluviométrie Mensuelle Comparée aux Normales 1981-2

Posté : 25 août 2014, 00:16
par Météo Villarzel
Salut Pascal,
Nickel chrome, ça fonctionne du feu de dieu, mais je n'en doutais pas une seconde :lol:
http://www.boock.ch/meteo/graphiques_dy ... _jours.php
Je vais voir pour l'adapter au température moyenne.

Encore merci pour cet excellent travail pédagogique.

A+

Re: Tuto Pluviométrie Mensuelle Comparée aux Normales 1981-2

Posté : 25 août 2014, 00:31
par Javier
Météo Villarzel a écrit :Salut Pascal,
Nickel chrome, ça fonctionne du feu de dieu, mais je n'en doutais pas une seconde :lol:
http://www.boock.ch/meteo/graphiques_dy ... _jours.php
Je vais voir pour l'adapter au température moyenne.

Encore merci pour cet excellent travail pédagogique.

A+
Saludos Pierre-Andrè
Es una buenísima noticia.
Estaré muy atento :D

Javier

Re: Tuto Pluviométrie Mensuelle Comparée aux Normales 1981-2

Posté : 25 août 2014, 18:20
par PascalWMR
Bonjour Javier
Javier a écrit :Il ya une petite erreur:


<link rel="stylesheet" href="A changer/jquery.ui.all.css">
<script A changer/jquery-1.9.1.js"></script>
<script src="A changer/jquery.ui.core.js"></script>
Non il n'y a pas d'erreur . Ce fichier existe bien. Sit tu ne l'as pas, tu peux le télécharger içi

Cordialement
Pascal

Re: Tuto Pluviométrie Mensuelle Comparée aux Normales 1981-2

Posté : 25 août 2014, 18:36
par Météo Villarzel
Salut Pascal,
Superbe ta solution, je l'ai adaptée pour les températures moyennes par mois avec la différence par rapport aux normales, ça fessait un bon moment que je cherchais une solutions et avec ton tuto je l'ai fait en peu de temps, juste que j'ai galérer avant de trouver qu'il fallait remplacer SUM par AVG (moyenne)

Code : Tout sélectionner

$sql = "SELECT tstamp, AVG(t_out_moy), substr(recdateTZ,1,6) AS AnneeMois FROM `MiniMaxidata` GROUP BY AnneeMois";  
$query = mysqli_query($conn,$sql);                   
$i=0;
while ($list = mysqli_fetch_assoc($query)) {      
if (date("I",time())==0) { 
   $time[$i]=($list['tstamp']+3600)*1000;
   } 
else {
   $time[$i]=($list['tstamp']+7200)*1000;
  } 

$t_out_moy[$i]=$list['AVG(t_out_moy)']*1;
Voilà le résultat
http://www.boock.ch/meteo/temperature_moyenne.php

Je vais maintenant m'attaquer au rayonnement solaire

A+

Re: Tuto Pluviométrie Mensuelle Comparée aux Normales 1981-2

Posté : 25 août 2014, 21:00
par Javier
Pascal et Pierre-André

Vous êtes des vrais maîtres.
Vous avez réussi à automatiser des graphiques magnifiques.

http://kocher.es/desv_temp.php

Très reconnaissant à vous

Saludos desde San Sebastián

Javier

Re: Tuto Pluviométrie Mensuelle Comparée aux Normales 1981-2

Posté : 26 août 2014, 05:15
par PascalWMR
Salut Pierre-André
Météo Villarzel a écrit :Salut Pascal,
Superbe ta solution, je l'ai adaptée pour les températures moyennes par mois avec la différence par rapport aux normales, ça fessait un bon moment que je cherchais une solutions et avec ton tuto je l'ai fait en peu de temps, juste que j'ai galérer avant de trouver qu'il fallait remplacer SUM par AVG (moyenne)
Vite fait avant de partir pour pas loin de chez toi (Pontarlier).

Merci, mais bon si toi tu n'avait pas fait le tuto Highcharts avant je n'aurais jamais fait ça non plus. Alors je te retourne les remerciements.

Bon je ne vais pas avoir trop le temps pour faire le tuto pour la pluvio annuelle ce weekend (apéro prévu :mrgreen: ). Ca n'est pas plus compliqué que pour la pluvio mensuelle. il faut juste calculer la pluvio de l'année en cours.

En attendant le tuto, je te met le code partie php de la pluvio annuelle.

Code : Tout sélectionner

<?php
// appel du script de connexion
require("GraphDynamic/mysqli_connect.php");                     

// Creation d'une variable $Aujoudhui qui sert plus bas a déterminer la valeur de la variable $NormaleAnnuelle
$makeAujoudhui= mktime(0, 0, 0, date('m'), 1, date('Y'));
$Aujoudhui=date("YmdHi", $makeAujoudhui);


// Récupération des données groupée par année
$sql = "SELECT tstamp, sum(Rain_jour), substr(recdateTZ,1,4) AS AnneeMois FROM `MiniMaxidata` GROUP BY AnneeMois";  
$query = mysqli_query($conn,$sql);                   
$i=0;
while ($list = mysqli_fetch_assoc($query)) {      
if (date("I",time())==0) { 
	$time[$i]=($list['tstamp']+3600)*1000;
	} 
else {
	$time[$i]=($list['tstamp']+7200)*1000;
  } 

$Rain_jour[$i]=$list['sum(Rain_jour)']*1;
	
	// Détermination de la valeur de $NormaleAnnuelle
	// Les normales ci dessous sont celle de la station Météo France de Metz Marly-Frescaty valable pour ma station.
	// Si année de $time[$i] <  année en cours, Normale annuelle égale Normale annuelle totale soit 755.3mm pour ma station
	if (date("Y",$time[$i]/1000) < substr($Aujoudhui,0,4)) {$NormaleAnnuelle[$i]=755.3;}
	// Sinon année de $time[$i] est l'année en cours, alors Normale annuelle est égale au cumul des normales mensuelles calculées en fonction du mois en cours
	elseif (substr($Aujoudhui,4,2)==1) {$NormaleAnnuelle[$i]=64.2;}
	elseif (substr($Aujoudhui,4,2)==2) {$NormaleAnnuelle[$i]=121.1;}
	elseif (substr($Aujoudhui,4,2)==3) {$NormaleAnnuelle[$i]=182.4;}
	elseif (substr($Aujoudhui,4,2)==4) {$NormaleAnnuelle[$i]=232.9;}
	elseif (substr($Aujoudhui,4,2)==5) {$NormaleAnnuelle[$i]=291.8;}
	elseif (substr($Aujoudhui,4,2)==6) {$NormaleAnnuelle[$i]=353.5;}
	elseif (substr($Aujoudhui,4,2)==7) {$NormaleAnnuelle[$i]=417.2;}
	elseif (substr($Aujoudhui,4,2)==8) {$NormaleAnnuelle[$i]=478.0;}
	elseif (substr($Aujoudhui,4,2)==9) {$NormaleAnnuelle[$i]=540.7;}
	elseif (substr($Aujoudhui,4,2)==10) {$NormaleAnnuelle[$i]=612.5;}
	elseif (substr($Aujoudhui,4,2)==11) {$NormaleAnnuelle[$i]=676.5;}
	elseif (substr($Aujoudhui,4,2)==12) {$NormaleAnnuelle[$i]=755.3;}

// Calcul de l'écart entre les précipitations effectives et la normale annuelle
$Ecart[$i]=$Rain_jour[$i]-$NormaleAnnuelle[$i];


$i++;
} 	
  ?>

<script type="text/javascript"> 
eval(<?php echo  "'var time =  ".json_encode($time)."'" ?>);
eval(<?php echo  "'var Rain_jour =  ".json_encode($Rain_jour)."'" ?>);  
eval(<?php echo  "'var NormaleAnnuelle =  ".json_encode($NormaleAnnuelle)."'" ?>);  
eval(<?php echo  "'var Ecart =  ".json_encode($Ecart)."'" ?>);  

</script>
Ne t'étonne pas si je ne répond pas, je pars pour au moins 2 jours.

A+
Pascal