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 :

1
CREATE TABLE commune
2
(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 :

1
DEFAULT nextval('commune_id_seq'::regclass)

Création de la séquence :

1
CREATE SEQUENCE public.commune_id_seq
2
    INCREMENT 1
3
    START 1
4
    MINVALUE 1
5
    MAXVALUE 2147483647
6
    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 :

1
CONSTRAINT "COMMUNE_pkey" PRIMARY KEY (id)

Création de la clé primaire :

1
ALTER TABLE public.commune
2
    ADD CONSTRAINT commune_pkey PRIMARY KEY (id);

Les droits accordés à chaque utilisateur sur la table :

1
ALTER TABLE public.commune
2
    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 :

1
geom geometry(MultiPolygon,2154),

Création de la géométrie :

1
ALTER TABLE public.commune
2
    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 table spatial_ref_sys

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.

La vue geometry_columns

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) :

1
CREATE INDEX sidx_commune_geom
2
    ON public.commune USING gist
3
    (geom)
4
    TABLESPACE pg_default;

RemarqueLa 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) :

1
SELECT ST_Distance(
2
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 :

1
SELECT ST_Distance(
2
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