PostGIS
Cours et Support de TP
10/06/2015
Sommaire
1 Prsentation..............................................................................................................................3
1.1 Prsentation du TP............................................................................................................3
1.2 Rendu attendu...................................................................................................................3
1.3 Mthode............................................................................................................................4
1.4 Prrequis............................................................................................................................4
1.5 Matriel ............................................................................................................................4
1.6 Donnes.............................................................................................................................5
1.7 PgAdmin...........................................................................................................................5
2 Structuration de la base et insertion des donnes.....................................................................6
2.1 Dcouverte des donnes....................................................................................................6
2.2 Construction dune table...................................................................................................7
2.2.1 Modle physique des donnes................................................................................................................7
2.2.2 Construction de la table.........................................................................................................................7
5.2 Sous-requtes..................................................................................................................15
6 Requtes spatiales..................................................................................................................16
6.1 Les diffrents types de gomtrie...................................................................................16
6.2 Gomtries valides et invalides.......................................................................................16
6.3 Jointures gomtriques....................................................................................................17
6.3.1 Jointures dans une requte SELECT....................................................................................................17
6.3.2 Jointures dans une requte UPDATE...................................................................................................19
6.4 Autojointure....................................................................................................................20
6.5 Autojointure et sous-requte ..........................................................................................20
7 Scripts PL/pgSQL..................................................................................................................21
8 Les index................................................................................................................................22
9 Webographie ..........................................................................................................................25
9.1 PostGreSQL....................................................................................................................25
9.2 PostGIS...........................................................................................................................25
10 A rendre................................................................................................................................26
10/06/2015
1 Prsentation
1.1 Prsentation du TP
PostGreSQL est un SGBD (Systme de Gestion de Base de Donnes) libre de trs bonne
qualit. De nombreuses applications professionnelles sont construites sur PostGreSQL.
PostGIS est une surcouche de PostGresSQL qui permet de grer la gomtrie.
Lobjectif pdagogique de ce TP est :
- de rviser les fonctions de bases des SGBD
- de vous faire dcouvrir PostGIS
- de vous amener lautonomie dans la dcouverte dun SGBD.
Les notions et techniques tudies sont :
- la connexion PostgreSQL
- le format WKT
- lintgration dans une table de fichiers shape
- les requtes smantiques et spatiales
- les jointures spatiales
- Le langage pl/pgSQL
- lutilisation des index
- laffichage des donnes en KML et en SVG
Dans le cadre de ce TP, nous allons travailler avec des donnes sismologiques dpicentre de
tremblements de terre, reprsents par des points. Nous croiserons ces donnes avec les
donnes surfaciques des surfaces terrestres du globe.
Si la rponse une question dborde de lespace qui lui est rserv, nhsitez pas continuer
au verso, en indiquant le passage au verso avec une flche lisible.
Les autres questions et les manipulations du logiciel sont indiques ainsi :
Ceci est une instruction qui ne demande pas de rendu. Mais si vous la ngligez, vous
narriverez peut-tre pas rpondre aux questions suivantes.
10/06/2015
Mme lorsque lenseignant ne demande pas que le travail lui soit rendu, il est nanmoins
conseill, pour une bonne mmorisation du cours, dcrire les rsultats lorsquils sont
demands.
1.3 Mthode
Ce TP alterne les phases o vous tes guids pas pas dans la manipulation de linterface
avec des phases qui vous mnent lautonomie. Dans cet objectif, vous devez penser aller
chercher linformation dans les documentations techniques disponibles sur internet.
Le moteur de recherche Google convient trs bien cet objectif. Si vous cherchez par
exemple de linformation sur les flageoises, une requte flageoise+tutorial vous permettra
de cibler les documents dinitiation aux flageoises, alors quune requte
flageoise+reference vous orientera efficacement vers les normes, les documentations
dtailles et les descriptions dinterface des flageoises.
1.4 Prrequis
Les prrequis de ce TP sont une connaissance pralable de PHP et dau moins un SGBD. Il
faut savoir utiliser un diteur de texte.
La connaissance de QGIS est souhaite.
1.5 Matriel
Pour mettre en uvre ce TP, il faut avoir accs un poste informatique quip :
- dun serveur postGIS avec pgAdmin,
- dun serveur web local quip de PHP, avec les extensions pgsql.
- dun navigateur, de prfrence Firefox
- dune connexion internet, pour avoir accs la documentation en ligne
- de QGIS, pour visualiser les donnes
Un bon diteur de texte, par exemple notepad++, est par ailleurs utile.
Pour vrifier la disponibilit de postGIS :
Ouvrez pgAdmin
Dans la colonne gauche de pgAdmin, vous trouvez un explorateur qui vous permet de plier et
dplier les diffrentes composantes de votre BD. Un clic droit sur un lment vous permet
daccder aux oprations autorises sur cet lment.
Dpliez la racine bases de donnes en cliquant sur la petite croix. Vrifiez que les
bases postgis et template_postgis sont prsentes. Dpliez la base postgis, dpliez
schmas , dpliez le schma public. pgAdmin vous montre alors quil y a deux
tables dans cette base.
Dpliez les tables, dpliez leurs colonnes, dpliez leurs contraintes.
10/06/2015
Ces deux tables, geometry_columns et spatial_ref_sys, sont les deux tables de gestion de
PostGIS.
1.6 Donnes
Ce TP est accompagn des donnes qui permettent de le mettre en uvre. Ces donnes sont
disponibles sur internet, ou drives de donnes disponibles sur internet :
le fichier CMT des tremblements de terre :
http://www.globalcmt.org/CMTfiles.html
le fichier des limites administratives sur ltendue du globe :
http://www.gadm.org/world
Il est recommand dutiliser les donnes telles quelles sont livres avec le TP.
1.7 PgAdmin
Dans linterface de pgAdmin, il y a trois boutons quon utilise trs souvent, et que je vous
prsente maintenant :
Le premier de ces boutons est lditeur de requte SQL. Il permet dcrire et de faire tourner
du code SQL sur une base. Le bouton nest actif que lorsquune base est slectionne.
Les deuxime et troisime boutons ne sont actifs que si une table est slectionne. Le
deuxime bouton permet dafficher toutes les donnes de la table sous la forme dun tableau.
Le troisime bouton permet de saisir un filtre sur la table pour nen afficher quun nombre
rduit de lignes (une restriction).
Lditeur de requte
Regardons plus attentivement lditeur de requte, en cliquant sur le premier des trois boutons
dcrits ci-dessus (le bouton SQL de pgAdmin). Lditeur ressemble ceci :
10/06/2015
Le cadre en haut gauche permet de taper la requte SQL. Le bouton constitu dun triangle
vert excute la requte. Le cadre en bas permet de lire la rponse la requte, et les erreurs
ventuelles.
Tapez le code SQL suivant : SELECT 2+2, puis cliquez sur le triangle vert.
Tapez le code SQL suivant : SELECT * FROM geometry_columns, et vrifiez que
cette table est vide.
Tapez le code SQL suivant : SELECT * FROM spatial_ref_sys, vrifiez que cette
table est peuple.
Tapez le code SQL suivant : SELECT * FROM spatial_ref_sys WHERE srid=4326.
On trouve la rfrence la projection plate carre que nous utiliserons dans le cours de
ce TP.
Tapez le code SQL suivant :
SELECT * FROM spatial_ref_sys WHERE srtext LIKE '%Douala%'.
Cette requte permet de trouver toutes les projections dont la description contient le
mot Douala . La projection actuellement utilise sur le Cameroun y est-elle
rfrence ?
10/06/2015
Regardez rapidement les donnes (la premire ligne), et la description du format .ndk.
10/06/2015
Si vous ne saisissez pas de clef primaire, un message vous avertit que vous navez pas de clef
primaire sur votre table, ce qui limitera les oprations que vous pouvez faire avec. En
particulier avec pgAdmin, vous ne pourrez pas modifier les donnes en table. Cest pour cette
raison que nous avons cr une colonne didentifiant.
Dans une base avec plusieurs tables et des liens explicites entre tables, lidentifiant sert de
support aux liens entre tables, et garantit lintgrit de linformation porte par le lien.
Plus prcisment, si la colonne enseignant de la table cours contient Emmanuel Fritsch et quil y a plusieurs
Emmanuel Fritsch dans la table enseignant, on introduit une ambigut dans la base. En revanche, si la colonne
enseignant de la table des cours contient lidentifiant de lenseignant, cette colonne pointe vers lenseignant de
manire fiable et sans ambigut.
Le type SERIAL
Quel est donc ce type SERIAL que nous avons affect la colonne id ?
Le type SERIAL est un raccourci qui permet en une seule dclaration :
- de crer une colonne de type integer
- de lui ajouter, en valeur par dfaut, une valeur incrmentale
- de crer le compteur spcifique qui va grer cet incrment. Ce compteur sappelle une
squence (du latin sequor, suivre).
Vrifiez que la squence a t cre.
Vrifiez que la valeur par dfaut de la colonne id est la valeur du compteur
incrmente.
Question 2 Trouvez dans pgAdmin linstruction SQL qui dit que la valeur par dfaut de la colonne id
est la valeur du compteur incrmente. Recopiez-la.
Elapsed Time
10/06/2015
Attention, il arrive que le programme sarrte avant davoir lu toutes les donnes. En effet,
pour des raisons de scurit, le serveur arrte les scripts qui durent trop longtemps. Par dfaut,
la dure maximale dun script est de 30 secondes.
Le serveur affiche alors une erreur elapsed time , ou un message quivalent. Pour rsoudre
ce problme ventuel, vous devez allonger la dure maximale accorde chaque script.
Mme si votre script a tourn en moins de 30 secondes, je vous demande de faire lexercice
qui consiste trouver comment rgler ce problme.
trouvez comment allonger la dure maximale du script PHP sur votre serveur local (la
solution est srement sur internet).
Question 3 Dcrivez comment vous allongez la dure maximale du script PHP sur votre serveur local.
Donnez la requte google (ou autre) qui vous a conduit au rsultat.
10
Dans la suite du TP, nous travaillerons principalement avec le type geometry. Nous
reviendrons sur le type point la fin du TP, pour montrer que le type geometry lui est
largement suprieur.
avec :
- Le SRID est un identifiant de la projection utilise. Sauf prcision contraire, nous
nutiliserons dans ce TP que la projection plate carre, dont lidentifiant est 4326.
- La dimension est 2 ou 3, selon que les donnes sont en 2D ou en 3D. Ici, la dimension
sera toujours 2.
Il est possible de crer une colonne de type geometry directement, comme on a cr la
colonne de type point. Lintrt de passer par la fonction AddGeometryColumn est de mettre
jour la table geometry_columns. Cette dernire est utilise par certaines applications qui
suivent les recommandations de lOpen GIS Consortium (OGC).
La table geometry_columns stocke les mta-donnes sur les colonnes de type geometry. Ces
mta-donnes sont requises par certaines applications qui suivent les recommandations de
lOpenGIS.
Dans lditeur SQL de PgAdmin, crivez la commande SQL en utilisant la fonction
AddGeometryColumn pour crer geom, une colonne de type geometry sur la table tdt.
Avec pgAdmin, crez une colonne geom2 de type geometry.
Lisez le contenu de la table geometry_columns. Vrifiez que geom est rfrence, et
que geom2 est absente.
Supprimez la colonne geom2.
10/06/2015
11
Cette instruction ( taper sur une seule ligne) prend en entre le fichier MondeGadm.shp et
crit les instructions qui vont permettre de construire la table monde. Ces instructions sont
enregistres dans le fichier monde.sql.
Il faut ensuite intgrer ce fichier monde.sql dans la base tremblement_de_terre :
psql -d tremblement_de_terre -h localhost -U postgres -f monde.sql
10/06/2015
12
2- Et surtout, on na pas besoin dextraire toutes les lignes (tous les objets stocks dans la
table). On donne les conditions que doivent remplir les objets extraire :
SELECT id, magnitude, geom FROM table WHERE magnitude>5.5
10/06/2015
13
4 Visualisation
4.1 Visualisation sous QGIS
Ouvrez QGIS.
Dans QGIS, ouvrez une connexion avec la base de donnes (ajouter une couche /
couche PostGIS).
Choisissez les tables et les colonnes que vous voulez afficher.
Contrlez que les donnes sont cohrentes (accumulation des tremblements de terre
sur les limites de faille, par exemple sur lIndonsie et la Cordillre des Andes).
Si les donnes ne sont pas cohrentes, cherchez la source du problme.
Limitez laffichage des donnes aux seuls tremblements de terre de magnitude
suprieure 5.5.
5 Requtes complexes
5.1 Les vues dans PostGreSQL
Attention, attention : une vue SQL est un concept purement SGBD, qui na rien voir avec la
visualisation des donnes.
10/06/2015
14
Dans QGIS, il nest pas possible de limiter laffichage des donnes aux 200 tremblements de
terre de plus forte magnitude, en utilisant ces clauses ORDER BY LIMIT . Pour faire cette
opration, il faut dfinir une vue dans PostGIS, et appeler cette vue dans QGIS.
Une vue, en SQL, est une table virtuelle on peut faire sur cette table des
requtes SELECT, mais pas dinsertion ni de mise jour (requtes INSERT et
UPDATE).
Derrire cette table virtuelle se cache une requte qui permet daccder aux
donnes qui se trouvent dans les vraies tables de la base.
5.1.2 Comment crer une vue ?
Pour crer une vue :
- dpliez le schma public de votre BD,
- clic droit sur vue , puis ajouter une vue ,
- dans longlet proprit , donnez-lui un nom (comme un nom de table),
- dans longlet dfinition , entrez la requte SQL qui correspond cette vue (requte
que vous aurez teste au pralable),
- cliquez sur OK.
La vue est cre. Vous pouvez la tester.
Crez la vue qui correspond aux seuls tremblements de terre de magnitude suprieure
5.5.
Crez la vue tdt_magni_sup qui correspond aux 200 tremblements de terre de plus
forte magnitude.
Avec la fonction count(), vrifiez quil y a bien 200 tremblements de terre dans cette
vue.
Ecrivez la requte SELECT qui dtermine la magnitude du plus faible tremblement de
terre de la vue.
Question 10 Recopiez la requte qui cre la vue correspondant aux 200 tremblements de terre de plus
forte magnitude.
Question 11 Recopiez la requte qui dtermine la magnitude du plus faible tremblement de terre de cette
vue.
5.2 Sous-requtes
Dans cette partie, nous allons essayer de trouver la requte qui rpond la questions suivante :
quelle est le minimum, le maximum et la moyenne des magnitudes pour les 8000
tremblements de terre les plus profonds.
Pour cela, nous utiliserons les sous-requtes.
Une sous-requte est une requte dont le rsultat est utilis dans une autre
requte (la requte principale). Le rsultat de la sous-requte est considr
comme une table.
10/06/2015
15
6 Requtes spatiales
10/06/2015
16
17
Attention :
- tdt_magni_sup nest pas une table, cest une vue, mais tant quon reste dans une
requte SELECT, les vues sont utilises comme des tables.
- En gnral, on nest pas oblig de prfixer les noms de colonnes avec les noms de leur
table, mais cela facilite la lisibilit du code. Il est donc recommand de le faire.
- Il y a un cas o on est oblig de prfixer les noms de colonnes, cest lorsque le nom de
colonne apparat dans les deux tables. Cest courant avec les colonnes nom, id, et gid,
mais aussi proprietaire, date, etc.
- Dans le cas gnral, on nest pas oblig de mettre un alias sur les tables.
- Il y a un cas o on est oblig de mettre un alias, cest le cas de lauto-jointure, c'est-dire lorsque la table figure deux fois dans la jointure. Nous verrons ce cas un peu plus
loin.
- Lorsquon met un alias sur une table, on na plus le droit dutiliser le nom de la table :
dans toute la requte, lalias doit remplacer le nom de la table.
Revenons notre requte :
SELECT t.id, t.geom, t.magnitude
FROM tdt_magni_sup AS t, monde AS m
WHERE within( t.geom, m.the_geom )
La plupart des tudiants qui ne savent pas ce quest une jointure trouvent ici un rsultat
aberrant, et sen tonnent. Comment est calcule la jointure ?
10/06/2015
18
Pour la premire requte, le SGBD considre tous les couples (tremblement de terre ;
contour de pays) et il ne garde que ceux pour lequel le tremblement de terre est
lintrieur du pays. le SGBD ne retient que les tremblements de terre associs un
contour, et comme les contours de pays sont disjoints, chaque tremblement de terre
nest retenu quune seule fois.
Pour la deuxime requte, si vous remplacez la condition within() par une condition
NOT within, le SGBD va considrer tous les couples. Or, pour chaque tremblement de
terre, on va trouver un grand nombre de pays dans lequel ce tremblement de terre ne se
trouve pas : chaque fois, le couple (tremblement de terre ; contour de pays) qui
correspond ce critre sera retenu.
Dans la table tdt, ajoutez une colonne terrestre, de type boolen (boolean).
Faites tourner la requte UPDATE ci-dessus.
Ecrivez et faites tourner la requte UPDATE qui va mettre false les valeurs qui ne
sont pas dj true.
Nous allons nous intresser maintenant aux tremblements de terre qui se trouvent en mer,
mais une distance rduite du rivage, par exemple moins de 10 km. Nous disposons de deux
mthodes pour cela :
- soit nous appliquons un buffer de 0.1 (environ 10 kilomtres) sur les terres merges,
puis nous slectionnons les tremblements de terre qui appartiennent ce buffer. Pour
appliquer le buffer, il faut au pralable avoir regroup toutes les terres merges en
une seule gomtrie.
- soit nous utilisons la fonction dwithin() qui correspond exactement notre demande.
cherchez la documentation de dwithin(), crivez la requte SELECT, puis testez l.
XXX la documentation est ambigu quant lunit utilise dans le calcul. Inventez une
manipulation qui fixe cette ambigut.
10/06/2015
19
6.4 Autojointure
Notre objectif dans cette partie est de construire le contour des zones de forte sismicit. Une
zone sismique est une zone o il y a beaucoup de tremblement de terre. Nous allons la
calculer de la manire suivante :
- Nous allons isoler les tremblements de terre qui ont plus de N tremblements de terre
autour deux, dans un rayons de R kilomtres.
- Autour de ces tremblements de terre, nous allons tracer la zone des points qui sont
moins de R2 kilomtres.
Lune des difficults, que nous nallons pas traiter ici, tient la projection que nous utilisons :
le calcul de la distance sur la sphre ne passe pas par la simple somme des carrs des
coordonnes angulaires. Les distances que nous allons utiliser sont donc fausses, et ce
dautant plus quon slve en latitude.
Pour dtecter les tremblements de terre qui sont proches dautres tremblements de terre, nous
devons croiser la table tdt avec elle-mme. La syntaxe ressemble ceci :
SELECT t1.id, t1.geom, t1.magnitude
FROM tdt AS t1, tdt AS t2
WHERE st_distance(t1.geom, t2.geom)<0.8
Cette requte est une auto-jointure. Ici, lalias de table est obligatoire.
Ne testez pas cette requte : elle est vraiment trs coteuse en temps.
Pourquoi est-elle coteuse en temps ?
Pour ne pas avoir recalculer sans cesse cette requte, nous allons stocker son rsultat dans
une colonne possede_voisin, qui indiquera si le tremblement de terre est isol ou pas.
Crez la colonne possede_voisin, de type boolen.
Rcrivez la requte ci-dessus pour en faire une requte de mise jour de la colonne
possede_voisin.
Question 14 Recopiez cette requte de mise jour.
Si vous voulez tester le temps dexcution de cette requte, prvoyez une pause djeuner,
voire une petite sieste.
10/06/2015
20
Pour compter le nombre de voisins, nous allons maintenant utiliser la technique des sousrequtes :
UPDATE tremblementdeterre AS t3
SET nbre_voisins=nbre
FROM (
SELECT t1.id, count(*) AS nbre
FROM tremblementdeterre AS t1, tremblementdeterre AS t2
WHERE ST_DWithin(t1.geom, t2.geom, 2)
GROUP BY t1.id
) AS t4
WHERE t3.id=t4.id
Crez dans la table tdt la colonne qui permet de stocker le nombre de voisins de
chaque tremblement de terre
Question 15 En vous aidant de la documentation, analysez les diffrents termes de la requte prcdente
pour en donner la signification. Que reprsente t4 ?
7 Scripts PL/pgSQL
Dans la premire partie de ce TP, nous avons utilis un script PHP pour mettre en forme des
donnes dans la base. Cette mthode, parce quelle implique un change systmatique des
donnes entre le script et le SGBD, est coteuse en temps. Il est plus intressant de faire
tourner un script directement dans le SGBD.
10/06/2015
21
Ajoutez la fin du code les instructions qui permettent de remplir les colonnes pt et
geom avec les valeurs qui se trouvent dans les colonnes latitude et longitude.
Pour appeler cette fonction qui ne renvoie pas de rsultat, on utilise la syntaxe suivante :
SELECT ajoute_valeurs_aleatoires(3) ;
8 Les index
Nous commenons par deux mises en garde :
10/06/2015
22
crivez une requte qui permette de slectionner les tremblements de terre qui ont eu
lieu entre 10 et 11 degrs de latitude et entre 10 et 11 degrs de longitude.
Ouvrez une nouvelle fentre de requte SQL. A laide de la documentation de
postGreSQL, crivez la mme requte, mais en faisant porter la slection sur la
colonne pt de type point.
Ouvrez une troisime fentre de requte SQL. A laide de la documentation de
postGIS, crivez la mme requte, mais en faisant porter la slection sur la colonne
geom de type geometry. Vous DEVEZ utiliser la fonction geomFromText.
Note pour le prof : la syntaxe WHERE geom && 'WKT' semble valide, mais plante lorsquon
modifie les index. A claircir.
Question 17 - Lorsque les trois requtes fonctionnent correctement, notez les conservez aussi les trois
fentres avec les trois requtes (elles vont servir tout de suite).
Ecrivez EXPLAIN au dbut dune des trois requtes. Relancez. Regardez le rsultat.
Enlevez EXPLAIN . Vrifiez le rsultat.
Question 19 Excutez les instructions suivantes et notez soigneusement les rsultats qui apparaissent
lcran.
Question 20 Essayez le mme enchanement doprations avec la requte sur la colonne pt. Que se
passe-t-il ?
10/06/2015
23
Question 21 Essayez le mme enchanement doprations avec la requte sur la colonne geom. Que se
passe-t-il ?
10/06/2015
24
9 Webographie
9.1 PostGreSQL
http://docs.postgresql.fr/8.4/
(le point dentre)
http://docs.postgresql.fr/8.4/sql.html
(les chapitres sur le langage SQL)
http://docs.postgresql.fr/8.4/server-programming.html
(les chapitres sur la programmation serveur : PL/pgSQL, triggers, etc.)
9.2 PostGIS
La documentation officielle, en anglais :
* http://postgis.refractions.net/docs/
(le point dentre)
* http://postgis.refractions.net/docs/ch04.html
(le guide utilisateur de PostGIS)
La traduction de la documentation en franais :
* http://www.postgis.fr/node/156
(le point dentre)
Une traduction est toujours un peu en retard. Au 31 octobre 2009, la partie 4.2.5. Ensuring
OpenGIS compliancy of geometries nest pas traduite. On la trouvera en anglais ici :
* http://postgis.refractions.net/docs/ch04.html#OGC_Validity
Le cours de David Techer :
* http://www.davidgis.fr/documentation/win32/html/index.html
(le point dentre)
* http://www.davidgis.fr/documentation/win32/html/ch05.html
(le tutorial)
* http://www.davidgis.fr/documentation/win32/html/ch06.html
(des exemples)
10/06/2015
25
10 A rendre
Question 0 Identification :
Nom :
Prnom :
Question 1 Liste des colonnes avec leur type :
Real
longitude
10/06/2015
26
Requte :
Rsultat :
Question 10 La vue qui donne les 200 tremblements de terre de plus forte magnitude :
10/06/2015
27
Question 11 - la requte qui dtermine la magnitude du plus faible tremblement de terre de cette vue :
10/06/2015
28
Question 19 Comparaison des index pour une requte sur les colonnes latitude et longitude :
EXPLAIN
sans index
moyenne :
avec btree
moyenne :
Avec btree
et gist
moyenne :
avec gist
(sans btree)
moyenne :
10/06/2015
29
EXPLAIN
sans index
moyenne :
avec btree
moyenne :
Avec btree
et gist
moyenne :
avec gist
(sans btree)
moyenne :
EXPLAIN
sans index
moyenne :
avec btree
moyenne :
Avec btree
et gist
moyenne :
avec gist
(sans btree)
moyenne :
10/06/2015
30
10/06/2015
31