Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Tue 19 March 2024 11:43

Delph38
Juste Inscrit !
Date d'inscription: 19 Mar 2024
Messages: 1

Tables avec heritage dans une BDD Postgresql/Postgis

Bonjour,

Je cherche à créer une base de données dont une table comportera des données spatiales. J'aurais aimé stocker dans cette table à la fois des points, des lignes et des polygones. J'ai donc défini une GeometryCollection pour le champ the_geom de cette table.

Code:

CREATE TABLE IF NOT EXISTS delph.rest
(
rest_id text
the_geom geometry(GeometryCollection,3857)
)

Mais pour entrer des données dans cette table, je vais passer par QGis. Comme les collections ne sont pas prises en charge par QGis (pas en modification en tout cas, je n'arrive pas à insérer des données dans la table REST depuis QGis), je suis partie sur la création de tables enfants (héritage de la table REST) : REST_POINT, REST_LIGNE, REST_POLYGON.

Code:

CREATE TABLE delph.rest_point (
) 
INHERITS (delph.restauration)
ALTER TABLE delph.rest_point
ALTER COLUMN the_geom TYPE geometry(Point,3857)

J'obtiens alors ma table enfant REST_POINT mais le champ the_geom est encore en GeometryCollection, j'utilise donc les lignes de code suivantes pour changer la géométrie en points :

Code:

ALTER TABLE delph.rest_point
ALTER COLUMN the_geom TYPE geometry(Point,3857)

PgAdmin me retourne alors une erreur : le champ the_geom des enfants doit être semblable à celui de la table parent.

Code:

ERROR:  ne peut pas modifier la colonne héritée « the_geom »
SQL state: 42P16

Est-ce que je commets une erreur quelque part ou il est impossible d'avoir des tables enfants dont la géométrie diffère de celle de la table parent ?

Merci d'avance pour votre temps sur ce problème !

Hors ligne

 

#2 Tue 19 March 2024 12:00

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3197
Site web

Re: Tables avec heritage dans une BDD Postgresql/Postgis

Bonjour,
Définissez une table comportant plusieurs champs géométrie et évitez les id en varchar, plutôt numérique c'est mieux.

CREATE TABLE IF NOT EXISTS delph.rest
(
rest_id serial
)


Ensuite

SELECT AddGeometryColumn(monschema,matable,'the_point', SRID  ,'POINT',2);
SELECT AddGeometryColumn(monschema,matable,'the_line', SRID  ,'LINESTRING',2);
SELECT AddGeometryColumn(monschema,matable,'the_shape', SRID  ,'POLYGON',2);


Dans l'explorateur de QGis vous aurez trois fois la table, chaque fois avec une géométrie différente.


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#3 Thu 21 March 2024 10:47

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Tables avec heritage dans une BDD Postgresql/Postgis

Bonjour,

Pour créer une table pouvant stocker tout type de geometries, utilisez le type simple "geometry" et pas geometryCollection.

Pour éditer la table dans qgis, charger la table avec dbmanager, en forcant le type de la geom suivant le type d'objet qu'on veut éditer
(sera limité a des geom simples, pas multi*).

Code:

CREATE TABLE IF NOT EXISTS rest (
    rest_id int generated always as identity primary key ,
    the_geom geometry(geometry,3857)
);

Pour une clé primaire de type autoincrémentée, il faut mieux utiliser la forme "generated always as identity" plutot que serial: c'est plus propre si on renomme les tables, c'est normé SQL.

Nicolas

Hors ligne

 

#4 Thu 21 March 2024 11:04

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Tables avec heritage dans une BDD Postgresql/Postgis

Vous pouvez aussi passer par des vues définies sur votre table, représentant chaque type de géometrie: rest_pt, rest_ln, rest_pg
En mettant des triggers INSTEAD OF sur les vues, vous pouvez les rendre éditables: le trigger insèrera/modifiera la ligne de la vue dans la vraie table.

Nicolas

Hors ligne

 

Pied de page des forums

Powered by FluxBB