Suite

Erreur de mise à jour des coordonnées du centre de gravité du polygone

Erreur de mise à jour des coordonnées du centre de gravité du polygone


Après une semaine de combats infructueux, je suis obligé de demander votre aide.

J'ai créé une table 't_excavations' avec les champs 'id_excavation', 'geom' (MULTIPOLYGONE), 'longitude', 'latitude'

CREATE TABLE public.t_excavations ( id_excavation serial NOT NULL PRIMARY KEY, longitude numeric (9,6), latitude numeric (9,6), geom public.geometry ) WITH ( OIDS = FALSE );

Ensuite, j'ai créé une règle pour mettre à jour automatiquement les colonnes 'longitude' et 'latitude' pour obtenir XY du centroïde du polygone que j'ajoute via QGIS

CRÉER OU REMPLACER LA RÈGLE "insert_longlat" COMME ON INSÉRER À "public".."t_excavations" FAIRE (MISE À JOUR t_excavations SET longitude = st_x(st_centroid(t_excavations.geom)); MISE À JOUR t_excavations SET latitude = st_y(st_centroid(t_excavations.geom))) ;

Cette règle fonctionne lorsque j'enregistre les modifications dans QGIS et que les coordonnées sont bien calculées

Maintenant, je veux mettre à jour les colonnes 'longitude' et 'latitude' si le champ 'geom' est modifié (par exemple si je déplace tout le polygone ou un seul sommet)

J'ai créé une fonction :

CRÉER OU REMPLACER LA FONCTION update_longlat() RETOURNE le déclencheur AS $BODY$ BEGIN NEW.longitude = ST_X(ST_Centroid(geom)); NEW.latitude = ST_Y(ST_Centroid(geom)); RETOUR NEUF ; FINIR; $BODY$ LANGUE plpgsql VOLATILE COST 100 ; ALTER FUNCTION update_longitude() PROPRIÉTAIRE À postgres;

et un déclencheur :

CRÉER LE DÉCLENCHEUR tr_update_longlat AVANT LA MISE À JOUR SUR t_excavations POUR CHAQUE LIGNE EXÉCUTER LA PROCÉDURE update_longlat();

Et maintenant, lorsque j'essaie d'ajouter un nouveau polygone ou de modifier un polygone existant dans QGIS, je reçois ce message d'erreur de postgres :

Impossible de modifier la couche t_excavations

Erreurs : ERREUR : 1 objet non ajouté.

Erreurs de la source :

Erreur PostGIS lors de l'ajout d'objets : ERREUR : la colonne "geom" n'existe pas LIGNE 1 : SELECT ST_X(ST_Centroid(geom)) ^ QUERY : SELECT ST_X(ST_Centroid(geom)) CONTEXTE : fonction PL/pgSQL update_longlat(), ligne 3 , opérateur d'assignation

Qu'est-ce que je fais de mal avec la fonction/le déclencheur ?


Je pense que votre fonction de déclenchement devrait ressembler à ceci :

$BODY$ DECLARE lat DOUBLE PRÉCISION ; lon DOUBLE PRÉCISION; ID ENTIER ; COMMENCER lat := ST_Y(ST_Centroid(NEW.geom)); lon := ST_X(ST_Centroid(NEW.geom)); id := NEW.id_excavation; MISE À JOUR t_excavations SET longitude=lon, latitude=lat WHERE id_excavation=id; RETOUR NULL ; FINIR; $CORPS$

et vous voudrez que le déclencheur soit défini comme APRÈS LA MISE À JOUR. Le "RETURN NULL" devrait empêcher une boucle de mise à jour sans fin.