html> head> Génération de SVG par PostGIS et AsSVG
Transcription
html> head> Génération de SVG par PostGIS et AsSVG
<html> Balise début fichier HTML <head> <title>Génération de SVG par PostGIS et AsSVG</title> </head> Début en-tête html Titre page Fin en-tête <body> Début corps html <?php // // Une simple fonction permettant d'arrondir // // $chaine issu de AsSVG() arrondi selon $approx (1 à 8) // function assvg_with_php_round($chaine,$approx) { $table = array(); $table = explode(" ",$chaine); $chaine = ""; Début code php Déclaration fonction arrondi Déclaration tableau Remplissage tableau avec éléments de la $chaine Vidage $chaine for($iter_chaine_assvg=0;$iter_chaine_assvg<count($table); Début boucle passant en revue les élements de la chaîne $iter_chaine_assvg++) { $vec = $table[$iter_chaine_assvg]; Variable élément en cours de traitement if ((substr_count($vec, "cx=\"") > 0) || (substr_count($vec, Si $vec contient « cx= » ou « cy= » alors : "cy=\"") > 0)) { var. tableau de chaines recherchées $search = array("cx=\"","cy=\"","\""); var. Tableau de chaînes vides pour remplacement $replace = array("","",""); var. chaîne des valeurs arrondies $chaine_c = round(str_replace($search,$replace,$vec),$approx); var. chaîne temp reconstruisant la syntaxe svg $chaine_tmp = (substr_count($vec,"cx=\"")>=1)? "cx=\"".$chaine_c."\" ":"cy=\"".$chaine_c."\" "; sinon : } else var. chaîne temp pour valeur arrondie, si numérique { $chaine_tmp = (is_numeric($vec))? round($vec,$approx)." ":$vec." "; } $chaine = $chaine.$chaine_tmp; remplissage $chaine avec les valeurs remplacées } return $chaine; la fonction retourne la nouvelle $chaine } fin fonction // // Connexion au serveur // $db_handle = pg_connect("host=localhost dbname=testgis user='sigma' var. Handle de la connection PostgreSQL. password='sigma'"); // // Création du SVG // $my_svg = fopen("testgis.svg","w"); var. Handle du fichier testgis.svg, ouvert (ou créé si absent) en écriture. $colonne_geo="the_geom";// colonne géométrique de la table $table="regcom73";// la table en question var. nom de la colonne des géométries var. nom de la table $requete_extent = "SELECT xmin(extent(".$colonne_geo.")),ymin(extent (".$colonne_geo.")),xmax(extent(".$colonne_geo.")),ymax(extent (".$colonne_geo.")) FROM ".$table." where (lib_arr = 'ALBI');"; $pg_resultat_extent = pg_exec ($db_handle, $requete_extent); $xmin = pg_result($pg_resultat_extent,0,0); $ymin = pg_result($pg_resultat_extent,0,1); $xmax = pg_result($pg_resultat_extent,0,2); $ymax = pg_result($pg_resultat_extent,0,3); $width= abs($xmax-$xmin); $height= abs($ymax-$ymin); $rapport= $width / $height; $height_svg= "520"; $width_svg=intval($height_svg*$rapport); Requête pour les valeurs de l'extent selon la sélection de communes. Texte SQL de la requête fputs($my_svg,"<svg width='".$width_svg."px' height='".$height_svg."px' viewBox='".$xmin." ".-1*$ymax." ".$width." ".$height."'>\n"); Ecriture dans le fichier SVG de la balise ouvrante <svg> avec les dimensions du document SVG et de la viewBox. $sql_communes = "select assvg(the_geom), assvg(centroid(envelope (the_geom))), nom from ".$table." where (lib_arr = 'ALBI');"; $resultats_communes = pg_exec($db_handle,$sql_communes); Requête pour la géométrie des communes sélectionnées, texte de la requête. for($iter_communes=0;$iter_communes<pg_numrows($resultats_communes); $iter_communes++) { // ajout du path selon l'objet spatial en cours fputs($my_svg,"<path d='".assvg_with_php_round(pg_result ($resultats_communes,$iter_communes,0),1)."' fill='white' stroke='black' stroke-width='1'/>\n"); // point rouge au centre de la commune fputs($my_svg,"<circle ".assvg_with_php_round(pg_result ($resultats_communes,$iter_communes,1),1)." r='200' fill='black' stroke='black' stroke-width='1'/>\n"); // ajout du nom de la commune fputs($my_svg,"<text ".str_replace("c","",pg_result ($resultats_communes,$iter_communes,1))." fill='black' font-size='700' font-color='white'>".pg_result($resultats_communes,$iter_communes,2). "</text>\n"); } fputs($my_svg,"</svg>"); Boucle principale d'écriture des éléments vectoriels du fichier SVG. // fermeture du SVG fclose($my_svg); // fermeture de la connexion à PostgreSQL pg_close($db_handle); ?> </body> Exécutuon de la requête Récupération des résultats Calcul des dimensions de la couche SIG, du rapport largeur/hauteur et de la largeur du svg (en pixels) en homotéthie par rapport à une hauteur fixée à 520 pixels. Exécution de la requête. Ecriture des polygones des communes. Ecriture d'un petit cercle matérialisant le centroïde. Ecriture du nom de la commune à partir de ce centroïde. Ecriture de la balise fermante </svg> Fermeture du fichier SVG, écriture sur le serveur. Fermeture de la connection à la base PgSQL (aurait pu intervenir plus tôt) Fin corps page HTML <embed name='SVG' type='image/svg+xml' src='testgis.svg' <?php echo "width='".$width_svg."px' height='".$height_svg."px'";?>/> Intégration du fichier SVG dans la page, balise <embed> </html> Fin fichier HTML.