3 votos

Activar PostGIS QGIS

Tengo 2 capas en PostGIS: una capa de puntos llamada 'tdia' y una capa de polígonos llamada 'com': -la capa com contiene el nombre de la ciudad. (Polígono) -la capa tdia contiene las paradas de autobús. (punto) Quiero crear un trigger en mi capa tdia que permita recuperar el nombre de la ciudad después de crear una parada de autobús.

Mi código no funciona:

CREATE TABLE tdia (gid SERIAL NOT NULL PRIMARY KEY, numero
VARCHAR(5), CODE_INSEE VARCHAR(5), NOM_COM VARCHAR(50), date DATE, geom geometry(point, 2154))

CREATE OR REPLACE FUNCTION maj_tdia()
RETURNS "trigger" AS
$BODY$
BEGIN
UPDATE tdia SET CODE_INSEE =
(SELECT com.CODE_INSEE
FROM com, tdia
WHERE st_intersects (tdia.geometry, com.geometry));
END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER maj_tdia BEFORE INSERT OR UPDATE
ON tdia
FOR EACH ROW
EXECUTE PROCEDURE maj_tdia();

¿Qué estoy haciendo mal?

8voto

mathieu Puntos 53

No lo hagas UPDATE las tablas, basta con establecer el valor del NEW registro; el NEW (y OLD en UPDATES ) se pasa a la función para cada fila y contendrá el conjunto completo de valores al que se dirige el UPDATE/INSERT . BEFORE(/AFTER) Los desencadenantes aceptan entonces un registro (manipulado) de sus funciones para ser insertado/actualizado (en su lugar):

CREATE OR REPLACE FUNCTION maj_tdia()
RETURNS TRIGGER AS
$BODY$
  BEGIN
    NEW.code_insee := (
      SELECT code_insee
      FROM   com
      WHERE  ST_Intersects(com.geometry, NEW.geometry)
    );
    RETURN NEW;
  END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER maj_tdia
BEFORE INSERT OR UPDATE
ON tdia
FOR EACH ROW
EXECUTE PROCEDURE maj_tdia();

Permítanme añadir:

Podría ser útil separar INSERT y UPDATE en este contexto; por ejemplo, si se actualiza sólo el nombre de una estación de autobuses, no es necesario calcular la intersección, especialmente si las tablas de destino son grandes.

Puede especificar que el activador sólo se dispare cuando geometry se refiere directa o implícitamente dentro de la UPDATE (y en realidad difiere de la geometría almacenada):

CREATE TRIGGER maj_tdia_ins
    BEFORE INSERT
    ON tdia
    FOR EACH ROW
    EXECUTE PROCEDURE maj_tdia();

CREATE TRIGGER maj_tdia_upd
    BEFORE UPDATE
    OF geometry
    ON tdia
    FOR EACH ROW
    WHEN (ST_Equals(NEW.geometry, OLD.geometry) = false)
    EXECUTE PROCEDURE maj_tdia();

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X