Annonce
Pour sa 21ème année, l’association GeoRezo a toujours besoin de vous !
10€ = 1 mois de frais bancaires ; 15€ = 12 mois de nom de domaine ; 30€ = 1 semaine de location des serveurs …
Retrouver nos membres bienfaiteurs
#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: 3200
- 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