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

Printemps des cartes 2024

#1 Fri 09 October 2015 17:27

gregorybodet
Participant occasionnel
Date d'inscription: 9 Oct 2015
Messages: 18

POSTGIS - Règles de modifications sur une vue (Pb)

Bonjour,

J'ai un problème de mise à jour de géométrie en passant par des règles sur une vue.

Structure des tables :
1 table (nommée o) qui contient mes objets avec 2 champs (idgeo et geom)
1 table (nommée a) qui contient mes données attributaires avec x champs dont idgeo.

Je structure de cette façon car ma table objet interagit avec plusieurs données attributaires gérés par plusieurs services.

Pour accéder aux données de géométries et d'attributs, je créé une vue et sur cette vue j'y intègre des règles d'insertions et de modifications. Les règles d'insertions fonctionnent très bien.

En revanche, la règle de modification pose pb :
- je saisie 2 polygones (ça marche, cf ci-dessous), et j'enregistre
- je modifie une 1ère fois le polygone 100 (ça marche cf ci-dessous), et j'enregistre
- je modifie le polygone 200 et pb : il me garde la géométrie origine du 200, mais il me stocke la géométrie du 200 que je voulais modifier dans le 100 et le 100 d'origine a disparu

Je travaille avec :
PostGis 2.0
QGis 2.4.0

Voici la règle de modification

CREATE OR REPLACE RULE objet_modif_oa AS
ON UPDATE TO vue
    DO INSTEAD UPDATE o SET
    o.geom = new.geom
WHERE o.idgeo = new.idgeo; -- j'ai essayé avec old, mais le pb est le même.


Si qqun à une piste, je suis preneur car la modification des données alphanumériques par ce système fonctionne très bien.

Cordialement

Hors ligne

 

#2 Mon 12 October 2015 11:17

jonathan
Participant assidu
Date d'inscription: 16 May 2006
Messages: 263

Re: POSTGIS - Règles de modifications sur une vue (Pb)

Bonjour,

si idgeo est stable, il ne devrait pas y avoir de difficulté.

J'écrirais :

Code:

where new.idgeo = old.idgeo

Dernière modification par jonathan (Mon 12 October 2015 11:18)

Hors ligne

 

#3 Mon 12 October 2015 12:12

gregorybodet
Participant occasionnel
Date d'inscription: 9 Oct 2015
Messages: 18

Re: POSTGIS - Règles de modifications sur une vue (Pb)

jonathan a écrit:

Bonjour,

si idgeo est stable, il ne devrait pas y avoir de difficulté.

J'écrirais :

Code:

where new.idgeo = old.idgeo


Je viens de tester cette solution

Code:

CREATE OR REPLACE RULE objet_modif_oa AS
ON UPDATE TO vue
    DO INSTEAD UPDATE o SET
    o.geom = new.geom
WHERE new.idgeo = old.idgeo;

Je suis jeté par la base

Code:

 ERROR:  duplicate key value violates unique constraint "an_urbproj_site_ope_pkey"
    DETAIL:  Key (idgeo)=(200) already exists.

Je cherche toujours de mon côté mais sans succès jusqu'à présent. Pourtant les mises à jour fonctionnent sur ma table attributaire.

Cordialement

Hors ligne

 

#4 Mon 12 October 2015 14:12

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

Re: POSTGIS - Règles de modifications sur une vue (Pb)

Bonjour,

Quelles sont les définitions de vos tables ?

Dans la définition de votre rule, ca devrait etre plutot:

Code:

DO INSTEAD UPDATE o SET geom = new.geom
    WHERE idgeo = new.idgeo;

Il y a une erreur avec la notation o.geom = new.geom (o etant considéré comme une colonne de la table o...)

Le test suivant marche (avec idgeo int ou serial):

Code:

 drop table if exists o CASCADE ;
create table o (
  idgeo serial PRIMARY KEY,
  geom GEOMETRY (POINT, 2154)
);

drop table if exists a;
create table a (
  idgeo serial PRIMARY KEY,
  attr1 text
);

insert into o (geom) values ('srid=2154;POINT(0 0)'::geometry);
insert into a (attr1) values ('value 1');

drop view if exists voa;
create view voa as select o.idgeo, a.attr1, o.geom from a join o on a.idgeo = o.idgeo;

CREATE OR REPLACE RULE objet_modif_oa AS
ON UPDATE TO voa
    DO INSTEAD UPDATE o SET geom = new.geom
    WHERE idgeo = new.idgeo;

update voa set geom = 'srid=2154;POINT(1 1)'::geometry
where idgeo = 1;

select idgeo, attr1, st_astext(geom)
from  voa;

Nicolas

Hors ligne

 

#5 Mon 12 October 2015 15:25

gregorybodet
Participant occasionnel
Date d'inscription: 9 Oct 2015
Messages: 18

Re: POSTGIS - Règles de modifications sur une vue (Pb)

Bonjour,

Je viens de tester votre proposition sans succès(toujours le pb). Je suis sur des polygones. Je vous joint ci-dessous mon code simplifié à 2 champs.

Code:

-- table des objets
CREATE TABLE geo_objet_peri_ope(
    idgeo character varying(20) NOT NULL,
    geom geometry(POLYGON, 2154) NOT NULL,
    CONSTRAINT geo_objet_peri_ope_pkey PRIMARY KEY (idgeo)
    );

-- table des attributs
CREATE TABLE an_urbproj_site_ope(
    idgeo character varying(20) NOT NULL,
    l_nom character varying(100),
    CONSTRAINT an_sa_p_site_pkey PRIMARY KEY (idgeo)
    );

-- vue d'affichage
CREATE OR REPLACE VIEW geo_v_site_ope AS
SELECT
    row_number() over() as gid,
    o.idgeo,
    so.l_nom,
    o.geom
FROM
    an_urbproj_site_ope so, geo_objet_peri_ope o
WHERE
    so.idgeo=o.idgeo;

-- règle pour l'insertion
CREATE OR REPLACE RULE objet_insert_peri_ope AS
    ON INSERT TO 
    geo_v_site_ope 
    DO INSTEAD INSERT INTO 
    geo_objet_peri_ope (idgeo,geom) 
    VALUES 
    (
    new.idgeo, 
    new.geom 
    );

CREATE OR REPLACE RULE metier_insert_site_ope AS
    ON INSERT TO 
    geo_v_site_ope
    DO INSTEAD INSERT INTO 
    an_urbproj_site_ope (idgeo,l_nom) 
    VALUES
    (
    new.idgeo, 
    new.l_nom
    );

-- règle pour la mise à jour
CREATE OR REPLACE RULE objet_modif_peri_ope AS
 ON UPDATE TO geo_v_site_ope
    DO INSTEAD UPDATE geo_objet_peri_ope SET
    idgeo = new.idgeo,
    geom = new.geom
WHERE idgeo = new.idgeo;

CREATE OR REPLACE RULE metier_modif_site_ope AS
 ON UPDATE TO geo_v_site_ope
    DO INSTEAD UPDATE an_urbproj_site_ope SET 
    idgeo = new.idgeo, 
    l_nom = new.l_nom 
WHERE idgeo = new.idgeo;

L'insertion et la mise à jour se fait directement dans QGIS. La mise à jour des attributs sans modifier la géométrie se passe bien.
Pour le champ IDGEO, je le laisse en varchar (car il devrait être calculé pour définir un identifiant unique de géométrie), mais je saisie 1, 2,3 à la saisie.

Cordialement

Hors ligne

 

Pied de page des forums

Powered by FluxBB