Accueil  
mis en ligne le 17 juin 2005     


Image pseudo-vectorielle sur le web sans plugin
Test sur les départements français

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>
-->

1 488 347
1 493 350
1 494 352
1 494 355
1 496 358
2 351 587
2 357 587
2 361 588
2 365 588
2 370 591
2 374 590
2 378 590
2 381 590
2 384 587
2 389 587
2 394 587
2 394 583
2 396 582
2 396 582
2 398 578
2 399 574
2 398 570
2 396 566
2 395 562
2 395 556
2 394 554
2 394 549


Listing du programme VBA "dxf2xl" destiné à extraire les coordonnées d'un calque depuis un fichier DXF

Sub parcelle()
    ChDrive ("C:\")
    ChDir ("c:\cadastre")
    
    'ce bloc compte  le nombre de parcelles dans le fichier DXF
    nb_ligne_tableau = 1
    Open "cadastre.dxf" For Input As #1
    While Not EOF(1)
        Input #1, ligne
        If ligne = "PARCELLE" Then
            nblignes = nblignes + 1
        End If
    Wend
    Close #1
    
    'Ce bloc repère la position des coordonnées des parcelles
    ReDim tableau(1 To nblignes, 1 To 3)
    lignes_lues = 1
    Open "harau_cadastre.dxf" For Input As #1
    While Not EOF(1)
        i = i + 1
        Input #1, ligne
                
        If ligne = "PARCELLE" Then
            num_ligne_x = i + 4
            num_ligne_y = i + 6
        End If
 
' Ce bloc stock les coordonnées dans une variable à condition
' qu'elles correspondent aux critères     
        If i = num_ligne_x And IsNumeric(ligne) Then
            If ligne > 893000 Then
                tableau(lignes_lues, 1) = Int(ligne)
            End If
        End If
    
        If i = num_ligne_y And IsNumeric(ligne) Then
            If ligne > 112000 Then
                tableau(lignes_lues, 2) = Int(ligne)
                lignes_lues = lignes_lues + 1
            End If
        End If
            
        If ligne = "SEQEND" Then
            tableau(lignes_lues, 3) = "fin_parcelle"
        End If
    
    Wend
    Close #1
' écriture
des coordonnées dans un fichier ASCII
    Open "parcelles.txt" For Output As #1
        For i = 1 To lignes_lues - 1
            Print #1, tableau(i, 1), tableau(i, 2), tableau(i, 3)
        Next i
    Close #1
End Sub