Академический Документы
Профессиональный Документы
Культура Документы
donnes
QGIS Perfectionnement
version 2.1 A
6 fvrier 2015
Table des
matires
Objectifs
I - Notions SQL
A. Introduction.................................................................................................7
B. La slection..................................................................................................9
C. Les oprateurs de comparaison et les oprateurs logiques................................10
D. Les types de donnes et les fonctions............................................................12
E. Tri et agrgation..........................................................................................15
F. Extensions spatiales.....................................................................................17
G. Prsentation de DBManager.........................................................................20
H. Exercice 6 : slections SQL avec DBManager..................................................26
I. Les jointures attributaires.............................................................................28
J. Les jointures spatiales..................................................................................31
K. Exercice 7 : Requtes et fonctions spatiales....................................................32
II - Spatialite
35
III - PostGIS
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
53
Notions SQL
Notions SQL
75
Objectifs
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
I -
Notions SQL
Introduction
La slection
10
12
Tri et agrgation
15
Extensions spatiales
17
Prsentation de DBManager
20
26
28
31
32
Objectifs
Dcouvrir le langage de requte SQL pour rpondre des
besoins d'analyse spatiale dans QGIS.
A. Introduction
Introduction aux SGBDR
Un Systme de Gestion de Base de Donnes (SGBD) est un logiciel permettant de
stocker de la donne dans une base de donnes en garantissant la qualit, la
prennit et la confidentialit des informations. La complexit des oprations de
traitement des donnes ne ncessite pas d'tre totalement connue par les
utilisateurs. Ce module ne vise donc pas former des spcialistes des SGBD. Les
SGBD1 que nous utiliserons sont bass sur un modle de donnes relationnel
(SGBDR). Dans ce modle, la base de donnes est compose d'un ensemble de
tables et chaque ligne d'une table est un enregistrement.
1 - http://fr.wikipedia.org/wiki/Syst%C3%A8me_de_gestion_de_base_de_donn%C3%A9es#Typologie
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
Notions SQL
Notions SQL
2 - http://www.developpement-durable.gouv.fr/La-standardisation-des-donnees-par.html
3 - http://geoinfo.metier.i2/presentation-de-la-formation-a349.html
Notions SQL
SQL
SQL (Structured Query Language qui signifie langage de requtes structur) est un
langage destin la manipulation des bases de donnes au sein d'un SGBD.
SQL est compos de trois sous-ensembles :
Le Langage de Dfinition de Donnes (LDD) qui permet de crer et supprimer
des objets dans la base de donnes et que nous n'aborderons pas
explicitement dans le cadre de cette formation.
Le Langage de Contrle de Donnes (LCD) pour grer les droits sur les objets
et que nous n'aborderons pas non plus.
Le Langage de Manipulation de Donnes (LMD) pour la recherche, l'insertion,
la mise jour et la suppression de donnes et qui sera le seul abord
partiellement.
A noter que le SQL est utilis galement dans QGIS dans les requtes de filtrages sur
les tables.
B. La slection
Syntaxe gnrale
La requte de slection est la base de la recherche de donnes en SQL.
Une requte SQL respecte une syntaxe de type :
SELECT (liste des attributs) FROM (liste des tables) WHERE (Conditions)
La partie SELECT indique le sous-ensemble des attributs (les colonnes) qui doivent
apparatre dans la rponse.
La partie FROM dcrit les relations (les tables) qui sont utilises dans la requte. Les
attributs de la clause SELECT doivent appartenir aux tables listes dans la clause
FROM.
La partie WHERE exprime les conditions, elle est optionnelle.
Nous verrons d'autres options plus tard...
ex 1: SELECT * FROM commune WHERE population > 1000
slectionne les enregistrements de la table COMMUNE dont la population est
suprieure 1000 avec tous les attributs (c'est le sens de *) de la table COMMUNE
ex 2 : SELECT nom_comm, insee_comm, population FROM commune
slectionne tous les enregistrements de la table COMMUNE (cf pas de conditions) et
renvoi une table avec les attributs NOM_COM, INSEE_COMM et POPULATION.
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
Notions SQL
Notions SQL
10
10
Notions SQL
Attention
: Sensibilit la casse
SQL est sensible la casse (majuscule / minuscule) pour les constantes, ainsi
NOM_COMM LIKE '%A' est diffrent de NOM_COMM LIKE '%a'.
Les mots clefs et les noms de colonnes sont insensibles la casse. On peut ainsi
crire SeLecT * fRom ma_TabLE. Une convention couramment utilise est d'crire les
mots clefs en majuscule et les noms en minuscules exemple : SELECT * FROM
ma_table.
Dans PostgreSQL mettre les noms de colonnes entre guillemets double permet de les
rendre sensibles la casse, "ma_table" est diffrent de "MA_TABLE". Il est conseill
de donner des noms de champs en minuscules dans PostgreSQL.
Les chanes de caractres des constantes sont en gnral entoures de guillemets
simples (ex : 'SAINT %') qui est le caractre chr(39), cependant si la chane
constante contient elle-mme une apostrophe il faut la doubler (ex : SELECT * FROM
commune WHERE nom_com LIKE 'l'' %' slectionne toutes les communes dont le
nom commence par l'
Fondamental: NULL
Une valeur par dfaut peut-tre attribue une colonne lors de la dfinition d'une
table. Si aucune valeur par dfaut n'est attribue la valeur par dfaut de la colonne
est positionne NULL (0 ou espace n'est pas quivalent NULL...c'est une
diffrence importante par rapport MapInfo).
Il est possible d'utiliser l'oprateur logique IS pour tester si un champ est ou non nul.
Exemple : SELECT * FROM commune WHERE nom_comm IS NULL rcupre les
enregistrement qui n'ont pas de nom de commune.
SELECT * FROM commune WHERE nom_comm IS NOT NULL rcupre ceux qui ont
effectivement un nom (non positionn NULL).
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
11
Notions SQL
Notions SQL
AND
Les fonctions
SQL propose des fonctions dont on trouvera une description par exemple ici6
Examinons en quelques unes...
Fonctions de transtypage:
cast (expr as type) : Est la fonction standard SQL qui permet de convertir un type en
un autre.
4 - http://fr.wikipedia.org/wiki/SQLite#Types_de_donn.C3.A9es
5 - http://docs.postgresql.fr/9.3/datatype.html
6 - http://sqlpro.developpez.com/cours/sqlaz/fonctions/
12
12
Notions SQL
Exemple :
Si x_commune est un champ de type INTEGER dans la table commune
SELECT x_commune FROM commune LIMIT 1
renvoi 478935
(noter l'utilisation de la clause LIMIT qui permet d'indiquer le nombre maximum
d'enregistrements en retour. Il est galement possible d'utiliser la clause OFFSET
pour dcaler le nombre de lignes obtenir
ex : SELECT * FROM commune LIMIT 10 OFFSET 5 (pour renvoyer les
enregistrements de 6 15)
SELECT cast(x_commune as real) FROM commune LIMIT 1 renvoie 478935.0
SELECT cast(x_commune as text) FROM commune LIMIT 1 renvoie '478935' c'est
dire une chane de caractre, puisque entre ''.
PotsgreSQL propose une notation compacte sous la forme expr::type
exemple : SELECT x_commune :: real FROM commune
Une opration de transtypage est parfois ncessaire pour obtenir le rsultat souhait,
en particulier avec SpatiaLite. Prenons l'exemple de calcul d'un indicateur (ratio de
deux entiers) avec SpatiaLite.
Exemple : SELECT (population/superficie) AS densite FROM commune LIMIT
10
renvoie :
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
13
Notions SQL
Notions SQL
14
14
Notions SQL
renvoie :
fonction round
Remarque
sous PostGIS on crira SELECT (round (population/superficie) :: numeric, 2)
AS densite FROM commune
le :: tant une forme compacte sous PostGIS pour raliser le cast. Le format
numerique (numeric) tant obligatoire pour la fonction round sous PostGIS.
E. Tri et agrgation
Tri
Il est possible de classer le rsultat d'une requte en ajoutant le mot clef ORDER BY
suivi d'une liste de champs.
Exemple : SELECT * FROM commune ORDER BY nom_comm
pour classer le rsultat par nom de commune.
Un tri dcroissant peut-tre obtenu en ajoutant DESC.
Exemple : SELECT * FROM commune ORDER BY nom_comm DESC
SELECT nom_comm, round(cast(population as float)/superficie,2)
densite FROM commune ORDER BY densite
AS
7 - http://www.sqlite.org/lang_corefunc.html
8 - http://docs.postgresql.fr/9.2/functions.html
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
15
Notions SQL
Notions SQL
Remarque
Sous PostGIS on crira
SELECT nom_comm, round(population/superficie :: numeric,2) AS densite
FROM commune ORDER BY densite)
Agrgations
Une agrgation est une opration qui permet de regrouper les enregistrements de la
table en sortie selon des critres et d'obtenir des informations statistiques sur ces
regroupements. Il faut utiliser l'expression GROUP BY suivi du critre de
regroupement.
Prenons un exemple partir de la table COMMUNE. Nous souhaitons obtenir la
population totale par dpartement.
SELECT Nom_comm, nom_dept, population FROM commune
16
16
Notions SQL
nous donne :
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
17
Notions SQL
Notions SQL
max() : maximum
min() : minimum
avg() : moyenne
F. Extensions spatiales
Sqlite et PostgreSQL proposent des extensions spatiales (respectivement Spatialite et
PostGIS) permettant d'ajouter le stockage et la manipulation d'objets spatiaux en
ajoutant des types de donnes gomtriques et des fonctions spatiales.
18
18
Notions SQL
Remarque
Vrification de gomtrie sous PostGIS
PostGIS ajoute d'autres fonctions de vrification de la gomtrie
ST_IsValidReason() : retourne un texte indiquant les raisons d'une ventuelle
invalidit.
12
13
14
15
http://postgis.net/docs/manual-2.0/using_postgis_dbmanagement.html#geometry_columns
http://www.geoinformations.developpement-durable.gouv.fr/qgis-et-les-bases-de-donnees-a2257.html
http://geoinfo.metier.i2/qgis-et-les-bases-de-donnees-a2257.html
http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/validity.html
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
19
Notions SQL
Notions SQL
Utilisation St_Centroid
ST_Area() retourne la surface d'un objet
ST_Buffer() retourne un nouvel objet tampon construit autour d'un objet
ST_Length() : retourne la longueur d'un objet de type ligne ou multi-ligne
(attention ne pas utiliser length() qui retourne la longueur du champ, spatialite
autorise aussi Glength()).
ST_Perimeter() : retourne le primtre d'un objet polygone ou multi-polygone
Attention
: Prefixe ST_
Il est recommand de prfixer les commande par ST_ (Spatial Temporal) pour tre
conforme au standard SQL/MM. PostGIS a entam une migration vers ce standard et
mme si certaines fonctions anciennes sont toujours disponibles sans ce prfixe, elles
deviendront prochainement obsoltes. Donc autant prendre les bonnes habitudes !
20
20
Notions SQL
G. Prsentation de DBManager
Mise en oeuvre
Nous allons mettre en pratique SQL dans les SGBD SpatiaLite, puis PostGIS.
Pour chacun de ces SGBD il existe de nombreux 'clients' permettant d'crire et
d'excuter les requtes SQL. Depuis QGIS nous allons utiliser le plugin DBManager
qui s'interface aussi bien avec SpatiaLite que PostGIS. C'est le plugin qui est le plus
port par la communaut QGIS.
Nous utiliserons galement QspatiaLite qui est un plugin spcifique pour SpatiaLite
qui propose un diteur SQL avanc (ergonomie proche de celle de MapInfo). Pour
ceux qui en dispose, il est possible d'utiliser PgAdmin III16 qui est le client le plus
populaire de PostGIS et qui dispose de fonctionnalits intressantes comme un
assistant l'criture de requtes SQL.
Pour mettre en uvre le plugin DB Manager...
Vrifiez qu'il est bien install ou sinon installez le.
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
21
Notions SQL
Notions SQL
et dsigner le fichier
Connexion sandbox
En lanant DB Manager vous devez maintenant pouvoir vous connecter cette base.
Nb : Une base de donnes de type PostGIS peut tre protge par mot de passe,
dans ce cas il faut le saisir dans la fentre qui apparat pour cela.
22
22
Notions SQL
DbManager
L'onglet info fournit les informations sur les tables
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
23
Notions SQL
Notions SQL
DBManager Informations
On peut par exemple lire que la table COMMUNE contient 19 enregistrements (rows),
qu'il y a une colonne de gomtrie contenant des objets 'MULTIPOLYGONS', que la
projection est Lambert 93 et qu'il n'y a pas d'index spatial ('No spatial index
defined...nous verrons ce que cela signifie concrtement plus tard).
L'onglet 'table' fournit une vision des donnes de la table et l'onglet preview une
visualisation de la gomtrie.
Le bouton 'SQL window' ouvre une nouvelle bote de dialogue dans laquelle nous
allons pouvoir excuter des ordres SQL.
24
24
Notions SQL
Attention
Problmes connus avec Spatialite
QGis utilise gdal/ogr pour lire et crire dans les bases spatialite.
Avec gdal 1.10.1 (voir le menu a propos de QGIS pour vrifier la version) il y a des
lenteurs en cration des bases spatialite17. C'est corrig partir de gdal 1.10.2 (QGIS
2.6).
17 - http://trac.osgeo.org/gdal/ticket/5270
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
25
Notions SQL
Notions SQL
Q3 : slectionner les communes de la table COMMUNE dont le statut n'est pas cheflieu de canton et afficher les colonnes NOM_COMM en lui donnant comme alias NOM
et les colonnes, STATUT, POPULATION et SUPERFICIE
Indice :
On peut traduire le "n 'est pas" par l'utilisation de NOT
Question 4
[Solution n4 p 73]
Q4 : slectionner les diffrents noms des tronons comportant le nom 'ruisseau' dans
la colonne TOPONYME de la table TRONCON_HYDROGRAPHIQUE
Indice :
Utiliser la table troncon_hydrographique. On pourra utiliser LIKE pour indiquer que
le nom de tronon doit contenir la chane 'ruisseau'.
26
26
Notions SQL
Question 5
[Solution n5 p 74]
exo6 - question 4
on cherche des sommes, moyennes,...par dpartement il faut donc utiliser un
GROUP BY (agrgation) avec comme critre le nom de dpartement
(NOM_DEPT).
Qui dit agrgation implique automatiquement l'utilisation de fonctions
d'agrgation...On utilisera les fonctions d'agrgation donnant la somme, la
moyenne, le maximum et le minimum.
Question 6
[Solution n6 p 74]
Q6 : quels sont les surfaces (en km2) et primtres (en km), arrondis deux chiffres
aprs la virgule, des communes du dpartement de la Sarthe ?
Indice :
trouver la fonction gomtrique qui renvoie une aire, et celle qui renvoie un
primtre. Ces fonctions ne prennent pas de paramtres d'units, il faut donc faire
la conversion soit mme par une division.
nb : pour spatialite on fera attention ne pas utiliser length() qui renvoi la
longueur d'une chane de caractres. Dans les dernires versions on utilisera la
mme fonction que sous PostGIS pour renvoyer le primtre.
Question 7
[Solution n7 p 74]
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
27
Notions SQL
Notions SQL
Question 8
[Solution n8 p 74]
Q8 : quelle est la longueur de la 'rivire le loir' par type de largeur sur ce jeu de
donnes ?
Indice :
Il faut partir de la requte prcdente et ajouter une colonne qui va calculer la
somme de la longueur des tronons... on utilisera la fonction st_length qui donne
la longueur d'un objet linaire.
28
28
Notions SQL
La solution est donc d'tablir un lien (une jointure) entre les deux tables afin que
pour chaque enregistrement de la table IRIS_extrait72 on retrouve le nom de la
commune dans la table COMMUNE.
Une analyse des tables IRIS_extrait72 et COMMUNE permet de voir que DepCom
reprsente le N INSEE de la commune d'appartenance dans la table IRIS_extrait72.
On retrouve ce NINSEE dans le champ INSEE_COMM de la table COMMUNE. Le lien
peut donc s'tablir par galit des ces colonnes ce que l'on crira :
IRIS_extrait72.DepCom = COMMUNE.INSEE_COMM
C'est ce que l'on appelle la condition de jointure.
Remarque
Lorsqu'on utilise plusieurs tables, il devient ncessaire s'il y a risque d'ambigut de
prciser le nom de la table devant le nom des colonnes sous la forme
NomTable.NomColonne d'o par exemple COMMUNE.INSEE_COMM.
Lorsqu'on ralise une jointure attributaire entre deux tables (deux noms de tables
aprs le from) il faut retenir qu'en gnral il faut une condition de jointure qui sera
une galit de champ.
La requte pourrait tre la suivante (on ne retient que certains champs) :
SELECT DepCom, Nom_Iris, insee_comm, nom_comm FROM iris_extrait72,
commune WHERE DepCom = insee_comm
Ici il n'y a pas d'ambigut sur les noms de colonnes et on peut ne pas utiliser la
notation NomTable.NomColonne
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
29
Notions SQL
Notions SQL
Complment
On peut galement utiliser une syntaxe normalise qui est dans ce cas strictement
quivalente :
SELECT <colonnes> FROM <table1> JOIN <table2> ON <condition de jointure>
dans notre exemple cela donne :
SELECT DepCom, Nom_Iris, insee_comm, nom_comm FROM iris_extrait72 JOIN
commune ON iris_extrait72.DepCom = INSEE_COMM
SQL autorise beaucoup de subtilit dans les types de jointures, on pourra par
exemple consulter Le SQL de A Z sur les jointures18.
18 - http://sqlpro.developpez.com/cours/sqlaz/jointures/
30
30
Notions SQL
Prdicats de l'OGC
Ils sont disponibles sous formes de fonctions spatiales qui renvoient VRAI (1) ou
FAUX (0) :
ST_Equals(geometry A, geometry B) retourne vrai si les gomtries sont de
mme type et ont les mmes coordonnes.
ST_Intersects(geometry A, geometry B) retourne vrai s'il y a au moins un point
commun.
ST_Disjoint(geometry A, geometry B) retourne vrai s'il n'y a aucun point
commun (quivalent n'intersecte pas ou NOT ST_Intersect, qu'il est prfrable
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
31
Notions SQL
Notions SQL
Attention
Les relations spatiales normalises n'ont pas le mme comportement que sous
MapInfo puisque les oprateurs Contains et Within utilisent la gomtrie exacte des
objets et non leurs centrodes.
Pour plus de dtails voir Matrices de Clementini et prdicats spatiaux de l'OGC
disponible sur le site GoInformations du Ministre de l'Ecologie (ici19)
Indice :
On utilisera les tables PONCTUEL_HYDROGRAPHIQUE et COMMUNE... trouver la
relation gomtrique entre PONCTUEL_HYDROGRAPHIQUE.Geometry et
COMMUNE.Geometry.
19 - http://www.geoinformations.developpement-durable.gouv.fr/qgis-documents-et-fiches-a1853.html
32
32
Notions SQL
Question 2
[Solution n10 p 75]
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
33
Notions SQL
Notions SQL
AS SRID, MakePoint(X_COMMUNE,
Geometry FROM commune WHERE
34
34
II -
II
Spatialite
35
38
44
Indexation et optimisation
45
49
Objectifs
Dcouvrir et mettre en pratique le SGBDR SpatiaLite avec
QGIS
Remarque
Le plug-in 'dition hors connexion21' permet de grer la synchronisation avec une
base SpatiaLite (offline.sqliter) embarque.
Il est donc possible d'envisager des utilisations avec saisie terrain sous SpatiaLite
puis synchronisation au retour avec une base partage centrale (sous PostGIS par
exemple).
Nous allons utiliser spatialite sous QGIS avec le plugin QspatiaLite ralis par
Romain RIVIERE (mais ceux qui prfrent peuvent utiliser DBManager qui est plus
universel, mais qui ne dispose pas encore (QGIS 2.2) d'assistant SQL).
Vrifier que QspatiaLite est bien install :
20 - http://www.opengeospatial.org/standards/sfs
21 - http://docs.qgis.org/2.2/fr/docs/user_manual/plugins/plugins_offline_editing.html
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
35
Spatialite
Spatialite
Qspatialite installation
Le menu base de donnes de QGIS doit proposer un item 'SpatiaLite'
Son lancement doit afficher la bote de dialogue suivante :
36
36
Spatialite
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
37
Spatialite
Spatialite
25 - http://georezo.net/wiki/main/dico/epsg
38
38
Spatialite
Advance SQL
Cette bote de dialogue permet de construire la requte SQL. La dmarche est
d'abord de slectionner la ou les tables sur lesquelles on souhaite travailler (ex :
''AERODROME'', puis les colonnes de ces tables que l'on souhaite en sortie ou mettre
* dans la case Columns pour choisir toutes colonnes.
Ex :
"AERODROME".'NATURE',
"AERODROME".'DESSERTE',
"AERODROME".'TOPONYME'
et ventuellement d'ajouter une condition (clause where) pour laquelle on peut
utiliser les listes droulantes droite.
exemple :
NATURE = 'Normal'
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
39
Spatialite
Spatialite
Remarque
Il n'y a pas * par dfaut (comme sous MapInfo) dans le champ 'Columns' dans la
bote de dialogue pour slectionner tous les champs,
on peut crire = ou == comme oprateur d'galit.
on ne dispose pas de = ANY (utiliser IN)
|| est l'oprateur de concatnation (ne pas utiliser + comme sous MapInfo)
Complment
GLOB : est similaire l'oprateur LIKE (%= 0 n caractres, _= 1 caractre) mais
utilise les jokers unix (* = 0 n caractres, ?= 1 caractre ) et est sensible la
casse.
BETWEEN n'est pas disponible dans les menus droulants, mais est utilisable.
MATCH : permet de comparer un ensemble de valeurs de ligne un ensemble de
lignes retourn par une sous-requte (usage rare). Voir ici26 pour en savoir plus.
REGEXP : permet d'utiliser les expressions rgulires ou rationnelles (voir ici27). Le
documentation prcise toutefois qu'il faut se dfinir sa propre fonction regexp() car il
n'y en pas par dfaut. L'utilisation de cet oprateur sans dfinir de fonction gnre un
message d'erreur. Trs peu utile pour les besoins des services.
Attention
SQLite est laxiste sur le contrle de type des champs, plus prcisment SQLite utilise
u n typage dynamique28. L o MapInfo affichera un message du type 'Non26 - http://sqlpro.developpez.com/cours/sqlaz/sousrequetes/#L1.3
27 - http://fr.wikipedia.org/wiki/Expression_rationnelle
28 - http://fr.wikipedia.org/wiki/SQLite#Types_de_donn.C3.A9es
40
40
Spatialite
29 - http://www.gaia-gis.it/gaia-sins/spatialite-sql-4.2.0.html
30 - https://www.sqlite.org/lang_corefunc.html
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
41
Spatialite
Spatialite
onglet option
onglet option
Il permet de fixer la destination du rsultat :
par dfaut dans une nouvelle table provisoire 'sqlResult'.
On peut :
Load in QGIS as Spatial layer : charger dans QGIS comme table spatiale
(contenant une gomtrie). Dans ce cas on peut dsigner la colonne contenant la
gomtrie.
Create Table & Load in QGIS : crer une table (uniquement attributaire) du nom
indiqu dans Table Name dans Spatialite et charger cette table dans QGIS.
Create Spatial Table & Load in QGIS : crer une table spatiale (avec la
gomtrie) et la charger dans QGIS.
Create View & Load in QGIS : crer une Vue et la charger dans QGIS.
Create spatial View & Load in QGIS : crer une Vue spatiale et la charger dans
QGIS.
U n e vue est une table virtuelle. Seule la requte est mmorise et nouveau
excute chaque fois que l'on utilise la vue comme une table. Le concept est tout
fait similaire aux tables requtes de MapInfo.
42
42
Spatialite
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
43
Spatialite
Spatialite
31 - http://sqlpro.developpez.com/article/olap-clause-window/
44
44
Spatialite
"IRIS_extrait72".'Nom_Iris',
"IRIS_extrait72".'Nom_Com'
FROM "IRIS_extrait72", "COMMUNE"
WHERE "IRIS_extrait72".'DepCom' =="COMMUNE".'INSEE_COMM'
De mme on peut raliser des jointures spatiales
Remarque
Les oprateurs spatiaux sont des fonctions, la syntaxe est donc diffrente de celle de
MapInfo.
Si on souhaite utiliser le rsultat comme une table spatiale, il est ncessaire de
choisir une des colonnes de gomtrie en sortie, si on indique *, il y a aura deux
colonnes de gomtrie dans la table rsultante. Il faudra donc prciser laquelle on
considre comme la source de gomtrie (champs 'geometry field) lors de l'export de
QsptiaLite vers QGIS.
D. Indexation et optimisation
Dans le cas d'une grosse base de donnes, les requtes Sql peuvent tre coteuses
en temps de calcul, a fortiori les requtes spatiales qui utilisent la gomtrie des
objets.
Crer des index (spatiaux ou non) peut permettre d'amliorer les temps de
traitement. Ce n'est cependant pas une recette miracle. Dans SpatiaLite, un index
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
45
Spatialite
Spatialite
spatial ne peut acclrer les calculs que dans le cas o le rsultat appartient une
petite portion du jeu de donnes. Quand les rsultats incluent une grande partie du
jeu de donnes, l'index spatial ne permet pas de gains de performance.
Dans un SGBD labor comme PostGIS le planificateur de requte choisit de faon
adapte d'utiliser ou non les index et l'index spatial (de type Gist que nous verrons
plus tard) est primordial. La seule restriction d'utilisation est celle des tables avec
de trs gros objets en petit nombre (ex : tache urbaine dpartementale rpartie en
10 priodes soit 10 enregistrements).
On trouvera quelques explications sur le principe de l'algorithme R-Tree utilis par
spatialite ici32 et sur les index Gist ici33
Index spatial
Construisons un index spatial sur la table TRONCON_HYDROGRAPHIQUE, ainsi que
sur la table PONCTUEL_HYDROGRAPHIQUE.
32
33
34
35
http://www.gaia-gis.it/gaia-sins/spatialite-cookbook-fr/html/rtree.html
http://docs.postgresqlfr.org/8.3/gist.html
https://sites.google.com/site/sgbdspatialite/bon-usage-de-l-index-spatial-r-tree
http://sqlite.org/lang_altertable.html
46
46
Spatialite
Index spatial
En appuyant sur 'use Spatial Index' Qspatiale rajoute automatiquement une
syntaxe dans la clause where.
AND"PONCTUEL_HYDROGRAPHIQUE".ROWID IN (
SELECT pkid FROM "idx_PONCTUEL_HYDROGRAPHIQUE_Geometry" WHERE pkid MATCH
RTreeIntersects(
MBRminX("TRONCON_HYDROGRAPHIQUE".'Geometry'),MBRminY("TRONCON_HYDROGRAPH
IQUE".'Geometry'),MBRmaxX("TRONCON_HYDROGRAPHIQUE".'Geometry'),MBRmaxY("
TRONCON_HYDROGRAPHIQUE".'Geometry')))
Cette syntaxe n'est plus recommande dans les dernires versions de spatialite
(> 4.0.1) pour laquelle, il y a eu des travaux d'optimisation36.
36 - https://www.gaia-gis.it/fossil/libspatialite/wiki?name=speed-optimization
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
47
Spatialite
Spatialite
Elle peut conduire au message d'erreur suivant si le module geocallback n'est pas
prsent :
'no such function : RtreeIntersects' (module geocallbacks non prsent)
Dsormais, pour utiliser explicitement les index spatiaux on peut construire une
requte copiant la syntaxe indique ici 37:
SELECT p.'Geometry' AS Geometry,
p.'TYPE',
p.'NATURE',
p.'TOPONYME',
p.'COTE',
t.'TOPONYME' as COUR_D_EAU
FROM 'PONCTUEL_HYDROGRAPHIQUE' p, 'TRONCON_HYDROGRAPHIQUE' t
WHERE st_intersects(p.'Geometry',t.'Geometry') and p.'ROWID' in ( select
rowid from spatialIndex where f_table_name = 'PONCTUEL_HYDROGRAPHIQUE'
AND search_frame = t.'Geometry')
nb : O n u t i l i s e p o u r p l u s d e c o n c i s i o n l e s a l i a s d e t a b l e ; p p o u r
'PONCTUEL_HYDROGRAPHIQUE' et t pour 'TRONCON_HYDROGRAPHIQUE'
Sans rentrer trop dans les dtails une sous-requte est ici utilise (ordre select
dans la clause Where de la requte de base relanant une sous-requte). Cette sousrequte utilise les colonnes f_table_name et search_frame de la table systme
SpatialIndex (cette table n'est pas interrogeable).
Cela donne :
Requte complte
Ici le traitement s'excute en 26 ms...(au lieu de 45 ms sans l'utilisation explicite des
index spatiaux) le gain de temps n'est semble-t-il pas en rapport avec l'effort
intellectuel consenti ! Mais dans d'autres cas cette petite gymnastique qui aprs
quelques essais n'est pas si difficile mettre en uvre peut faire gagner beaucoup
de temps.
37 - https://www.gaia-gis.it/fossil/libspatialite/wiki?name=SpatialIndex
48
48
Spatialite
Complment
Les possibilits de manipulation spatiale sont trs grandes... voici quelques
rfrences supplmentaires :
Quelques exercices et astuces classiques39
le livre de cuisine !40
Ne pas hsitez consulter partir de cette page 41le 'Spatial SQL functions reference
guide' qui est la liste de rfrence des fonctions disponibles dans la dernire version
de spatialite (attention ce n'est pas forcement celle de votre version de QGIS). Pour
aller plus loin, on pourra en particulier regarder avec intrt les fonctions 'GEOS
Advanced', ainsi que les fonctions 'LWGEOM'
(Sur SQL d'une faon gnrale on pourra consulter un cours en ligne42 ou ce site43 de
rfrence en franais
38
39
40
41
42
43
https://www.gaia-gis.it/fossil/libspatialite/wiki?name=speed-optimization
https://sites.google.com/site/sgbdspatialite/exercices-astuces
http://www.gaia-gis.it/spatialite-2.4.0-4/spatialite-cookbook-fr/index.html
https://www.gaia-gis.it/fossil/libspatialite/index
http://www.1keydata.com/fr/sql/
http://sqlpro.developpez.com/
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
49
Spatialite
Spatialite
Q3 : Plus difficile...
Calculer la somme des surfaces des 'Fort ferme de feuillus' de la commune de la
Flche en ha (1ha = 10 000 m2), en faisant attention ne prendre en compte que
les parties de surfaces des polygones rellement situes l'intrieur de la commune.
44 - http://sqlpro.developpez.com/cours/sqlaz/sousrequetes/
50
50
Spatialite
Le rsultat est :
exo8 Q4 rsultat
Indices :
Il est conseill de dcomposer un problme complexe en problmes plus simples
pour arriver la solution...
On pourra dans un premier temps construire une table qui donne les distances de
tous les tablissements industriels de la couche BATI_INDUSTRIEL pour chaque
tablissement hospitalier. Il faut pour cela utiliser les deux tables PAI_SANTE et
BATI_INDUSTRIEL. On notera qu'on ne peut donner une condition de jointure, ni
attributaire (pas de champ commun), ni gographique (les objets ne se
superposent pas). Dans ce cas on peut construire le produit des deux tables
(produit cartsien) sans condition (ce que n'autorise pas MapInfo).
SELECT * FROM "Pai_SANTE","BATI_INDUSTRIEL"
Il reste ajouter la colonne donnant les distances.
ATTENTION : Faire un produit cartsien sur deux tables sans condition de
jointure doit tre rserv des tables de petite dimension.
nb : Pour viter de faire le produit cartsien complet, on pourrait penser utiliser
sous PostGIS la fonction ST_DWithin() avec un rayon de recherche maximum,
fonction qui est disponible que dans spatialite 4.0 sous le nom de PtDistWithin().
La table prcdent peut nous donner accs pour chaque PAI_SANTE la distance
minimum de l'tablissement le plus proche avec un GROUP BY
SELECT PAI_SANTE.ID, min(st_distance(PAI_SANTE.Geometry,
BATI_INDUSTRIEL.Geometry)) AS distance_min from
PAI_SANTE,BATI_INDUSTRIEL GROUP BY PAI_SANTE.ID
On pourrait penser demander dans le tableau BATI_INDUSTRIEL.ID... mais le
rsultat serait faux, car il ne faut pas oublier lorsqu'on utilise un GROUP BY que
chaque colonne en sortie (dans la clause SELECT) doit tre, soit le critre de
rupture (celui du GROUP BY), soit tre le rsultat d'une fonction d'agrgation...
(sous PostGIS vous aurez d'ailleurs un message du type
ERREUR : la colonne "bati_industriel.id" doit apparatre dans la
clause GROUP BY ou tre utilise dans une fonction d'agrgation
Spatialite est plus tolrant, mais il vaut mieux prendre les bonnes habitudes !
Nous voila donc avec le tableau suivant :
rsultat sous-selection
Il faut maintenant trouver les couples (PAI_SANTE.ID BATI_INDUSTRIEL.ID) pour
lesquels la distance est l'une ou l'autre des distances de la table prcdente...
autrement dit excuter une requte du type
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
51
Spatialite
Spatialite
52
52
III -
III
PostGIS
53
65
68
72
Exercice 9 : PostGIS
73
Objectifs
Dcouvrir et mettre en pratique PostGIS avec QGIS
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
53
PostGIS
PostGIS
importation de Shapefile
Il faut crer une nouvelle connexion ou utiliser une connexion dj cre.
Une fois que la connexion est tablie, cliquer sur Ajouter.
La fentre suivante apparat.
54
54
PostGIS
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
55
PostGIS
PostGIS
connexion PostgreSQL
Le ou les fichiers shape imports dans PostGis apparaissent dans la liste.
Dans le champ Nom de la colonne de gomtrie, laisser vide, ou saisir le nom de la
colonne de gomtrie du fichier shape ou cocher la case Utiliser le nom de colonne
gomtrique par dfaut (the_geom).
Dans le champ SRID, saisir la valeur 2154 qui correspond au systme de
coordonnes de rfrence (SCR) RGF93/Lambert 93.
Cliquer sur OK.
Les donnes sont importes dans PostGIS.
56
56
PostGIS
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
57
PostGIS
PostGIS
58
58
PostGIS
dtails connexion
Cliquer sur OK.
La fentre suivante apparat.
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
59
PostGIS
PostGIS
Connecting
Dans la fentre de connexion (Log Window), un message indique si la connexion est
tablie et rappelle les informations la concernant.
Pour ajouter des fichiers importer, cliquer sur Add File
On peut choisir entre importer des fichiers .shp ou dbf
60
60
PostGIS
import SHP
Attention
Il faut veiller ce que les chemins et les noms des fichiers ne comportent ni espaces
blancs ni accents.
Lorsque le ou les fichiers importer dans PostGis ont t choisis, cliquer sur Options.
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
61
PostGIS
PostGIS
Options import
Selon le type de donnes importer, il faut cocher les cases correspondantes.
Puis cliquer sur OK.
Pour le fichier shape et/ou dbf importer, modifier le SRID en double cliquant dans la
colonne SRID ( 2154 pour les donnes en RGF93/Lambert 93).
Les diffrents modes sont :
Create : Cr la table et la remplit.
Append : Ajoute les enregistrement la table (si elle existe dj).
Delete : Supprime la table et la recre avec les enregistrements.
Prepare : Cr la table mais ne la remplit pas avec les enregistrements.
Pour afficher la fentre des options de l'importation, cliquer sur Options...
Les options les plus importantes retenir sont les suivantes :
Preserve case of column names : conserve la casse (majuscule/minuscule)
des colonnes du fichier import (Les noms de colonnes sont entours de ""
dans PostGIS).
Create spatial index automatically after load : cre automatiquement un
index spatial aprs le chargement du fichier import. Conseill si vous ne
chargez pas d'autres donnes dans cette table.
Load only attribute (dbf) data : permet de ne charger que les donnes
attributaires dans une table au format .dbf
Load into GEOGRAPHY column : charge la gomtrie des donnes dans
une colonne de type GEOGRAPHY (plutt que GEOMETRY). Ceci permet des
mesures sur le sphrode, plutt que cartsiennes. Pour plus de dtails48.
Generate simple geometries instead of MULTI geometries : cre des
gomtries simples au lieu de gomtries multiples
Il est propos dans l'exemple de ne cocher que Load only attribute (dbf) data et de
renseigner le type d'encodage des caractres du fichier .dbf source : LATIN1 dans la
case prvue cet effet (DBF file character encoding).
48 - http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/geography.html
62
62
PostGIS
nb : au sujet de l'encodage des fichiers SHP voir ici49, ainsi que quelques informations
complmentaires ici50.
Cliquer sur OK.
La fentre se ferme et la prcdente est nouveau affiche.
Cliquer sur Import.
La fentre de connexion (Log window) fait apparatre un ou des messages sur la
procdure d'importation des fichiers choisis.
Si l'importation se droule correctement, le message suivant apparat dans la fentre
de connexion.
log window
La connexion et l'importation de donnes dans PostGIS tant faite, on peut passer
dans QGIS pour afficher des donnes provenant de PostGIS.
Utilisation de DBmanager
DBManager permet de charger des fichiers dans une base PostGIS connecte sous
QGIS, par glisser / lch de fichiers partir du navigateur QGIS, ou par le menu
'Table > Importer une couche ou un fichier' pour les couches dj charge dans
QGIS. Ce dernier menu est galement accessible par le bouton
nb : DBManager permet galement de faire des changes de donnes avec les bases
de donnes spatialite par gliss / lch.
49 - http://www.geoinformations.developpement-durable.gouv.fr/qgis-2-2-encodage-des-fichiers-shp-a2908.html
50 - http://chinook.memoris.fr/
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
63
PostGIS
PostGIS
Complment : Ogr2ogr
Les spcialistes prfrent parfois utiliser ogr2ogr51 pour contrler l'import des
donnes dans PostGIS. Nous ne dtaillerons pas ici cet outil qui est plutt rserver
l'administrateur de la base.
Avantages :
Prend en charge une multitude de format52.
Possibilit de changement de projection
Possibilit de slection SQL des donnes en import.
Inconvnient :
Syntaxe complexe cause des nombreuses options.
nb : Pour les spcialistes l'option "- config PG_USE_COPY YES" permet dacclrer de
51 - http://www.portailsig.org/content/comment-importerexporter-des-donnees-vers-une-base-de-donneespostgresqlpostgis
52 - http://www.gdal.org/ogr/ogr_formats.html
64
64
PostGIS
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
65
PostGIS
PostGIS
Information de connexion
Une fois les paramtres corrects renseigns et les cases coches, tester ma
connexion, puis cliquer sur OK.
Conse il
Le recours la table de mtadonnes estimes permet d'optimiser la rapidit
d'ouverture du fichier.
L'utilisation du bouton connecter en ayant choisi la connexion donne accs la liste
des schmas et tables de la base.
66
66
PostGIS
Conse il
Dans le cas de tables volumineuses (comme par exemple la BDParcellaire), il est
conseill d'utiliser le constructeur de requtes (bouton 'Filtrer') pour filtrer les
donnes afficher (par exemple sur une seule commune).
Choisir la table qu'on souhaite afficher dans QGis et cliquer sur Ajouter.
La couche des donnes de PostGIS apparat dans la liste des couches de QGIS et
s'affiche dans la fentre cartographique si on coche son affichage.
L'info-bulle dans le contrle des couches affiche les informations sur l'origine de la
couche (base Sandbox,...)
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
67
PostGIS
PostGIS
DbManager
Cliquer sur le schma utilis ici public puis sur le nom du fichier souhait : ici
route_xy
La fentre suivante apparat indiquant tous les champs attributaires de cette table
PostgreSQL/PostGIS.
68
68
PostGIS
table
On peut cliquer sur l'onglet 'Table' pour faire apparatre la table avec ses champs et
ses valeurs, ou 'Aperu' pour avoir un aperu de la gomtrie.
On se propose de slectionner tous les tronons de route de la table route_xy dont le
champ numero comprend la valeur D104.
La requte est : SELECT * FROM route_xy where numero = 'D104'
Aprs avoir cliqu sur le bouton Excuter (F5), la liste des enregistrements de la
table correspondant la requte apparat dans la partie Rsultat de la fentre.
En cochant la case Charger en tant que nouvelle couche, on peut afficher dans QGIS
les donnes rsultant de la requte.
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
69
PostGIS
PostGIS
rsultat
Il faut dsigner obligatoirement la colonne avec des valeurs entires et uniques
(identifiant) et la colonne gomtrique.
La colonne Gomtrique peut tre trouve dans l'onglet info de la table sous
DBManager ou l'on voit que le champ 37 est de type geometry(LineString, 2154). La
colonne avec des 'valeurs entires et uniques' est donne par la rubrique Constraint
dans le mme onglet, il s'agit de la colonne gid.
Si nous n'avions pas dispos d'un identifiant de type INTEGER on aurait pu le crer
en modifiant la requte SQL :
SELECT row_number() over() as ident, * FROM "ROUTE_XY" where "Numero" =
'D104'
L'info-bulle de la couche rsultante dans QGIS aprs chargement indique la source :
table ="(SELECT * FROM \"ROUTE_XY\" where \"Numero\" = 'D104'
70
70
PostGIS
Mais les index ajoutent aussi une surcharge au systme de base de donnes dans
son ensemble, si bien qu'ils doivent tre utiliss avec discernement.
L'indexation spatiale sous PostGIS utilise l'index GiST (Generalized Search Tree).
Lorsque une table de PostGIS est charge avec l'extension pgShapeLoader, celui-ci
cre automatiquement un index spatial appel table_the_geom_gist.
Il est possible de supprimer cet index.
DROP INDEX table_the_geom_gist
Si l'index n'existe pas il est possible de le crer par la commande suivante :
CREATE INDEX table_the_geom_gist ON table USING GIST (the_geom)
Plus la table est grande, plus le temps d'excution d'une requte utilisant les index
diminue par rapport la mme requte excute sur une table sans index spatial.
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
71
PostGIS
PostGIS
E. Exercice 9 : PostGIS
Utilisation de PostGIS
objectif :Importer des donnes dans PostGIS et visualiser une partie des donnes
dans QGIS en ralisant une requte de filtrage.
Question
[Solution n17 p 78]
Importer le fichier shape ROUTE_XY (rpertoire Divers) dans PostGIS en utilisant
l'extension SPIT,
puis,
Dans la table ROUTE_XY, slectionner les tronons de route appartenant la D323 en
utilisant le constructeur de requte de QGIS pour n'ouvrir que cette route dans QGIS.
nb : Choisir UTF-8 comme encodage des caractres.
Importer le fichier shape COMMUNE_DENSITE dans PostGIS partir d'un gliss-Lch
depuis le navigateur de QGIS.
56 - http://sqlpro.developpez.com/cours/sqlaz/sousrequetes/
57 - http://www.postgresql-sessions.org/_media/5/dalibo_optimiseur.pdf
72
72
Solution des
exercices
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
73
Complment
La fonction count() accepte des expressions comme paramtre... on peut par
exemple crire
SELECT count(DISTINCT toponyme) from TRONCON_HYDROGRAPHIQUE qui donne 13
toponymes diffrents dans la table TRONCON_HYDROGRAPHIQUE
74
74
Complment
Lorsque les requtes sont un peu longues, il peut-tre utile d'utiliser des alias pour
pour les noms des tables. Ils s'obtiennent en plaant directement un alias aprs le
nom de table dans la clause FROM
Dans le cas prcdent cela donne :
SELECT
nom_comm,
toponyme,
round(sum(st_length(st_intersection(a.Geometry,b.Geometry))),2) as
longueur FROM troncon_hydrographique a, commune b WHERE toponyme=
'rivire le loir' AND st_intersects(a.geometry, b.geometry) GROUP BY
nom_comm
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
75
76
76
solution
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
77
exo8 Q4 rsultat
Complment
Le but de l'exercice est de montrer l'intrt et la syntaxe d'une requte complexe.
Cependant pour rpondre la question pose nous aurions pu utiliser l'outil Vecteur
-> Outils d'analyse -> Matrice des distances.
Cet outil ne fonctionnant que sur des couches de points, il faut au pralable crer la
couche BATI_INDUSTRIEL_CENTROID avec la fonction Vecteur -> Outil de gomtrie
-> Centrodes de polygones.
On utilise ensuite l'outil 'matrice de distances' en choisissant 'Utiliser uniquement les
points cibles les plus proches' avec k=1, Ceci gnre un fichier csv qui donne le
rsultat cherch. Les distances sont un peu diffrentes qu'avec la fonction
st_distance qui utilise le contour des polygones au lieu du centrode.
On pourrait galement utiliser le plugin NNJoin58 qui permet de calculer pour chaque
objet de la couche (input layer), l'objet le plus proche de la couche 'Join vector
Layer', ainsi que sa distance.
Il est possible pour la couche 'input layer' d'utiliser les centroides si la couche n'est
pas une couche de points et pour calculer les objets les plus proches d'utiliser
'Approximate by index geometries' qui utilise les rectangles englobant plutt que la
gomtrie exacte ce qui permet un calcul beaucoup plus rapide.
58 - http://arken.umb.no/~havatv/gis/qgisplugins/NNJoin/
78
78
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
79
constructeur de requte
Double-cliquer sur le champ numro. Ce champ doit apparatre entre "" dans la
fentre Clause SQL WHERE situe en bas de la fentre du constructeur de requtes.
Cliquer sur l'oprateur =. Celui-ci doit apparatre aprs le champ numero dans la
fentre Clause SQL WHERE.
Cliquer sur le bouton Tout. La liste des valeurs du champ numro doit apparatre
dans la partie droite de la fentre.
Choisir la valeur D323. Cette valeur doit apparatre entre '' dans la fentre Clause
SQL WHERE aprs l'oprateur =.
Cliquer sur OK.
Le rsultat doit apparatre dans la fentre cartographique de QGis sous cette forme.
80
80
QGIS
En cliquant sur la couche on peut afficher la table attributaire et vrifier que les
tronons affichs ont bien la valeur D323 dans le champ numero .
erreur postgis
Vous n'avez pas indiqu une clef primaire correcte.
Matrise d'ouvrage : MEDDE - METL - MAAF / Matrise d'uvre : ENTE Aix - ENSG /
Licence ouverte ETALAB
81
erreur PostGIS
Vous n'avez pas indiqu le bon encodage de caractres (UTF-8 en gnral).
Pour le gliss / lch depuis le navigateur :
82
82