A
Manipulations non-relationnelles
non-relationnel
parce qu’une seule table est manipulée : il n’y a pas de jointure
AA
Importer les communes de France dans une table
- À partir de ce lien :http://www.data.gouv.fr/fr/dataset/decoupage-administratif-communal-francais-issu-d-openstreetmap
- En bas de la page dans la rubrique Ressources
, récupérer le ZIP shapefile : Export simple de janvier 2015 - vérifié et simplifié à 50m (22Mo)
- Note : en fonction de la date de ce TD et les mises-à-jours sur ce site, la date peut être plus récente (avec un poids différent) ; par contre, bien veiller à récupérer la version 50m
.
- Désarchiver le ZIP quelque part, dans un dossier sur le bureau par exemple.
- Nous allons importer ce Shapefile dans la base PostGIS grâce au Gestionnaire de bases de données
fourni avec QGIS :
- Ouvrir QGIS puis le gestionnaire dans Gestionnaire de base de données
→ Gestionnaire de base de données
- Dans le gestionnaire, ouvrir PostGIS
→ local
→ public
- Ouvrir la fenêtre d’import en cliquant sur Table
→ Importer une couche ou un fichier
- Dans la fenêtre:
- Choisir le Shapefile là où il a été désarchivé (le fichier avec l’extension .shp
)
- Sélectionner le schéma
public
- Comme table
, mettre communes
- Choisir créer une table
- Préciser Codage
: choisir UTF-8
- Ne pas préciser (laisser décoché) les autres options (Clé primaire
, Colonne de géométrie
, ...)
- Cliquer sur OK
et patienter : il n’y a pas de barre de chargement, la fenêtre s’immobilise (ne répond plus) pendant que l’importation est en cours (1 minute environ). Cela doit se terminer avec un message de confirmation.
- Vérifier dans pgAdmin
: dans l’arbre à gauche, sélectionner la base ou le schéma et presser F5
pour rafraîchir : la table communes
devrait être listée dans les tables.
- Vérifier aussi l’encodage
de caractères en exécutant la requête suivante et en vérifiant que les accents s’affichent correctement
:
SELECT * FROM communes LIMIT 300
Exécuter la requête :
SELECT COUNT(*) FROM communes
QUESTION
AAA
valeur du COUNT(*)
de la requête précédente
Pour la suite de ce TD, nous devons supprimer les informations de SRID (sujet sur lequel nous reviendrons dans le module suivant
). Pour ce faire, exécuter les 2 requêtes suivantes :
ALTER TABLE communes ALTER COLUMN geom TYPE geometry(MultiPolygon)
UPDATE communes SET geom = ST_SetSRID(geom, 0)
AB
Rappels sur le SELECT de PostgreSQL
La requête SQL suivante liste les communes dont le nom commence par un Z majuscule ou minuscule :
SELECT * FROM communes WHERE nom ILIKE
’z%’
QUESTION
ABA
requête SQL retournant le nombre
de communes dont le nom finit par illy
(sans tenir compte de la casse)
QUESTION
ABB
le nombre (de communes) retourné
Pour trier par ordre alphabétique :
SELECT * FROM communes WHERE nom ILIKE
’z%’ ORDER BY nom
Pour limiter aux 10 premiers enregistrements :
SELECT * FROM communes WHERE nom ILIKE
’z%’ ORDER BY nom LIMIT 10
Pour « démarrer » au 5e
résultat :
SELECT * FROM communes WHERE nom ILIKE
’z%’ ORDER BY nom OFFSET 5
QUESTION
ABC
requête SQL retournant le nom des 5 plus vastes communes (en utilisant le champ surf_m2
, pas la géométrie)
QUESTION
ABD
résultat de la requête
QUESTION
ABE
requête SQL pour obtenir la même chose en se servant de la géométrie mais pas de surf_m2
QUESTION
ABF
requête SQL retournant le nom et périmètre des 8
communes au plus long périmètre (en utilisant la géométrie)
AC
Filtre et tri spatial
Soit le point PT
de coordonnées (3.11546 ; 45.78586)
. À l’aide la fonction
ST_MakePoint
pour construire le point et de la fonction
ST_Within
pour filtrer :
QUESTION
ACA
écrire la requête SELECT retournant la commune (tous les champs) dont la géométrie contient le point PT
QUESTION
ACB
nom de la commune dans lequel PT
se trouve
QUESTION
ACC
requête SQL listant les 100 premières communes, triées par distance croissante au point PT
QUESTION
ACD
requête SQL listant les communes situées à une distance au point PT
d’au plus 0.2 unité, avec toutes les colonnes
QUESTION
ACF
la même requête en triant par ordre de distance
QUESTION
ACG
la requête SQL listant toutes les communes, sans tri, avec toutes les colonnes ET
un champ nommé my_distance
représentant la distance entre la commune et le point PT
Nous disons « unité » car nous sommes en géométrie pure
. L’aire est en unités-carrées et tous les traitements géométriques peuvent se faire quelle que soit l’unité géographique. L’unité réelle, fut-elle le mètre, le degré, le pied, etc., est une relation
entre la métrique et le réel. Elle intervient dans les entrées, sorties, transformations, exploitation des résultats... c’est-à-dire : lorsqu’il y a valorisation métier ou transformation d’une référence spatiale à l’autre.
- enregistrer la requête ACG
en tant que vue
- ouvrir la vue dans QGIS
- définir un style pour la couche, gradué sur le champ my_distance
, allant du rouge au jaune
QUESTION
ACH
PNG QGIS
AD
Filtre par enveloppe
Similaire au filtre précédent (autour du point), mais exploite un rectangle à la place : l’enveloppe (ou l’étendue géographique
).
Tous les SIG interactifs interrogent les bases spatiales avec ce type de filtre, pour restreindre la requête à ce qui est visible à l’écran.
Soit E
l’étendue géographique rectangle défini par ses extrémités (1.92, 48.24) — (2.41, 48.58)
.
QUESTION
ADA
expression SQL qui définit cette géométrie, sans utiliser le format WKT
- c’est-à-dire la combinaison de fonctions PostGIS qui construisent la géométrie, valeur de type geometry
- ce n’est pas une ’’requête SQL’’ (pas de SELECT, DELETE, UPDATE, etc.) mais une ’’expression SQL’’ statique (qu’on peut coller derrière un SELECT pour l’évaluer) ; par exemple 2 + 2
est une expression statique tout comme sqrt(2 * (4 + pi()))
ou MakePoint(2, 3)
.
QUESTION
ADB
requête SQL (SELECT) retournant les communes intersectant (au sens précis du terme) l’étendue E
QUESTION
ADC
combien de communes retournées ?
QUESTION
ADD
PNG QGIS de la requête (via la création d’une vue)
QUESTION
ADE
requête SQL (SELECT) retournant les communes intersectant l’étendue E
au sens de l’opérateur &&
et en utilisant celui-ci (au lieu d’utiliser une fonction)
QUESTION
ADF
combien de communes retournées ?
QUESTION
ADG
PNG QGIS de la requête (via la création d’une vue)
À la lumière de la documentation et
de l’affichage superposé dans QGIS :
QUESTION
ADH
En quoi sont-ils différents ?
B
Générer des géométries dérivées
BA
Centroïdes
Trouvez dans la documentation de référence la fonction qui permet de calculer le point centroïde à partir d’un polygone.
QUESTION
BAA
nom de la fonction qui calcule un centroïde
QUESTION
BAB
requête SQL qui crée la vue communes_centroid
identique à la table communes
excepté la colonne de polygone geom
qui doit être remplacée par la colonne centroid
, qui est le centroïde respectif de chaque géométrie
BB
Généralisation de tracés
Créer la vue simplify
:
CREATE OR REPLACE VIEW simplify_003 AS
SELECT communes.id, ST_Simplify(communes.geom, 0.003::double precision) AS geom, communes.nom
FROM communes;
Puis la vue simplify_006
:
CREATE OR REPLACE VIEW simplify_006 AS
SELECT communes.id, ST_Simplify(communes.geom, 0.006::double precision) AS geom, communes.nom
FROM communes;
Afficher dans QGIS les couches dans cet ordre (la première est la plus haute) :
- simplify_006
avec le style : sans remplissage, bordure bleue
- simplify_003
avec le style : sans remplissage, bordure rouge
- communes
avec le style : sans remplissage, bordure verte
- puis zoomer à peu près sur le bois de Vincennes au sud-est de Paris.
QUESTION
BBA
PNG QGIS
Ces vues peuvent ensuite être supprimées de la base pour ne pas trop ralentir QGIS lorsqu’il scanne les couches à l’ajout d’une nouvelle couche PostGIS.
BC
Enveloppes
Créer les 2 vues suivantes :
CREATE OR REPLACE VIEW envelope AS
SELECT communes.id, ST_Envelope(communes.geom) AS geom, communes.nom
FROM communes;
CREATE OR REPLACE VIEW boundingcircle AS
SELECT communes.id, ST_MinimumBoundingCircle(communes.geom) AS geom, communes.nom
FROM communes;
Puis les ajouter à PostGIS comme pour BBA
, en bordure simple, rouge pour boundingcircle
et bleue pour envelope
.
QUESTION
BCA
PNG QGIS
BD
Couper sur l’enveloppe ou le radius
Créer la vue qui retourne toutes les communes intersectées avec le disque de centre PT
et de rayon 2.
- Le disque peut se construire d’un point augmenté d’un
ST_Buffer
QUESTION
BDA
le code SQL du SELECT
QUESTION
BDB
PNG QGIS
Créer la vue qui retourne toutes les communes intersectées avec l’étendue E
(c’est-à-dire : le produit de l’intersection de chaque commune avec l’étendue E
).
QUESTION
BDC
le code SQL du SELECT
QUESTION
BDD
PNG QGIS
QUESTION
BDE
type de la valeur de retour de la fonction
ST_Intersects