Image pseudo-vectorielle sur le web sans
plugin
Dans notre exemple, on utilise la carte des départements français. Le jeu de données est constitué de leur numéro en colonne 1 et des coordonnées XY en colonnes 2 et 3 (voir l'extrait ci-dessous, à droite). On utilise la bibliothèque GD qui doit être préalablement installée, ce qui est le cas chez FREE.FR). Cette bibliothèque permet de créer des images et dessiner à l'intérieur. Nous nous contentons ici de créer des droites à partir de coordonnées lues dans un fichier. Le script est suffisamment commenté, nous ne donnerons pas plus de détails. Quel
est le principe ?
Le script PHP lit un fichier de coordonnées XY, il les multiplie
par un coefficient de zoom et trace les vecteurs dans un fichier
"raster" (jpeg ou png). L'image est redessinée à chaque
clic du visiteur, ce qui donne une illusion de zoom. Puisqu'il y
a recalcul de l'image, celle-ci n'est jamais déformée ce
qui autorise des agrandissements à l'infini; enfin presque, la
limite étant la ressource du système pour le calcul et la
bande passante disponible pour afficher l'image chez le visiteur.
Puisque l'on crée une image raster, celle-ci peut-être
affichée par n'importe quel navigateur, sans logiciel
supplémentaire. Cette technique peut être adaptée pour représenter un plan du cadastre issu d'un fichier DXF. Il faut d'abord relever les coordonnées du calque choisi (les parcelles par ex) et les stocker dans un fichier qui sera utilisé ensuite par le script PHP. On pourrait également faire en sorte que le programme PHP lise directement le fichier DXF. Je le déconseille dans la mesure où ces fichiers sont très volumineux ce qui ralentirait l'exécution du script. La récupération des coordonnées est assez simple à programmer (voir en fin de page le programme VBA DXF2XL écrit à cet effet). Les services fiscaux français étant "chatouilleux" sur la propriété des données du cadastre, on ne donne pas d'exemple fonctionnel ici mais sachez que ça tourne ! |
Le script PHP pour la carte des départements français |
Extrait
du jeu de données télécharger le fichier complet |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<!-- <html><body><center> <form enctype="multipart/form-data" method="post" action="france2.php"> <SELECT NAME="zoom"> <OPTION <?if($zoom==0.1){ print "selected";}?>>0.1</option> <OPTION <?if($zoom==0.25){ print "selected";}?>>0.25</option> <OPTION <?if($zoom==0.5){ print "selected";}?>>0.5</option> <OPTION <?if($zoom==1){ print "selected";}?>>1</option> <OPTION <?if($zoom==2){ print "selected";}?>>2</option> <OPTION <?if($zoom==3){ print "selected";}?>>3</option> <OPTION <?if($zoom==4){ print "selected";}?>>4</option> <OPTION <?if($zoom==5){ print "selected";}?>>5</option> <OPTION <?if($zoom==10){ print "selected";}?>10</option> </SELECT> <input type="submit" value="Zoom"> <SELECT NAME="angle"> <OPTION <?if($angle==0){ print "selected";}?>>0</option> <OPTION <?if($angle=="180 axe horizontal"){ print "selected";}?>>180 axe horizontal</option> <OPTION <?if($angle=="180 axe vertical"){ print "selected";}?>>180 axe vertical</option> <OPTION <?if($angle=="180 2 axes"){ print "selected";}?>>180 2 axes</option> </SELECT> <input type="submit" value="Rotation"> <br><br></center> <?php // recuperation des valeurs choisies par le visiteur ou creation si absence de choix if(!$zoom) {$zoom=0.1;} if(!$angle) {$angle=0;} $i=0; $xmin=0; $ymin=0; $xmax=0; $ymax=0; // lecture du fichier de donnees $fichier=fopen("france.csv","r+"); while(!feof($fichier)) { $tableau[$i]=explode(";",fgets($fichier,filesize("france.csv")); // stockage de la ligne lue dans une variable de type array // on multiplie les coordonnees par la valeur du zoom $tableau[$i][1]=$tableau[$i][1]*$zoom; $tableau[$i][2]=$tableau[$i][2]*$zoom; // on recherche les max pour dimensionner, ultérieurement, l'image if($tableau[$i][1]>$xmax){$xmax=$tableau[$i][1];} if($tableau[$i][2]>$ymax){$ymax=$tableau[$i][2];} $i++; } // creation de l'image dans une variable $image = imagecreate(round($xmax)+5,round($ymax)+5); // couleur de fond de l'image $background_color = imagecolorallocate ($image, 255, 255, 255); // definition de la couleur des traits $mauve = imagecolorallocate($image,255,0,255); for($j=0;$j<$i;$j++) { // Test sur la 1ere colonne; tant que l'on ne change pas de département ... if ($tableau[$j+1][0]==$tableau[$j][0]) { //ecriture des vecteurs // Achtung: le systeme de coordonnees a l'ecran est different des coordonnees habituelles // c'est pourquoi on retranche la valeur Y a Y max // on utilise aussi cette caracteristique pour la rotation de l'image if($angle==0) { ImageLine($image,$tableau[$j][1],$ymax-$tableau[$j][2],$tableau[$j+1][1],$ymax-$tableau[$j+1][2],$mauve); } if($angle=="180 2 axes") { ImageLine($image,$xmax-$tableau[$j][1],$tableau[$j][2],$xmax-$tableau[$j+1][1],$tableau[$j+1][2],$mauve); } if($angle=="180 axe vertical") { ImageLine($image,$xmax-$tableau[$j][1],$ymax-$tableau[$j][2],$xmax-$tableau[$j+1][1],$ymax-$tableau[$j+1][2],$mauve); } if($angle=="180 axe horizontal") { ImageLine($image,$tableau[$j][1],$tableau[$j][2],$tableau[$j+1][1],$tableau[$j+1][2],$mauve); } } } // creation de l'image sous forme de fichier JPEG sur le disque du serveur imagejpeg($image,"image.jpg"); // affichage de l'image sur le navigateur print ' <input type="image" src="image.jpg" name="clic" /> </form> '; // le fait de nommer l'image permet de recuperer les coordonnees XY du clic // sur image sous la forme: $clic_x et $clic_y ?> </body> </html> --> |
|