Définition SQL d'une table vectorielle géométrique
Définition d'une table
Toujours d'après l'exemple de la table des communes, nous allons décomposer les éléments qui la caractérisent.
Toute table dispose de ses informations de base :
CREATE TABLE commune
(id integer NOT NULL, id_bdcarto integer, [...] );
A ces informations de bases sont ajoutés :
La séquence qui donnera une valeur automatiquement à id lors d'un nouvel enregistrement :
DEFAULT nextval('commune_id_seq'::regclass)
Création de la séquence :
CREATE SEQUENCE public.commune_id_seq
INCREMENT 1
START 1
MINVALUE 1
MAXVALUE 2147483647
CACHE 1;
Ici, la valeur d'un nouvel enregistrement sera la dernière valeur (19),à laquelle on ajoutera 1 (suite arithmétique [u(n+1) = u(n) + 1]).
La clé primaire :
CONSTRAINT "COMMUNE_pkey" PRIMARY KEY (id)
Création de la clé primaire :
ALTER TABLE public.commune
ADD CONSTRAINT commune_pkey PRIMARY KEY (id);
Les droits accordés à chaque utilisateur sur la table :
ALTER TABLE public.commune
OWNER to postgres;
Définition de la géométrie
Les tables géométriques possèdent les éléments supplémentaires suivants :
La géométrie :
geom geometry(MultiPolygon,2154),
Création de la géométrie :
ALTER TABLE public.commune
ADD COLUMN geom geometry(MultiPolygon,2154);
La géométrie est définie par le type d'entité et la projection de la table. Ces deux éléments sont dépendants des métadonnées : la table spatial_ref_sys et la vue geometry_columns
La table spatial_ref_sys
Cette table contient l'ensemble des systèmes de références spatiales selon les spécifications de l'OGC. L'identifiant unique (SRID) puise sa définition dans cette table.
La vue geometry_columns
Cette vue est l'objet interrogé par les clients tels que QGIS lorsque l'on se connecte à une base PostGIS.
En se positionnant sur la vue, et en appuyant sur le bouton « afficher les données de l'objet séléctionné », on obtient la liste et les caractéristiques de toutes les tables géométriques présentes dans la base de données.
Les trois premières colonnes (f_table_catalog, f_table_schema, f_table_name) caractérisent l'emplacement des tables géométriques.
La colonne f_geometry_column indique la colonne qui contient la géométrie des objets.
Les colonnes coord_dimension et srid correspondent à la dimension et au système de référence spatiale (un SRID = '-1' indique que la table est spatiale mais que le SRID n'a pas été indiqué).
La colonne f_geometry_column définit la géométrie (plus précisément le type) des objets de la table considérée.
L'index spatial (éventuellement) :
CREATE INDEX sidx_commune_geom
ON public.commune USING gist
(geom)
TABLESPACE pg_default;
Remarque : La vue geography_columns
Lors de l'utilisation des coordonnées sphériques (comme c'est le cas pour une table en WGS84 – EPSG : 4326), l'enregistrement en table géométrique empêche le calcul des aires, périmètres et longueurs. En effet, les longueurs sont calculées en degrés (unité de mesure du WGS84). Par exemple, la commande ci-dessous renvoie comme résultat : 0,378 (degrés) :
SELECT ST_Distance(
ST_GeometryFromText('POINT(4.97319974206166 44.7404626848999)',4326), ST_GeometryFromText('POINT(5.25885261886736 44.4928901639178)',4326));
De plus, les méridiens se resserrant aux pôles altèrent encore plus ce résultat qui devient dénué de sens.
L'enregistrement d'une telle table géographique au lieu de géométrique permet de palier à ces distorsions et à ces non-sens ; ainsi, la commande ci-dessous renverra 35649,8 mètres :
SELECT ST_Distance(
ST_GeographyFromText('POINT(4.97319974206166 44.7404626848999)'), ST_GeographyFromText('POINT(5.25885261886736 44.4928901639178)'));
La création d'une table géographique en 4326 (geography(geometry)) ajoutera une ligne dans la vue geography_columns au lieu de geometry_columns