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.

Documents pareils