[DEV] Créer une carte animée avec actionscript, php et mysql
La carte ci-dessus, réalisée en flash dynamique avec actionscript, représente l’évolution de la population mondiale de 1950 à 2015 (projection). A chaque date, par l’intermediaire d’une requete à une base de donnée mysql, la population de chaque pays est représentée par un cercle proportionnel. En même temps que la population, la taille des cercles varie au cours du temps. Pour rendre fluide l’animation, une interpolation géométrique est réalisée automatiquement entre chaque année. Au final, on observe que seuls quelques pays concentrés en europe de l’Est ont une population décroissante sur l’ensemble de la periode.
Je mets à disposition les code source ci-dessous. Le code ne prend pas du tout en compte le dessin du fond de carte et le graphisme. Il sert uniquement à gérer l’interpolation entre des cercles en fonction des valeurs contenues dans la base de donnée. Il y a quelques éléments écrits en dur, cette solution n’est donc pas générique. Si vous avez des questions, n’hésitez pas à laisser un commentaire.
1) worldmap.fla
Ci dessous, le code source action script à inserer dans votre fichier flash dès la premièere image.
// ce qui est égal à PI/4 radians.
var deltaAngle = Math.PI / 4;// Recherche la distance du centre du cercle aux points de contrôle des courbes.
var ctrlDist = rayon/Math.cos(deltaAngle/2);// Initialise langle à 0 et définit les variables locales utilisées
// pour les points de contrôle et de terminaison.
var angle = 0;
var rx, ry, ax, ay;// Se déplace au point de départ, de un rayon à la droite du centre du cercle.
this.moveTo(x + rayon, y);// Répète lopération huit fois pour créer huit segments.
for (var i = 0; i < 8; i++) {// Incrémente langle de deltaAngle (PI/4) pour créer tout le cercle (2PI).
angle += deltaAngle;
// Les points de contrôle sont dérivés en utilisant les fonctions sinus et cosinus.
rx = x + Math.cos(angle-(deltaAngle/2))*(ctrlDist);
ry = y + Math.sin(angle-(deltaAngle/2))*(ctrlDist);
// Les points dancrage (points terminaux de la courbe) peuvent être
// déterminés de manière similaire aux points de contrôle.
ax = x + Math.cos(angle)*rayon;
ay = y + Math.sin(angle)*rayon;
// Dessine le segment.
this.curveTo(rx, ry, ax, ay);
}
}
// ———— DECLARATION DES VARIABLES ————
var anneeDebut = 1950;
var anneeFin = 2050;
var nbAnnee = anneeFin-anneeDebut+1;
var fichierData=new LoadVars();
var listeData=new Array;
var listeResultat=new Array;
var coef=0.003;
var nbImage = 2; //Nombre d’images par changement
var vitesseTimer = 0.1;
// ——–
// ———— RECUPERATION DES DONNÉES ————
fichierData.load(“req_pop.php”);
// ———— DEBUT DU ONLOAD —————–
fichierData.onLoad=function(){
if(true)
{
//on parse l’information
_root.listeData=fichierData.resultat.split(“||”);
_root.listeData.pop();
for(i=0;i<_root.listeData.length;i++)
{
idWuts = i+1;
// recuperation des données////////////////////////////
_root.listeResultat[i]=_root.listeData[i].split(“,”);
for(j=1;j<=nbAnnee;j++)
{
idVal = j+3;
idAnnee = j+anneeDebut-1;
idAnneeInf = j+anneeDebut-2;
// recupération des rayons
_root[“rayon”+idAnnee+”_”+idWuts]=Math.sqrt((Number(_root.listeResultat[i][idVal])*coef)/Math.PI);
}
// recupération des coord X et calage
_root[“x_”+idWuts]=Number(_root.listeResultat[i][1])/46+243;
// recupération des coord Y et calage
_root[“y_”+idWuts]=Stage.height-(Number(_root.listeResultat[i][2])/46+214);
// Cercles de départ //////////////////////////////////
r=_root[“rayon”+anneeDebut+”_”+idWuts];
x=_root[“x_”+idWuts];
y=_root[“y_”+idWuts];
//_root.createEmptyMovieClip(“circle”+idWuts,5+idWuts);
//_root[“circle”+i].beginFill(0xbbbbbb);
//_root[“circle”+i].dessineCercle(r,x,y);
//_root[“circle”+i].endFill;
}// fin de la boucle for
// ACTION SUR LE BOUTON ANIMATION DES CERCLES
_root.btAnim.onRelease=function() {
clearInterval(timer);
idAnnee = anneeDebut;
_root.carre._width=0;
_root.afficheT._x= 12;
z=nbImage;
timer = setInterval(drawCircle2,vitesseTimer,idAnnee,z);
}
// ———— FIN DU ONLOAD —————–
}// fin du if
else
{
_root.afficheT.text = “XXXXX”;
}// fin du else
}
//—————– FONCTIONS ————————
function drawCircle(){
for(i=0;i<_root.listeData.length;i++){
idWuts = i+1;
_root.r=_root[“rayon”+idAnnee+”_”+idWuts];
x= _root[“x_”+idWuts];
y= _root[“y_”+idWuts];
_root.createEmptyMovieClip(“circle_new”+idWuts,500+idWuts);
_root[“circle_new”+idWuts].lineStyle(1,0xFFFFFF);
_root[“circle_new”+idWuts].beginFill(0xFF9900);
_root[“circle_new”+idWuts].dessineCercle(r,x,y);
_root[“circle_new”+idWuts].endFill;
}
// afficchage de la date;
_root.afficheT.text = idAnnee;
if(idAnnee==anneeFin){clearInterval(timer);}else{idAnnee++;}
}
function drawCircle2(){
for(i=0;i<_root.listeData.length;i++){
//for(i=0;i<1;i++){
idWuts = i+1;
if (z==nbImage){
r=_root[“rayon”+idAnnee+”_”+idWuts];
}
else{
idAnneeInf = idAnnee-1;
etendue=Number(_root[“rayon”+idAnnee+”_”+idWuts])-Number(_root[“rayon”+idAnneeInf+”_”+idWuts]);
deltaR = etendue/nbImage;
r1=_root[“rayon”+idAnneeInf+”_”+idWuts];
r=r1+z*deltaR;
}
if (_root[“rayon”+anneeDebut+”_”+idWuts]<_root[“rayon”+anneeFin+”_”+idWuts])
{
color=”0xE87E49″;
}
else
{
color=”0x5293E2”;
}
x= _root[“x_”+idWuts];
y= _root[“y_”+idWuts];
_root.createEmptyMovieClip(“circle_new”+idWuts,500+idWuts);
_root[“circle_new”+idWuts].lineStyle(1,0xFFFFFF);
_root[“circle_new”+idWuts].beginFill(color);
//_root[“circle_new”+idWuts].beginFill(0xFF9900);
_root[“circle_new”+idWuts].dessineCercle(r,x,y);
_root[“circle_new”+idWuts].endFill;
<?php
$reponseFlash=”resultat=”;
// il faut mettre le = pour defeinir pays comme propriete de lobjet
//1)connection au serveur mysql (mettez vos propres infos de connexion)
$connexion_server=mysql_connect(“localhost”,”login”,”password”);
//2)connexion à la base de donnée
$connexion_base=mysql_select_db(“mydatabse”,$connexion_server );
//3)construire une requête
$requete=”SELECT * FROM _world_pop ORDER BY pop_2050 DESC”;
//4)on applique la requete et on recupere le resultat dans une variable
$resultat=mysql_query($requete, $connexion_server);
//5)on ferme la connexion
mysql_close($connexion_server);
//6)on affiche le resultat total avec while et par numero de champ
while($data=mysql_fetch_array($resultat))
{
$reponseFlash.=utf8_encode($data[“WUTS5″]).”,”.
utf8_encode($data[“X”]).”,”.
utf8_encode($data[“Y”]).”,”.
utf8_encode($data[“Name”]).”,”.
utf8_encode($data[“pop_1950″]).”,”.
utf8_encode($data[“pop_1951″]).”,”.
utf8_encode($data[“pop_1952″]).”,”.
utf8_encode($data[“pop_1953″]).”,”.
utf8_encode($data[“pop_1954″]).”,”.
utf8_encode($data[“pop_1955″]).”,”.
utf8_encode($data[“pop_1956″]).”,”.
utf8_encode($data[“pop_1957″]).”,”.
utf8_encode($data[“pop_1958″]).”,”.
utf8_encode($data[“pop_1959″]).”,”.
utf8_encode($data[“pop_1960″]).”,”.
utf8_encode($data[“pop_1961″]).”,”.
utf8_encode($data[“pop_1962″]).”,”.
utf8_encode($data[“pop_1963″]).”,”.
utf8_encode($data[“pop_1964″]).”,”.
utf8_encode($data[“pop_1965″]).”,”.
utf8_encode($data[“pop_1966″]).”,”.
utf8_encode($data[“pop_1967″]).”,”.
utf8_encode($data[“pop_1968″]).”,”.
utf8_encode($data[“pop_1969″]).”,”.
utf8_encode($data[“pop_1970″]).”,”.
utf8_encode($data[“pop_1971″]).”,”.
utf8_encode($data[“pop_1971″]).”,”.
utf8_encode($data[“pop_1973″]).”,”.
utf8_encode($data[“pop_1974″]).”,”.
utf8_encode($data[“pop_1975″]).”,”.
utf8_encode($data[“pop_1976″]).”,”.
utf8_encode($data[“pop_1977″]).”,”.
utf8_encode($data[“pop_1978″]).”,”.
utf8_encode($data[“pop_1979″]).”,”.
utf8_encode($data[“pop_1980″]).”,”.
utf8_encode($data[“pop_1981″]).”,”.
utf8_encode($data[“pop_1982″]).”,”.
utf8_encode($data[“pop_1983″]).”,”.
utf8_encode($data[“pop_1984″]).”,”.
utf8_encode($data[“pop_1985″]).”,”.
utf8_encode($data[“pop_1986″]).”,”.
utf8_encode($data[“pop_1987″]).”,”.
utf8_encode($data[“pop_1988″]).”,”.
utf8_encode($data[“pop_1989″]).”,”.
utf8_encode($data[“pop_1990″]).”,”.
utf8_encode($data[“pop_1991″]).”,”.
utf8_encode($data[“pop_1992″]).”,”.
utf8_encode($data[“pop_1993″]).”,”.
utf8_encode($data[“pop_1994″]).”,”.
utf8_encode($data[“pop_1995″]).”,”.
utf8_encode($data[“pop_1996″]).”,”.
utf8_encode($data[“pop_1997″]).”,”.
utf8_encode($data[“pop_1998″]).”,”.
utf8_encode($data[“pop_1999″]).”,”.
utf8_encode($data[“pop_2000″]).”,”.
utf8_encode($data[“pop_2001″]).”,”.
utf8_encode($data[“pop_2002″]).”,”.
utf8_encode($data[“pop_2003″]).”,”.
utf8_encode($data[“pop_2004″]).”,”.
utf8_encode($data[“pop_2005″]).”,”.
utf8_encode($data[“pop_2006″]).”,”.
utf8_encode($data[“pop_2007″]).”,”.
utf8_encode($data[“pop_2008″]).”,”.
utf8_encode($data[“pop_2009″]).”,”.
utf8_encode($data[“pop_2010″]).”,”.
utf8_encode($data[“pop_2011″]).”,”.
utf8_encode($data[“pop_2012″]).”,”.
utf8_encode($data[“pop_2013″]).”,”.
utf8_encode($data[“pop_2014″]).”,”.
utf8_encode($data[“pop_2015″]).”,”.
utf8_encode($data[“pop_2016″]).”,”.
utf8_encode($data[“pop_2017″]).”,”.
utf8_encode($data[“pop_2018″]).”,”.
utf8_encode($data[“pop_2019″]).”,”.
utf8_encode($data[“pop_2020″]).”,”.
utf8_encode($data[“pop_2021″]).”,”.
utf8_encode($data[“pop_2022″]).”,”.
utf8_encode($data[“pop_2023″]).”,”.
utf8_encode($data[“pop_2024″]).”,”.
utf8_encode($data[“pop_2025″]).”,”.
utf8_encode($data[“pop_2026″]).”,”.
utf8_encode($data[“pop_2027″]).”,”.
utf8_encode($data[“pop_2028″]).”,”.
utf8_encode($data[“pop_2029″]).”,”.
utf8_encode($data[“pop_2030″]).”,”.
utf8_encode($data[“pop_2031″]).”,”.
utf8_encode($data[“pop_2032″]).”,”.
utf8_encode($data[“pop_2033″]).”,”.
utf8_encode($data[“pop_2034″]).”,”.
utf8_encode($data[“pop_2035″]).”,”.
utf8_encode($data[“pop_2036″]).”,”.
utf8_encode($data[“pop_2037″]).”,”.
utf8_encode($data[“pop_2038″]).”,”.
utf8_encode($data[“pop_2039″]).”,”.
utf8_encode($data[“pop_2040″]).”,”.
utf8_encode($data[“pop_2041″]).”,”.
utf8_encode($data[“pop_2042″]).”,”.
utf8_encode($data[“pop_2043″]).”,”.
utf8_encode($data[“pop_2044″]).”,”.
utf8_encode($data[“pop_2045″]).”,”.
utf8_encode($data[“pop_2046″]).”,”.
utf8_encode($data[“pop_2047″]).”,”.
utf8_encode($data[“pop_2048″]).”,”.
utf8_encode($data[“pop_2049″]).”,”.
utf8_encode($data[“pop_2050″])
.”||”;
}
echo($reponseFlash);
// on utilse echo pour que flash pouisse recuperer les donnees
?>
}// FIN DE LA BOUCLE FOR
// incrementation
if (z==nbImage){z=1;idAnnee++;}
else{z++;}
// affichage de la date
_root.afficheT.text = idAnnee;
_root.afficheT._x += 2.7;
_root.carre._x=xbarre;
_root.carre._y=ybarre;
_root.carre._width+=2.7;
if(idAnnee==anneeFin){clearInterval(timer);
}
}
OpenEdition vous propose de citer ce billet de la manière suivante :
Nicolas Lambert (21 juin 2013). [DEV] Créer une carte animée avec actionscript, php et mysql. Carnet (neo)cartographique. Consulté le 7 octobre 2024 à l’adresse https://doi.org/10.58079/rrdp