Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PostgreSQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=42)
-   -   trigger con tablas espaciales (https://www.clubdelphi.com/foros/showthread.php?t=96746)

manuelfec 15-06-2024 21:51:43

trigger con tablas espaciales
 
Hola comunidad, espero que se encuentren todos bien, acudo a ustedes en busca de ayuda, estoy intentando realizar estos triggers pero no he podido, por favor ayúdenme.

Ya tengo la extension a postgis y el SRID es metrico

estoy utilizando Postgres

Tengo una tabla de zonificación de geometría tipo polígono con una columna llamada área_iluminada, también tengo una tabla de alumbrado_publico de geometría tipo punto con una columna llamada cobertura. Quiero crear un disparador que almacene en la columna Illuminated_area el área que se superpone entre los polígonos de zonificación y la unión de los polígonos resultantes del buffer alumbrado_publico cuya distancia del buffer es la cobertura. teniendo en cuenta que puedo modificar la posición de los puntos o la cobertura por lo que debe ser actualizable.

he llegado al siguinte codigo pero no funciona, area_iluminada sigue dando null:

Código SQL [-]
Función para calcular el área iluminada y actualizar zonificacion
CREATE OR REPLACE FUNCTION calcular_area_iluminada() RETURNS TRIGGER AS $$
BEGIN
    -- Actualizar el área iluminada en zonificacion
    UPDATE zonificacion z
    SET area_iluminada = ST_Area(ST_Intersection(z.geom, buffer_alum.geom))
    FROM (
        SELECT ST_Union(ST_Buffer(geom, cobertura)) AS geom
        FROM alumbrado_publico
    ) AS buffer_alum
    WHERE ST_Intersects(z.geom, buffer_alum.geom);

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- Trigger para INSERT en alumbrado_publico
CREATE TRIGGER calcular_area_iluminada_insert
AFTER INSERT ON alumbrado_publico
FOR EACH ROW
EXECUTE FUNCTION calcular_area_iluminada();

-- Trigger para UPDATE en alumbrado_publico
CREATE TRIGGER calcular_area_iluminada_update
AFTER UPDATE ON alumbrado_publico
FOR EACH ROW
EXECUTE FUNCTION calcular_area_iluminada();

-- Trigger para DELETE en alumbrado_publico
CREATE TRIGGER calcular_area_iluminada_delete
AFTER DELETE ON alumbrado_publico
FOR EACH ROW
EXECUTE FUNCTION calcular_area_iluminada();

duilioisola 17-06-2024 16:56:20

No conozco postgis, pero quizás te pueda dar algún consejo para debugar...

Primero pon una excepción o algo que de error dentro de la función para asegurarte de que pasa por ella.

Por otro lado puedes hacer una tabla DEBUG(TIMESTAMP, VARCHAR(256)) y dentro de la función vas haciendo un INSERT con información que te ayude a saber los valores que se van manejado.

Por ejemplo :
  • podrías guardar el resultado de ST_Area(ST_Intersection(z.geom, buffer_alum.geom)) para ver si devuelve nulos.
  • podrías guardar un SELECT COUNT(*) FROM ... WHERE ST_Intersects(z.geom, buffer_alum.geom) para ver cuantos registros se están modificando.

Espero que esto te ayude...


La franja horaria es GMT +2. Ahora son las 09:23:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi