Commit a0f1a1e0 authored by Rinkio's avatar Rinkio

Modification des états de stations + ajout de couleurs + correction de bugs

Les états de stations prennent en conpte à la fois l'état annoncé
(en service/en travaux) mais aussi le nombre de bornes indiqué
pour détecter les informations incohérentes
(station fermée avec borne active ou station ouverte sans borne)

Les états ayant au moins une station sont affichés dans la légende
(avec le nombre de stations)

correction du titre le la carte

ajout de couleurs aux communes correspondant aux départements
75/78 = jaune ; 92/77 = bleu ; 93/91 = rouge ; 94/95 = vert

correction du niveau de gris pour les communes sans couleur définie

correction de bug empechant la détéction si une commune est déjà dans le
tableau des communes sélectionnées
parent b9ad7ec2
......@@ -199,7 +199,7 @@ function carte($largeur_carte=800,$hauteur_carte=600,$filtre=0,
$svg.='<g id="communes" transform="scale('.$largeur_f.','.$hauteur_f.') translate('.$dec_lon.','.$dec_lat.')">'."\n";
//style commun à tous les tracés de communes
$svg.="\t".'<g id="contour" style="stroke-width:'.$stroke.'; fill:#888888;">'."\n";
$svg.="\t".'<g id="contour" style="stroke-width:'.$stroke.'; fill:darkgray;">'."\n";
//affichage en premier (arrière-plan) des communes hors sélection (in=false)
$svg.="\t\t".'<g id="out" style="stroke:white; fill-opacity:0.4;">'."\n";
......
<?php
$bdd_pdo_dns = 'mysql:host=;dbname=';
$username = '';
$password = '';
$pdo = new PDO($bdd_pdo_dns, $username, $password);
?>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -45,7 +45,7 @@ else
<body>
<h1>Vélib Stats (site non officiel)</h1>
<ul>
<li>Nombre de stations ouvertes annoncées (<abbr title="Stations affichées comme étant ouverte">définition</abbr>) : <?php echo $conso['nbStation']; ?></li>
<li>Nombre de stations ouvertes annoncées (<abbr title="Stations affichées comme étant ouvertes">définition</abbr>) : <?php echo $conso['nbStation']; ?></li>
<li>Nombre de stations ouvertes détectées (<abbr title="Stations avec un nombre de bornes positifs avec au moins un vélo ou une borne libre">définition</abbr>) : <?php echo $conso['nbStationDetecte']; ?></li>
<li>Nombre de vélos mécaniques disponible : <?php echo $conso['nbBike']; ?></li>
<li>Nombre de vélos électriques disponible : <?php echo $conso['nbEbike']; ?></li>
......@@ -57,76 +57,132 @@ else
<p>
<?php
//tableaux décrivant les communes ayant des stations
//liste des communes ayant des stations
$liste_communes=array();
//tableaux décrivant les états des stations
$couleur_etat=array('mediumvioletred','darkred','slateblue',10=>'indigo','darkorange','darkgreen');
$nombre_etat=array(0,0,0,10=>0,0,0);
$objets=array();
foreach($statusStation as $station)
{
//interprétation de l'état de la station 0=état non prévu
//état 0..2 : pas de borne active ; état 10..12 : bornes actives
switch($station['state'])
{
case 'Work in progress': $etat=1; break;
case 'Operative': $etat=2; break;
default: echo $station['state']; $etat=0;
}
if($station['nbEDock']!=0) $etat+=10;
$nombre_etat[$etat]++;
//récupération de la commune correspondant à la station (d'après son numéro)
$res=$pdo->query('SELECT insee FROM tranche WHERE debut<="'.$station['code'].'" AND fin>="'.$station['code'].'"');
$ligne=$res->fetch();
//initialisation du nombre de stations + ajout à la liste des communes
if(!isset($nb_stations[$ligne['insee']]))
//ajout à la liste des communes
if(!in_array($ligne['insee'],$liste_communes))
{
$liste_communes[]=$ligne['insee'];
}
if($etat==0)
{
$objets[]=array(
'nature'=>'point',
'point'=>'rond',
'taille'=>8,'couleur'=>'#000000',
'lon'=>$station['longitude'],
'lat'=>$station['latitude'],
'lien'=>'station.php?code='.$station['code'],
'info'=>'Station '.sprintf('%05d',$station['code'])."\n".$station['name'].'<br/>'."\n".'État inconnu');
}
else if($etat==1)
//texte en fonction du nombre de bornes
switch($station['nbEDock'])
{
$objets[]=array(
'nature'=>'point',
'point'=>'triangle',
'taille'=>8,'couleur'=>'#800000',
'lon'=>$station['longitude'],
'lat'=>$station['latitude'],
'lien'=>'station.php?code='.$station['code'],
'info'=>'Station '.sprintf('%05d',$station['code'])."\n".$station['name'].'<br/>'."\n".'En travaux');
case 0: $s_info2='aucune borne'; break;
case 1: $s_info2='1 borne'; break;
default: $s_info2=$station['nbEDock'].' bornes'; break;
}
else if($etat==2)
//forme en fonction de l'état annoncé 0=inconnu, 1=WIP, 2=Active
switch($etat)
{
$objets[]=array(
'nature'=>'point',
'point'=>'carre',
'taille'=>6,'couleur'=>'#008000','angle'=>'45',
'lon'=>$station['longitude'],
'lat'=>$station['latitude'],
'lien'=>'station.php?code='.$station['code'],
'info'=>'Station '.sprintf('%05d',$station['code'])."\n".$station['name'].'<br/>'."\n".'En service');
case 0:
case 10:
$s_point='rond';
$s_taille=6;
$s_angle=0;
$s_info1='État inconnu';
break;
case 1:
case 11:
$s_point='triangle';
$s_taille=8;
$s_angle=0;
$s_info1='En travaux';
break;
case 2:
case 12:
$s_point='carre';
$s_taille=6;
$s_angle=45;
$s_info1='En service';
break;
}
$objets[]=array(
'nature'=>'point',
'point'=>$s_point,
'taille'=>$s_taille,
'angle'=>$s_angle,
'couleur'=>$couleur_etat[$etat],
'lon'=>$station['longitude'],
'lat'=>$station['latitude'],
'lien'=>'station.php?code='.$station['code'],
'info'=>'Station '.sprintf('%05d',$station['code'])."\n".$station['name'].'<br/>'."\n".$s_info1.' - '.$s_info2
);
}
$objets[]=array('nature'=>'texte','x'=>400,'y'=>30,'texte'=>'Stations Vélib’','taille'=>24,'couleur'=>'blue','align'=>'m','angle'=>0);
//légende (point et texte, affiché uniquement pour les états ayant au moins une station
if($nombre_etat[12])
{
$objets[]=array('point'=>'carre','x'=>-18,'y'=>10,'taille'=>6,'couleur'=>$couleur_etat[12],'angle'=>45);
$objets[]=array('nature'=>'texte','x'=>-20,'y'=>20,'texte'=>'Stations en service ('.$nombre_etat[12].')','taille'=>12,'angle'=>90,'align'=>'l');
}
if($nombre_etat[1])
{
$objets[]=array('point'=>'triangle','x'=>-38,'y'=>10,'taille'=>8,'couleur'=>$couleur_etat[1],'angle'=>90);
$objets[]=array('nature'=>'texte','x'=>-40,'y'=>20,'texte'=>'Stations en travaux ('.$nombre_etat[1].')','taille'=>12,'angle'=>90,'align'=>'l');
}
if($nombre_etat[2])
{
$objets[]=array('point'=>'carre','x'=>-18,'y'=>210,'taille'=>6,'couleur'=>$couleur_etat[2],'angle'=>45);
$objets[]=array('nature'=>'texte','x'=>-20,'y'=>220,'texte'=>'en service sans borne ('.$nombre_etat[2].')','taille'=>12,'angle'=>90,'align'=>'l');
}
if($nombre_etat[11])
{
$objets[]=array('point'=>'triangle','x'=>-38,'y'=>210,'taille'=>8,'couleur'=>$couleur_etat[11],'angle'=>90);
$objets[]=array('nature'=>'texte','x'=>-40,'y'=>220,'texte'=>'en travaux avec bornes ('.$nombre_etat[11].')','taille'=>12,'angle'=>90,'align'=>'l');
}
if($nombre_etat[0])
{
$objets[]=array('point'=>'rond','x'=>-18,'y'=>410,'taille'=>6,'couleur'=>$couleur_etat[0],'angle'=>45);
$objets[]=array('nature'=>'texte','x'=>-20,'y'=>420,'texte'=>'état inconnu sans borne ('.$nombre_etat[2].')','taille'=>12,'angle'=>90,'align'=>'l');
}
if($nombre_etat[10])
{
$objets[]=array('point'=>'rond','x'=>-38,'y'=>410,'taille'=>6,'couleur'=>$couleur_etat[10],'angle'=>90);
$objets[]=array('nature'=>'texte','x'=>-40,'y'=>420,'texte'=>'état inconnu avec bornes ('.$nombre_etat[10].')','taille'=>12,'angle'=>90,'align'=>'l');
}
$objets[]=array('nature'=>'texte','x'=>300,'y'=>30,'texte'=>'Stations Vélib’ dans la','taille'=>24,'couleur'=>'blue','align'=>'m','angle'=>0);
$objets[]=array('nature'=>'texte','x'=>300,'y'=>60,'texte'=>'Métropole du Grand Paris','taille'=>24,'couleur'=>'blue','align'=>'m','angle'=>0);
$objets[]=array('point'=>'carre','x'=>-18,'y'=>10,'taille'=>6,'couleur'=>'#008000','angle'=>45);
$objets[]=array('point'=>'triangle','x'=>-38,'y'=>10,'taille'=>8,'couleur'=>'#800000','angle'=>90);
//couleurs associées aux communes
$couleur_dept=array(75=>'Khaki',92=>'SkyBlue',93=>'LightCoral',94=>'GreenYellow',
77=>'SkyBlue',91=>'LightCoral',78=>'Khaki',95=>'GreenYellow');
$objets[]=array('nature'=>'texte','x'=>-20,'y'=>20,'texte'=>'Stations ouvertes','taille'=>12,'angle'=>90,'align'=>'l');
$objets[]=array('nature'=>'texte','x'=>-40,'y'=>20,'texte'=>'Stations fermées','taille'=>12,'angle'=>90,'align'=>'l');
$couleur_commune=array();
foreach($liste_communes AS $commune)
{
$dept=floor($commune/1000);
if(isset($couleur_dept[$dept]))
$couleur_commune[$commune]=$couleur_dept[$dept];
}
include('carte.php');
$svg=carte(800,600,$liste_communes,'commune',array(),array(),$objets);
$svg=carte(800,600,$liste_communes,'',array(),$couleur_commune,$objets);
echo $svg;
......
<?php
require_once('config.php');
include_once('functions.php');
/*arguments :
largeur_carte : nombre de pixels de largeur de l'image SVG à générer
hauteur_carte : nombre de pixels de hauteur de l'image SVG à générer
couleur : tableau associatif : numéro INSEE de la commune => couleur de la commune
texte : tableau associatif : numéro INSEE de la commune => texte additionnel dans l'info-bulle
filtre : mode d'affichage : 0 = tout, 01 à 99 = numéro de département, 100 à 999 = epic ; 1000 et + : code insee de commune
titre : titre du graphique : tableaux de tableaux, chaque élément comporte 4 paramètres :
coordonnée du bord gauche du texte (en pixels depuis le bord gauche de la carte)
coordonnée de la ligne de base du texte (en pixels depuis le bord supérieur de la carte)
texte à afficher
taille du texte en pixels
*/
function carte($largeur_carte,$hauteur_carte,$couleur=array(),$texte=array(),$filtre=0,$titre=array())
{
global $pdo;
//récupération des coordonnées MIN et MAX des communes (en 1/10 000 000 de degré)
if($filtre==0) $requete = $pdo->query('SELECT MIN(ouest) AS O, MAX(est) AS E, MAX(nord) AS N, MIN(sud) AS S FROM commune'); //pas de filtre
else if($filtre<=100) $requete = $pdo->query('SELECT MIN(ouest) AS O, MAX(est) AS E, MAX(nord) AS N, MIN(sud) AS S FROM commune WHERE dept="'.$filtre.'"'); //filtre sur un département
else if($filtre<=1000) $requete = $pdo->query('SELECT MIN(ouest) AS O, MAX(est) AS E, MAX(nord) AS N, MIN(sud) AS S FROM commune WHERE etab+100="'.$filtre.'"'); //filtre sur un epic
else $requete = $pdo->query('SELECT MIN(ouest) AS O, MAX(est) AS E, MAX(nord) AS N, MIN(sud) AS S FROM commune WHERE insee="'.$filtre.'"'); //filtre sur une commune
$resultat = $requete->fetchAll();
if($resultat[0]['O']=='') //si le filtre renvoie une table vide, affichuge de toute la carte
{
$filtre=0;
$requete = $pdo->query('SELECT MIN(ouest) AS O, MAX(est) AS E, MAX(nord) AS N, MIN(sud) AS S FROM commune');
$resultat = $requete->fetchAll();
}
$centreOE=($resultat[0]['O']+$resultat[0]['E'])/2e7; //calcul des coordonnées du centre de la carte (en degrés)
$centreNS=($resultat[0]['N']+$resultat[0]['S'])/2e7;
$km_lat=20003.932/180; //écart en km entre deux degrés de latitude
$km_lon=$km_lat*cos(deg2rad($centreNS)); //écart en km entre deux degrés de longitude (utilisation de la latitude du centre de la carte)
$largeur_d=($resultat[0]['E']-$resultat[0]['O'])/1e7; //calcul des dimensions minimales de la carte (en degrés)
$hauteur_d=($resultat[0]['N']-$resultat[0]['S'])/1e7;
$largeur_k=$largeur_d*$km_lon; //calcul des dimensions minimales de la carte (en km)
$hauteur_k=$hauteur_d*$km_lat;
$pixels_par_km_lon=$largeur_carte/$largeur_k; //calcul du nombre de pixels utilisés pour afficher un km2
$pixels_par_km_lat=$hauteur_carte/$hauteur_k;
$pixels_par_km=min($pixels_par_km_lon,$pixels_par_km_lat)*0.95; //l'affichage est calculé selon la coordonnée la moins précise (+ une marge de 2,5% autour de la carte)
$largeur_k=$largeur_carte/$pixels_par_km; //calcul des dimensions réelles de la carte (en km)
$hauteur_k=$hauteur_carte/$pixels_par_km;
$largeur_d=$largeur_k/$km_lon; //calcul des dimensions réelles de la carte (en degrés)
$hauteur_d=$hauteur_k/$km_lat;
$largeur_f=$largeur_carte/$largeur_d/1e3; //calcul des facteurs de mise à l'échelle
$hauteur_f=-$hauteur_carte/$hauteur_d/1e3; //plus retournement vertical (Nord en haut)
$dec_lon=-($centreOE-$largeur_d/2)*1000; //calcul du décalage de l'affichage
$dec_lat=-($centreNS+$hauteur_d/2)*1000;
$carte_ouest=($centreOE-$largeur_d/2)*1e7; //détermination des coordonnées extrèmes de la carte (pour recherche des communes voisines y figurant)
$carte_est=($centreOE+$largeur_d/2)*1e7;
$carte_nord=($centreNS+$hauteur_d/2)*1e7;
$carte_sud=($centreNS-$hauteur_d/2)*1e7;
//génération de la carte SVG avec la taille prédéfinie
echo '<svg id="carte" xmlns="http://www.w3.org/2000/svg" version="1.1" width="'.$largeur_carte.'" height="'.$hauteur_carte.'" viewBox="0 0 '.$largeur_carte.' '.$hauteur_carte.'">';
echo "\n";
echo '<style type="text/css">';
echo 'a:focus { outline-style: none;}'; //désactivation de la ligne en pointillés autour de la zone cliquée
echo 'path:hover {fill-opacity:1;}'; //la zone survolée se colore en ble
echo '</style>';
echo "\n";
echo '<rect x="0" y="0" width="'.$largeur_carte.'" height="'.$hauteur_carte.'" fill="white"/>';
echo '<g transform="scale('.$largeur_f.','.$hauteur_f.') translate('.$dec_lon.','.$dec_lat.')">'; //transformation des coordonnées géographiques (1/1000°) en coordonnées d'affichage
echo "\n";
echo '<g style="stroke:black; stroke-width:0.2; fill-opacity:0.5;">'; //formatage commun à toutes les communes
echo "\n";
//récupération des données des communes (et des communes limitrophes)
$requete = $pdo->query('SELECT * FROM commune WHERE ouest<="'.$carte_est.'" AND est>="'.$carte_ouest.'" AND nord>="'.$carte_sud.'" AND sud<="'.$carte_nord.'"');
$resultat = $requete->fetchAll();
foreach($resultat AS $res=>$ligne) //détermination si les communes sont dans le filtre ou pas
{
if($filtre==0) $resultat[$res]['in']=1;
else if($filtre<=100) { if($ligne['dept']==$filtre) $resultat[$res]['in']=1; else $resultat[$res]['in']=0; }
else if($filtre<=1000) { if($ligne['etab']+100==$filtre) $resultat[$res]['in']=1; else $resultat[$res]['in']=0; }
else { if($ligne['insee']==$filtre) $resultat[$res]['in']=1; else $resultat[$res]['in']=0; }
}
foreach($resultat AS $res=>$ligne) if($ligne['in']==0) //affichage en premier des communes hors filtre (arrière-plan)
{
echo '<a xlink:href="?page=communes&amp;action=2&amp;insee='.$ligne['insee'].'_'.$ligne['nom'].'">';
echo '<path d="M'.$ligne['contour'].'Z" style="stroke:white; '; //contour de la commune en blanc
if(isset($couleur[$ligne['insee']])) echo 'fill:'.$couleur[$ligne['insee']].'; "/>'; //coloration de la commune en fonction de l'établissement
else echo 'fill:#dddddd;"/>';
if(isset($texte[$ligne['insee']])) echo '<title>'.$ligne['nom_complet'].' '.$texte[$ligne['insee']].'</title>'; //affichage du nom de la commune en infobulle
else echo '<title>'.$ligne['nom_complet'].'</title>'; //affichage du nom de la commune en infobulle
echo '</a>'."\n";
}
foreach($resultat AS $res=>$ligne) if($ligne['in']==1) //affichage en dernier des communes dans le filtre (avant-plan)
{
echo '<a xlink:href="?page=communes&amp;action=2&amp;insee='.$ligne['insee'].'_'.$ligne['nom'].'">';
echo '<path d="M'.$ligne['contour'].'Z" style="';
if(isset($couleur[$ligne['insee']])) echo 'fill:'.$couleur[$ligne['insee']].'; "/>'; //coloration de la commune en fonction de l'établissement
else echo 'fill:#dddddd;"/>';
if(isset($texte[$ligne['insee']])) echo '<title>'.$ligne['nom_complet'].' '.$texte[$ligne['insee']].'</title>'; //affichage du nom de la commune en infobulle
else echo '<title>'.$ligne['nom_complet'].'</title>'; //affichage du nom de la commune en infobulle
echo '</a>'."\n";
}
echo '</g>';
echo '</g>';
foreach($titre AS $T) //affichage des titres de la carte
{
echo '<text x="'.$T[0].'" y="'.$T[1].'" style="font-family:Arial; font-size:'.$T[3].'px;">'.$T[2].'</text>';
}
echo '</svg> ';
}
//exemples d'utilisation de la fonction
$couleur_etab=array(0=>'#888888',1=>'#6887B3',2=>'#AF732A',3=>'#4EB26E',4=>'#AE335B',5=>'#EE7E70',6=>'#A2CC84',7=>'#3797D3',8=>'#E74B3D',9=>'#C89D67',10=>'#F39D1F',11=>'#577364',12=>'#905CA1');
$coul=array();
$texte=array();
$requete = $pdo->query('SELECT insee, dept, etab FROM commune');
$resultat = $requete->fetchAll();
foreach($resultat AS $ligne)
{
$texte[$ligne['insee']]='['.$ligne['dept'].']';
if(isset($couleur_etab[$ligne['etab']])) $coul[$ligne['insee']]=$couleur_etab[$ligne['etab']];
else $coul[$ligne['insee']]=$couleur_etab[0];
}
carte(800,600,$coul,$texte,75101);
carte(400,300,$coul,$texte,0,array(array(16,24,'Métropole du Grand Paris',16),array(16,40,'Établissements',12),array(16,53,'publics',12),array(16,66,'territoriaux',12)));
carte(400,300,$coul,$texte,75,array(array(16,24,'Paris',16)));
$coul=array();
$texte=array();
$requete = $pdo->query('SELECT insee, dept, etab FROM commune');
$resultat = $requete->fetchAll();
foreach($resultat AS $ligne)
{
$texte[$ligne['insee']]='['.$ligne['dept'].']';
if(isset($couleur_etab[$ligne['dept']-90])) $coul[$ligne['insee']]=$couleur_etab[$ligne['dept']-90];
else $coul[$ligne['insee']]=$couleur_etab[7];
}
carte(400,300,$coul,$texte,94,array(array(156,292,'Val-de-Marne',16)));
carte(400,300,$coul,$texte,0,array(array(16,24,'Métropole du Grand Paris',16),array(16,40,'Départements',12)));
?>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment