GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2

Documents pareils
IFT287 Exploitation de base de données relationnelles et orientées objet. Laboratoire Mon premier programme Java en Eclipse

Tutoriel d installation de Hibernate avec Eclipse

TP1 : Initiation à Java et Eclipse

OpenPaaS Le réseau social d'entreprise

DEVAKI NEXTOBJET PRESENTATION. Devaki Nextobjects est un projet sous license GNU/Public.

Création d une application JEE

Application web de gestion de comptes en banques

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Bases de Données relationnelles et leurs systèmes de Gestion

La base de données XML exist. A. Belaïd

BIRT (Business Intelligence and Reporting Tools)

Procédure d'installation de PostgreSQL pour Windows

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Création et Gestion des tables

Premiers Pas en Programmation Objet : les Classes et les Objets

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Programmer en JAVA. par Tama

Sommaire. Etablir une connexion avec une base de données distante sur PostGreSQL

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Les BASES de DONNEES dans WampServer

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Auto-évaluation Programmation en Java

Java DataBaseConnectivity

TD/TP PAC - Programmation n 3

Le langage SQL (première partie) c Olivier Caron

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

TD/TP PAC - Programmation n 3

Olivier Mondet

CREATION WEB DYNAMIQUE

1/ Présentation de SQL Server :

1. Installation d'un serveur d'application JBoss:

Compte Rendu d intégration d application

Plateforme PAYZEN. Définition de Web-services

TP Contraintes - Triggers

Utilisation du BDE pour la maintenance des fichiers DBF de l'application TopoCad:

TP1 : Initiation à Java et Eclipse

Encryptions, compression et partitionnement des données

PHP 5. La base de données MySql. A. Belaïd 1

1. Base de données SQLite

Système Normalisé de Gestion des Bibliothèques -SYNGEB : version Réseau-

Dossier Technique. Détail des modifications apportées à GRR. Détail des modifications apportées à GRR Le 17/07/2008. Page 1/10

BASES DE DONNEES TP POSTGRESQL

Corrigé des exercices sur les références

La gestion de la persistance avec Hibernate. Hibernate et la gestion de persistance. La gestion de la persistance (1/2) Introduction

Remote Method Invocation (RMI)

as Architecture des Systèmes d Information

Cours 1: Java et les objets

I4 : Bases de Données

COMPRENDRE LES DIFFERENTS TYPES DE CONNEXION LORS DE LA

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Environnements de développement (intégrés)

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Objectifs du TP : Initiation à Access

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Introduction à JDBC. Accès aux bases de données en Java

Compte-rendu de projet de Système de gestion de base de données

Les frameworks au coeur des applications web

Bases de données relationnelles

< Atelier 1 /> Démarrer une application web

GUIDE D INSTALLATION DE L APPLICATION GECOL SUR

Ingénierie Dirigée par les Modèles. Editeurs de modèles. (Eclipse Modeling Tools) Jean-Philippe Babau

Web Tier : déploiement de servlets

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Langage SQL : créer et interroger une base

TD/TP 1 Introduction au SDK d Android

Approche Contract First

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Définition des Webservices Ordre de paiement par . Version 1.0

Eclipse atelier Java

RMI le langage Java XII-1 JMF

TD3: tableaux avancées, première classe et chaînes

Access et Org.Base : mêmes objectifs? Description du thème : Création de grilles d écran pour une école de conduite.

Module 10 : Supplément 2

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Programmation par les Objets en Java

Plan du cours. Historique du langage Nouveautés de Java 7

Une introduction à Java

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Sélection du contrôleur

Présentation du module Base de données spatio-temporelles

Réplication E-maj Foreign Data Wrapper PostGIS PostgreSQL-f

UNIVERSITE DE CONSTANTINE 1 FACULTE DES SIENCES DE LA TECHNOLOGIE DEPARTEMENT D ELECTRONIQUE 3 ème année LMD ELECTRONIQUE MEDICALE

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Chapitre 10. Les interfaces Comparable et Comparator 1

ACTIVITÉ DE PROGRAMMATION

TP Programmation Java / JDBC / Oracle

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Plateforme PAYZEN. Intégration du module de paiement pour la plateforme Magento version 1.3.x.x. Paiement en plusieurs fois. Version 1.

Développement Web - Object Relational Mapping and Hibernate

Création d un service web avec NetBeans 5.5 et SJAS 9

Modélisation et Gestion des bases de données avec mysql workbench

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Utilisation d objets : String et ArrayList

Langage Java. Classe de première SI

Construire des plug-ins pour SAS Management Console SAS 9.1

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Transcription:

Institut Géographique National Laboratoire COGIT GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2 28 février 2007 Eric Grosso Résumé : Ce document a pour but de comprendre GeOxygene au travers de divers exercices et fait suite au document intitulé «GeOxygene : installation pas à pas». Tous les éléments nécessaires à la réalisation de ces exercices sont fournis avec le CD lors de la formation. GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2 1

Exercice 1 : Création d une structure de données à stocker A FAIRE : Créer une structure d accueil GeOxygene afin de pouvoir manipuler la classe «Salle» définie comme suit : Cette structure d accueil doit comprendre la table SALLE (manipulation du SGBD via SQL), le fichier correspondant au pont relationnel objet «repository_salle.xml» (manipulation de OJB via XML) et enfin la classe «objet» Java (manipulation Java). Tous les composants seront créés manuellement afin de comprendre les différents niveaux d implémentation de GeOxygene, à savoir PostgreSQL-PostGIS, OJB et Java. Par la suite, notamment lors du prochain exercice, la création se fera de manière automatique. Correction de l exercice 1 Au niveau du Système de Gestion de Bases de Données : Nous créons tout d abord la table correspondante à la classe «salle» grâce à la syntaxe SQL suivante : CREATE TABLE salle ( cogitid INTEGER PRIMARY KEY, nom VARCHAR(50), numero INTEGER, superficie DOUBLE PRECISION ); Nous créons ensuite la géométrie associée à cette table via la syntaxe SQL suivante : SELECT AddGeometrycolumn ('','salle','geom','-1','geometry',3); GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2 2

La syntaxe SQL peut s exécuter depuis pgadmin (Outils puis Editeurs de requêtes) ou depuis la vue Instant SQL dans la perspective dbedit (pour plus d informations, consultez le document «org.eclipse.platform.doc.user_3.0.1.pdf»). Au niveau du langage objet (Java) : Pour plus de détails, se référer au manuel utilisateur page 6. La classe Salle hérite de la classe FT_Feature ; de fait, elle hérite d un identifiant (id de type «int») et d une géométrie (geom de type «GM_Object»). Seuls restent à créer les trois autres attributs relatifs à la classe «Salle», à savoir «nom», «numero» et «superficie». A partir de la création de ces derniers, on crée soit manuellement soit dynamiquement (cf. «org.eclipse.platform.doc.user_3.0.1.pdf») les Getters et Setters correspondants. La classe «Salle» s écrit comme suit : package fr.ign.cogit.geoxygene.user.exercice; import fr.ign.cogit.geoxygene.feature.ft_feature; public class Salle extends FT_Feature{ protected String nom; public String getnom() {return nom;} public void setnom(string nom) {this.nom = nom;} protected int numero; public int getnumero() {return numero;} public void setnumero(int numero) {this.numero = numero;} } protected double superficie; public double getsuperficie() {return superficie;} public void setsuperficie(double superficie) {this.superficie = superficie;} Au niveau du pont relationnel-objet : Pour plus de détails, se référer au manuel utilisateur page 6. Il reste enfin à créer le pont relationnel-objet, i.e. le fichier de mapping OJB. Pour ce faire, il est nécessaire d écrire la correspondance entre une classe objet (Java) et une table du SGBD : <class-descriptor class="cheminclassejava" table="nomtable" > et la correspondence entre chaque attribut de cette classe objet et de cette table en précisant le type de l attribut (INTEGER, DOUBLE, VARCHAR, etc.) : <field-descriptor name="nomattributclassejava" column="nomattributtable" jdbc-type="type" /> GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2 3

Ainsi, dans le présent exemple, nous créons le fichier de mapping «repository_salle.xml» comme suit : <class-descriptor class=" fr.ign.cogit.geoxygene.user.exercice.salle" table="salle" > <field-descriptor name="id" column="cogitid" jdbc-type="integer" primarykey="true" autoincrement="true"/> <field-descriptor name="nom" column="nom" jdbc-type="varchar" /> <field-descriptor name="numero" column="numero" jdbc-type="integer" /> <field-descriptor name="superficie" column="superficie" jdbc-type="double" /> <field-descriptor name="geom" column="geom" jdbc-type="struct" conversion="fr.ign.cogit.geoxygene.datatools.ojb.geomgeoxygene2dbms" /> </class-descriptor> Remarque : Le type «STRUCT» est utilisé dans le cadre d un attribut dont le type est défini par l utilisateur, comme par exemple ici avec la géométrie. Il est de fait nécessaire de fournir en supplément un convertisseur, ici la classe «fr.ign.cogit.geoxygene.datatools.ojb.geomgeoxygene2dbms». Enfin, afin que le système prenne en compte le fichier de mapping repository_salle.xml, il est nécessaire d ajouter les informations suivantes dans le fichier «repository.xml», fichier qui centralise les informations relatives au pont relationnel-objet. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE descriptor-repository PUBLIC "-//Apache Software Foundation//DTD OJB Repository//EN" "repository.dtd" [ <!ENTITY database SYSTEM "repository_database.xml"> <!ENTITY internal SYSTEM "repository_internal.xml"> <!ENTITY geo SYSTEM "repository_geo.xml"> <!ENTITY dataset SYSTEM "repository_dataset.xml"> <!ENTITY salle SYSTEM "repository_salle.xml"> ]> <descriptor-repository version="1.0" isolation-level="read-uncommitted" proxy-prefetching-limit="50"> <!-- parametres de la connection au SGBD--> &database; <!-- exemple classes geographiques --> <!-- &geo; --> &salle; <!-- jeux de donnees --> &dataset; <!-- fichier de mapping internes a OJB INDISPENSABLE --> &internal; </descriptor-repository> GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2 4

Exercice 2 : Chargement de données sous GeOxygene à partir de fichiers au format «SIG» : utilisation de la commande «shp2pgsql» de PostgreSQL-PostGIS et de la console GeOxygene A FAIRE : Charger au sein du SGBD PostgreSQL-PostGIS des données géographiques (comportant une géométrie) contenues dans un fichier au format ESRI Shape, à l aide de la commande «shp2pgsql» (pour plus de détails, se référer au document «GeOxygene : installation pas à pas»). Information : Le fichier de données géographiques a utilisé est le fichier dep_france_dom.shp contenu dans le dossier «donnees/france» fourni avec le CD de la formation. Le nom utilisé pour la table sera «departements». Utiliser ensuite la console GeOxygene afin de générer automatiquement les fichiers de mapping et java correspondants. Cet exercice est utile dans la compréhension du chargement de données et de la console GeOxygene. Correction de l exercice 2 Chargement des données au sein de PostgreSQL-PostGIS : Prérequis : copier le répertoire «donnees» fourni avec le CD dans C:\. On suppose qu une base nommée «postgres» a été créée dans le SGBD PostgreSQL-PostGIS et que les fonctions liées à PostGIS ont été activées pour cette dernière. Si ce n est pas le cas, se référer à la partie «Chargement de données au format shape sous PostgreSQL-PostGIS» du document «GeOxygene : installation pas à pas». Le chargement de données s effectue comme suit : - ouvrir une console en tant qu utilisateur postgres (démarrer Programmes Accessoires Invites de commandes -). Pour ce faire, ouvrir une console puis taper : runas /user:postgres cmd taper le mot de passe de l utilisateur postgres, i.e. postgres. - taper ensuite la commande suivante dans la console ainsi ouverte : shp2pgsql -g geom -D -I C:\donnees\france\dep_france_dom.shp departements psql postgres Rappel de la commande générique utilisée : shp2pgsql -g geom -D -I shapefile nom_table psql nom_base_donnees l option «g» avec comme arguement «geom» spécifie le nom de la colonne géométrique (par défaut «the_geom»). GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2 5

Pour plus d informations sur les différentes options de la commande «shp2pgsql», taper simplement «shp2pgsql» dans une console. La table «departements» est créée et le rapport suivant apparaît : Utilisation de la console GeOxygene - génération automatique des fichiers de mapping et java correspondants : Le lancement de la console GeOxygene s effectue depuis la classe Java relative à la console située dans le package fr.ign.cogit.geoxygene.appli, comme illustré cidessous : Information : pour lancer l application depuis Eclipse, cliquer sur le bouton droit de la souris lorsque le curseur est sur la classe Console.java puis choisir «Run As Java Application». GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2 6

La console apparaît. Cliquer ensuite sur «SQL to Java» : Sélectionner la table que vous voulez charger sous GeOxygene, ici «departements» : GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2 7

Cliquer sur OK puis remplir de la manière suivante (changer «eric» par votre nom) : Cliquer sur OK. La console retourne ce message : Nous pouvons dors et déjà constater ce qui a été généré par la console : - Fichier de mapping (mapping.ojb1.eric.repository_departements.xml) : GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2 8

- Classe Java (fr.ign.cogit.geoxygene.user.exercice.departements ) : Il faut maintenant faire pointer le fichier central des fichiers de mapping (repository.xml) vers le fichier de mapping que nous avons généré, à savoir «repository_departements.xml» : GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2 9

Générer ensuite les identifiants COGIT (COGITID) à partir de la console (Manage Data) en choisissant la table que vous voulez traiter, ici «departements»: Le chargement des données est maintenant terminé. GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2 10

A FAIRE : Exercice 3 : Visualisation des données Charger les données de l exercice précédent et les visualiser tout d abord avec le visualisateur intégré de GeOxygene puis sous Jump ou OpenJump (via la création d un menu). Correction de l exercice 3 Visualisation à l aide du visualisateur GeOxygene : Créer une classe Java dans le package fr.ign.cogit.appli.exercice.visu que nous nommerons «VisuGeOxygene» : package fr.ign.cogit.geoxygene.user.exercice.visu; import fr.ign.cogit.geoxygene.user.exerice.departements; import fr.ign.cogit.geoxygene.datatools.geodatabase; import fr.ign.cogit.geoxygene.datatools.ojb.geodatabaseojbfactory; import fr.ign.cogit.geoxygene.feature.ft_featurecollection; import fr.ign.cogit.geoxygene.util.viewer.objectviewer; /**Classe qui permet la visualisation de la carte des départements français */ public class VisuGeOxygene { /**Méthode qui lance l'application*/ public static void main(string[] args) { //création d une nouvelle connexion Geodatabase geodb = GeodatabaseOjbFactory.newInstance(); //chargement des données de la classe donnees.eric.exercice.departements FT_FeatureCollection ftfc = geodb.loadallfeatures(departements.class); } } //affichage des données dans le visualisateur GeOxygene ObjectViewer viewer = new ObjectViewer(); viewer.addfeaturecollection(ftfc, "departements francais"); Lancer ensuite l application depuis Eclipse issue de la classe créée (cliquer sur le bouton droit de la souris lorsque le curseur est sur la classe java puis choisir «Run As Java Application»). S affiche alors : GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2 11

Visualisation à l aide de JUMP : Créer une classe Java dans le package fr.ign.cogit.appli.exercice.visu que nous nommerons «VisuJump» : package fr.ign.cogit.geoxygene.user.exercice.visu; import java.awt.color; import com.vividsolutions.jump.workbench.plugin.plugincontext; import com.vividsolutions.jump.workbench.ui.plugin.featureinfoplugin; import fr.ign.cogit.geoxygene.user.exercice.departements; import fr.ign.cogit.appli.commun.interfacejump.utiljump; import fr.ign.cogit.geoxygene.datatools.geodatabase; import fr.ign.cogit.geoxygene.datatools.ojb.geodatabaseojbfactory; import fr.ign.cogit.geoxygene.feature.ft_featurecollection; public class VisuJump extends extends FeatureInfoPlugIn { /**initialisation de l'interface dans le menu de JUMP : ajout d'un menu * GeOxygene/Departements/Affichage*/ public void initialize (PlugInContext context) throws Exception { context.getfeatureinstaller().addmainmenuitem(this,new String[]{"GeOxygene","Departements"}, "Affichage", false, null, null); } /**partie du code relative à l exécution*/ public boolean execute(plugincontext context) throws Exception { //création d une nouvelle connexion Geodatabase geodb = GeodatabaseOjbFactory.newInstance(); //chargement des données de la classe donnees.eric.exercice.departements FT_FeatureCollection ftfc = geodb.loadallfeatures(departements.class); //affichage des données en rose sous Jump UtilJump.afficheCollection(context, ftfc, "France","Départements",Color.pink); } } return true; Nous remarquons que ce fichier se compose de deux parties. La première («unitialize») est relative à l initialisation d un menu dans JUMP (GeOxygene Departements Affichage), la seconde au programme qui sera lancé à l aide du menu créé. Afin que cette classe soit prise en compte au lancement de JUMP, il est nécessaire d ajouter la ligne suivante dans le fichier «workbench-properties.xml» relatif à JUMP (répertoire JUMP/bin) : <plug-in>fr.ign.cogit.geoxygene.user.exercice.visu.visujump</plug-in> GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2 12

Lancer ensuite JUMP et cliquer sur le menu «GeOxygene Departements Affichage». GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2 13

A FAIRE : Exercice 4 : Création et manipulation de données Créer un attribut supplémentaire nommé «superficie» pour les départements et remplir cet attribut de manière persistante dans le SGBD. Correction de l exercice 4 Au niveau du Système de Gestion de Bases de Données : Nous créons tout d abord la colonne «superficie» correspondant à la table «departements» grâce à la syntaxe SQL suivante : ALTER TABLE departements add superficie DOUBLE PRECISION ; La syntaxe SQL peut s exécuter depuis pgadmin (Outils puis Editeurs de requêtes) ou depuis la vue Instant SQL dans la perspective dbedit (pour plus d informations, consultez le document «org.eclipse.platform.doc.user_3.0.1.pdf»). Il est également possible de créer cette même colonne à l aide des outils interactifs proposés par pgadmin. Pour ce faire, procéder comme suit : - clic droit sur la table «departements» puis «Ajouter un objet Ajouter une colonne» : GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2 14

- l interface suivante apparaît. Remplir comme ci-dessous puis cliquer sur «OK» : Remarque : Les attributs sont à écrire de préférence en caractère alpha et en minuscules. Au niveau du langage objet (Java) : Il est maintenant nécessaire d ajouter l attribut «superficie» au niveau objet. Pour ce faire, ajouter les lignes de code suivantes dans la classe «donnees.user.exercice.departements». protected double superficie; public double getsuperficie() {return superficie;} public void setsuperficie(double superficie) {this.superficie = superficie;} Au niveau du pont relationnel-objet : Il reste enfin à ajouter la correspondance dans le fichier de mapping OJB «repository_departements.xml». Pour ce faire, ajouter la ligne suivante : <field-descriptor name="superficie" column=" superficie " jdbc-type="double" /> Dans le cas présent, il est inutile d ajouter quoique ce soit dans le fichier de mapping «repository.xml» puisque «repository_departements.xml» est déjà pris en compte. GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2 15

Remarque importante : Lors de la création de la table «departements», une contrainte sur la géométrie des objets est créée : CONSTRAINT enforce_geotype_geom CHECK (geometrytype(geom) = 'MULTIPOLYGON'::text OR geom IS NULL) Cette contrainte oblige les objets de la table «departements» à avoir une géométrie de type «MULTIPOLYGON» ou une géométrie nulle. Or certains objets créés sont de type «POLYGON» et ne vérifient donc pas la contrainte. Il s agit d un bug dans la commande «shp2pgsql». Ce dernier a été identifié et est en passe d être résolu dans les prochaines versions. Dès lors que nous voulons modifier la table, il devient obligatoire soit de supprimer cette contrainte, soit de la rendre plus «souple», en donnant la possibilité aux objets d être soit de type géométrique «MULTIPOLYGON» soit de type «POLYGON». Nous faisons ici le choix de la seconde solution et de fait, exécutons la requête suivante suivante : ALTER TABLE departements DROP CONSTRAINT enforce_geotype_geom; ALTER TABLE departements ADD CONSTRAINT enforce_geotype_geom CHECK (geometrytype(geom) = 'POLYGON'::text OR geometrytype(geom) = 'MULTIPOLYGON'::text OR geom IS NULL); Créons maintenant une classe permettant de calculer la superficie des départements et de remplir la colonne «superficie» de la table «departements» : package fr.ign.cogit.geoxygene.user.exercice.visu; import java.util.iterator; import fr.ign.cogit.geoxygene.user.exercice.departements; import fr.ign.cogit.geoxygene.datatools.geodatabase; import fr.ign.cogit.geoxygene.datatools.ojb.geodatabaseojbfactory; import fr.ign.cogit.geoxygene.feature.ft_featurecollection; public class CalculSuperficie { public static void main(string[] args) { //définition des variables Departements departement; //création d une nouvelle connexion Geodatabase geodb = GeodatabaseOjbFactory.newInstance(); //ouverture d'une transaction relative à la connexion geodb.begin(); //chargement des données de la classe donnees.eric.exercice.departements FT_FeatureCollection ftfc = geodb.loadallfeatures(departements.class); //calcul et instanciation de l'attribut superficie Iterator<Departements> it = ftfc.getelements().iterator(); while(it.hasnext()){ GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2 16

} departement = it.next(); departement.setsuperficie(departement.getgeom().area()); } } //commit et ferme la transaction geodb.commit(); Lancer l application et constater le résultat en visualisant la table «departements» : GeOxygene : travaux pratiques Exercices pour la version PostGIS version 1.2 17