SGBD et extensions spatiales Présentation de PostGIS

publicité
SGBD et extensions spatiales
Présentation de PostGIS
Le modèle relationnel et les objets spatiaux
Stockage de l'information spatiale
Les opérateurs spatiaux
PostGIS, l'extension spatiale de PostgreSQL
Thérèse Libourel
Samuel Andrés
Nikolay Sirakov
SGBD et extensions spatiales
Les SGBD relationnels sont conçus d’abord pour manipuler des
données de type texte, numérique ou date
id culture
parcelle
Extension nécessaire pour :
1
blé
2
blé
3
maïs
4
vigne
• Gérer les systèmes de coordonnées
5
tournesol
• Créer des index spatiaux
Oracle
MySQL
Extension spatiale
SQLServer
PostgreSQL
• Stocker la géométrie
• Manipuler la géométrie
Oracle Spatial (depuis V7 en 1992)
MySQL GIS (intégré depuis V4.0.1 en 2003)
SQLServer Spatial (intégré depuis 2008)
PostGIS (première apparition en 2001)
2
Extensions spatiales et le modèle relationnel
Besoin : nécessité de supporter des données géographiques dans un SGBD
Contrainte : conserver la compatibilité avec l'existant par extension du modèle
relationnel
Solution : ajouter la possibilité de stocker dans les tables des objets
géographiques grâce à des nouveaux types d'attributs et des fonctions
SQL spécifiques pour les manipuler
Ces types complexes ne respectent pas la première forme normale car ils
peuvent contenir des attributs multivalués
3
Le modèle des SGBD Relationnels
Théorie formulée par Edgar F. Codd en 1970, basée sur les ensembles
{ 1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10,11,12,13,14,15,16 }
= nombres
{ blé, maïs, colza, tournesol, vigne, verger }
= cultures
{
,
,
,
,
,
,
,
{ Marie, Robert, Georges, John, Céline, Franck }
}
= polygones
= noms
4
Le modèle des SGBD Relationnels
1
2
3
4
5
6
7
8
blé
blé
John
maïs
John
vigne
Céline
tournesol
Franck
blé
Céline
vigne
John
verger
Georges
Robert
5
Manipulation de données en SQL
Projection
SELECT id , parcelle FROM occup_sol ;
occup_sol
id culture
parcelle
1
blé
1
2
blé
2
3
maïs
3
4
vigne
4
5
tournesol
5
6
blé
6
7
vigne
7
8
verger
8
6
Manipulation de données en SQL
Restriction
SELECT * FROM occup_sol WHERE culture = ‘blé’;
occup_sol
id culture
parcelle
1
blé
1
blé
2
blé
2
blé
3
maïs
6
blé
4
vigne
5
tournesol
6
blé
7
vigne
8
verger
7
Manipulation de données en SQL
Jointure
SELECT * FROM occup_sol,exploitant WHERE id = id_parc;
exploitant
occup_sol
id culture
parcelle
id_ex nom_ex
id_parc
1
blé
12
John
1
2
blé
7
Gérard
1
3
maïs
14
Céline
3
4
vigne
19
Franck
4
5
tournesol
15
Isabelle
4
id = id_parc
3
maïs
14
Céline
4
vigne
19
Franck
8
Manipulation de données en SQL
Projection et résultat dans une nouvelle relation
CREATE TABLE parc AS (SELECT id , parcelle FROM occup_sol);
occup_sol
id culture
parcelle
parc
id parcelle
1
blé
1
2
blé
2
3
maïs
3
4
vigne
4
5
tournesol
5
6
blé
6
7
vigne
7
8
verger
8
9
Stockage de l’information spatiale
Simple Feature Specification de l’Open Géospatial Consortium
Open Geospatial Consortium ( http://www.opengeospatial.org/ )
Simple Feature Specification.
10
Stockage de l’information spatiale
Éléments simples
Éléments ponctuels
POINT (44 855)
Éléments linéaires
LINESTRING (40 798, 72 808, 87 797, 122 812, 138 812)
Éléments surfaciques
POLYGON ((148 749, 147 735, 172 735, 174 750, 148 749))
11
Stockage de l’information spatiale
Éléments composés
Éléments ponctuels composés
MULTIPOINT (332.251 691.235, 333.256 682.546, ... ,
328.874 659.415)
Éléments linéaires composés
MULTILINESTRING (( 292.487 904.395, 298.529
906.226 ), ...,
( 316.104 906.226, 318.301
905.677, 321.414 905.677, 327.638 904.029))
Éléments surfaciques composés
MULTIPOLYGON ((( 294.096 872.146, ...
, 294.096 872.146), ..., (( 322.115 866.840,
... , 322.115 866.840 )))
12
Stockage de l’information spatiale
Formats de stockage
•
Well Known Text (WKT)
Représentation textuelle
de données géographiques
– Objets spatiaux
– Systèmes de coordonnées
Il s'agit en général du format utilisé par l'utilisateur pour interagir avec le SGBD
13
Stockage de l’information spatiale
Formats de stockage
•
Well Known Binary (WKB)
Représentation binaire compacte de données géographiques : chaque objet
spatial est représenté par un ensemble d'octets
Exemple : la valeur WKB correspondant à POINT(1 1) est la séquence
0101000000000000000000F03F000000000000F03F
où
01 = type de stockage (byte order)
01000000 = type de géométrie (Point, LineString, Polygon, …)
000000000000F03F = coordonnée X
000000000000F03F = coordonnée Y
Il s'agit du format utilisé en interne par le SGBD pour stocker les objets
14
Les opérateurs spatiaux
Opérations spatiales de comparaison
A et B sont Disjoint
A
A Touche B
A et B sont en
Intersection
A Contient B
B
Résultat = vrai ou faux
15
Les opérateurs spatiaux
Opérations spatiales produisant des valeurs ou des nouvelles géométries
Distance
Valeur numérique
Zone tampon
(buffer)
Intersection
Découpage
Union
Différence
Nouvelle entité géographique
16
PostGIS l'extension spatiale de PostgreSQL
PostGIS permet la manipulation d'informations spatiales sous forme de
géométries avec le SGBD PostgreSQL
Disponible sous licence libre GNU/GPL
Multi plateforme (Unix, Linux, Windows, Mac)
Première version en 2001, dernière version : 2.1.1 (8 novembre 2013)
Développement communautaire actif avec des mises à jour fréquentes (la
version 2 a apporté de nombreuses améliorations)
Propose des fonctions spécifiques pour faire des requêtes SQL spatiales
http://fr.wikipedia.org/wiki/PostGIS
17
PostGIS l'extension spatiale de PostgreSQL
Permet le stockage des objets géographiques conformément aux
standards de l'OGC (Point, Multipoint, Linestring, Multilinestring, Polygon,
Multipolygon et GeometryCollections) aux formats WKT/WKB
S'appuie sur des bibliothèques complémentaires : GDAL (formats raster),
OGR (formats vecteur), PROJ4 (projections), GEOS (opérations
géométriques)
Gestion des systèmes de projection grâce aux identifiants SRID (Spatial
Referencing IDentifier)
18
Prise en compte de PostGIS dans une base PostgreSQL
Ajout du langage plpgsql utilisé par les fonctions spatiales
createlang
OU
plpgsql
CREATE LANGUAGE
ma_base
plpgsql;
depuis une console (DOS ou unix)
après connexion à la base de données
Ajout des fonctions spatiales
psql -d ma_base -f chemin/postgis.sql
depuis une console (DOS ou unix)
Ajout des systèmes de coordonnées
psql -d ma_base -f chemin/spatial_ref_sys.sql
depuis une console (DOS ou unix)
Depuis PostgreSQL 9.1
psql -d ma_base -c 'CREATE EXTENSION postgis'
depuis une console
OU
CREATE EXTENSION postgis;
après connexion à la base de données
19
Stockage de l’information géographique dans PostGIS
•
La table de méta-données SPATIAL_REF_SYS
– Liste les systèmes de référence spatiale (SRS) et les systèmes de
projection cartographiques
– Schéma :
SRID = identifiant du SRS dans PostGIS
AUTH_NAME = nom de l'autorité gestionnaire du SRS (ex : EPSG)
AUTH_SRID = identifiant du SRS défini par l'autorité
SRTEXT = représentation WKT du SRS
PROJ4TEXT = définition des coordonnées PROJ4 du SRS
– Un grand nombre de systèmes de référence est déjà disponible dans
PostGIS
20
Stockage de l’information géographique dans PostGIS
•
La table vue de méta-données GEOMETRY_COLUMNS
– Liste les tables contenant des colonnes spatiales
– Schéma :
F TABLE CATALOG, F TABLE SCHEMA, F TABLE NAME = nom
totalement qualifié de la table contenant la colonne géométrique
F GEOMETRY COLUMN = nom de la colonne géométrique dans la table
COORD DIMENSION = dimension spatiale de la colonne (2, 3 ou 4)
SRID = identifiant du SRS de la colonne (clé étrangère vers
SPATIAL_REF_SYS)
TYPE = type d'objets géométriques (Point, Linestring, Polygon, ...)
Depuis PostGIS 2, ce n'est plus une table mais une vue branchée sur les
catalogues système de PostgreSQL
21
Ajout d'une colonne spatiale dans une table
Avec l'opérateur AddGeometryColumn
SELECT AddGeometryColumn
('nom_table','nom_colonne_spatiale',SRID,'type_objet_spatial',NB_DIM);
avec
SRID = identifiant du système de référence spatial (voir table spatial_ref_sys)
type_objet_spatial = POINT, LINESTRING, POLYGON, ...
NB_DIM = nombre de dimensions de la géométrie (2, 3 ou 4D)
En déclarant directement une colonne de type géométrique (depuis PostGIS 2)
ALTER TABLE nom_table ADD COLUMN the_geom geometry(Point,2154);
CREATE TABLE nom_table (
att1 integer not null PRIMARY KEY,
att2 varchar(50),
the_geom geometry(Point,2154)
);
22
Ajouts d'objets géométriques dans une table
La fonction ST_GeometryFromText permet de décrire un objet
géométrique à partir de sa définition en WKT
Ajout d'un enregistrement dans une table contenant colonne spatiale POINT
INSERT INTO nom_table
VALUES ('', 'Colonne1', 'Colonne2', ST_GeometryFromText ('POINT(25 10)', SRID));
Remplissage d'une colonne spatiale POINT à partir de colonnes numériques (X,Y)
UPDATE nom_table SET nom_colonne_spatiale = ST_GeometryFromText ('POINT(' || X || ' ' || Y || ')',
SRID);
23
Vues et index spatiaux
Création d’une vue contenant une colonne spatiale
CREATE VIEW prix_eau_commune AS (
SELECT pe.num_insee, pe.nom_commune, com.the_geom, com.gid
FROM prix_eau AS pe, commune AS com
WHERE pe.num_insee = com.insee_comm
);
INSERT INTO geometry_columns
VALUES ('','public','prix_eau_commune','the_geom',2,4326,'MULTIPOLYGON');
Pas nécessaire dans PostGIS 2
Création d’un index spatial
CREATE INDEX commune_gidx ON commune
USING GIST ( the_geom GIST_GEOMETRY_OPS_2D);
24
PostGIS et le format Shapefile
Importation de données à partir d’un fichier au format Shapefile
shp2pgsql –s srid shapefile nom_table > fichier.sql
shp2pgsql –s 2975 canne.shp canne > canne.sql
psql –U postgres –f canne.sql ma_base
OU
shp2pgsql –s 2975 canne.shp canne | psql -U postgres -d ma_base
Exportation de données vers un fichier au format Shapefile
pgsql2shp –f shapefile nom_base nom_table
pgsql2shp –f shapefile nom_base requête
pgsql2shp -f canne.shp ma_base canne
pgsql2shp -f canne.shp ma_base "SELECT * FROM canne"
25
Les opérateurs non spatiaux
•
Opérateurs de comparaison
Et : AND
Ou : OR
Ou exclusif : XOR
Non : NOT
SELECT nomCom FROM commune WHERE
numInsee < 100000 AND surfaceCom > 35000;
•
Opérateurs statistiques
Maximum : MAX
Minimum : MIN
Nombre d'entités : COUNT
Moyenne : AVG
Somme : SUM
SELECT MIN(longueur) FROM riviere;
26
Les opérateurs spatiaux dans PostGIS
Opérateurs spatiaux de comparaison
A et B sont Disjoint
A
A Touche B
A et B sont en
Intersection
A Contient B
B
ST_Disjoint (A,B)
ST_Touches (A,B)
ST_Intersects (A,B)
ST_Contains (A,B)
ST_Within (B,A)
Déterminer si une géométrie est vide = ST_IsEmpty(A)
http://postgis.net/docs/reference.html
27
Les opérateurs spatiaux dans PostGIS
Opérateurs spatiaux produisant des valeurs ou des nouvelles géométries
Zone tampon
(buffer)
Distance
Intersection
Découpage
ST_Intersection (A,B) ST_Difference (A,B)
Union
ST_Union (A,B)
ST_Distance (A,B)
Différence
ST_SymDifference (A,B)
ST_Buffer (A,rayon)
http://postgis.net/docs/reference.html
28
Les opérateurs spatiaux dans PostGIS
Opérateurs spatiaux produisant des valeurs ou des nouvelles géométries
Afficher le SRID d'une colonne spatiale = ST_SRID(geom)
Afficher la dimension d'une colonne spatiale = ST_Dimension(geom)
Afficher le type de géométrie d'une colonne spatiale = ST_GeometryType(geom)
Calcul d'aire = ST_Area(geom)
Calcul de périmètre = ST_Perimeter(geom)
Calcul de la longueur = ST_Length(geom)
Rectangle englobant d'une géométrie = ST_Extent(geom)
Coordonnées min et max d'une géométrie = ST_XMax(geom), ST_XMin(geom),
ST_YMax(geom), ST_YMin(geom)
http://postgis.net/docs/reference.html
29
Quelques exemples de requêtes spatiales
Fonctions de test sur un attribut spatial
SELECT r.numero FROM routes AS r, parc AS p WHERE ST_Intersects(r.the_geom, p.the_geom);
SELECT nom_commune, the_geom FROM commune
WHERE ST_Distance(the_geom, ST_GeometryFromText('POINT(750661 6277044)', 2154)) < 5000;
Fonctions produisant de nouvelles entités spatiales
SELECT ST_Buffer(the_geom,500) as buf FROM routes WHERE routeId = 'D 85';
UPDATE emprise SET the_geom = (SELECT ST_Buffer() …. ) ;
SELECT ST_Intersection(b.the_geom, c.the_geom) AS the_geom
FROM batiment b, commune c
WHERE ST_Intersects(b.the_geom, c.the_geom) AND c.nomCom = 'Montpellier';
30
Fonctions d’exportation
ST_AsEWKT(geometry)
ST_AsText(geometry)
ST_AsEWKB(geometry)
ST_AsBinary(geometry)
ST_AsSVG(geometry)
ST_AsGML(geometry)
ST_AsKML(geometry)
ST_AsGeoJson(geometry)
Well Known Text avec SRID (OGC)
Well Known Text sans SRID (OGC)
Well Known Binary avec SRID (OGC)
Well Known Binary sans SRID (OGC)
Scalable Vector Graphic (W3C)
Geographic Markup Language (OGC)
Keyhole Markup Language (Google)
Geo Javascript Object Notation
SELECT ST_AsGml(the_geom) FROM ma_table;
<gml:MultiPolygon srsName="EPSG:4326">
<gml:polygonMember>
<gml:Polygon>
<gml:outerBoundaryIs>
<gml:LinearRing>
<gml:coordinates>55.5172314264874,-20.9036305014517 55.5172432651491,-20.9036035094091 55.5172445661464,20.9036001790097 55.5172458671463,-20.9035968483398 </gml:coordinates>
</gml:LinearRing>
</gml:outerBoundaryIs>
</gml:Polygon>
</gml:polygonMember>
</gml:MultiPolygon>"
31
PostGIS installation sous Windows
Installation de PostgreSQL :
32
PostGIS installation sous Windows
Installation de PostGIS avec PostgreSQL 8.3 :
33
PostGIS installation sous Linux (Ubuntu)
sudo apt-get install postgresql-9.1-postgis postgis
34
Psql : interface d'administration en ligne de commande
35
PgAdmin : interface graphique d'administration
36
QuantumGIS : affichage et manipulation de couches PostGIS
37
Quelques ressources en ligne utiles sur PostGIS
Site de la communauté des utilisateurs francophones :
http://www.postgis.fr/
Site officiel (en anglais) :
http://postgis.refractions.net/
Documentation (en anglais):
http://postgis.net/documentation/
Wiki PostGIS (en anglais):
http://trac.osgeo.org/postgis/wiki/UsersWikiMain
Référence des fonctions et opérateurs PostGIS 2 (en anglais):
http://postgis.net/docs/reference.html
PgAdmin (interface graphique d'administration PostgreSQL/PostGIS) :
http://www.pgadmin.org/?locale=fr_FR
QuantumGIS (SIG permettant l'affichage de couches PostGIS) :
http://www.qgis.org
38
Téléchargement