Ola à lista,

Tenho o seguinte disparador para quando faço um INSERT de um novo registo
(polígono incêndio florestal) me crie 100 pontos regulares noutra tabela.
A dificuldade que encontro é em numerar esses pontos de 1 a 100, porque cada
vez que tento meter um generate_series(1,100) multiplica-me os 100 pontos
pela serie (de 1 a 100) e fico com 10000 pontos. Entendo que esse seja o
resultado lógico, embora não o desejado. Alguém tem uma sugestão para que
isto não ocorra?


--DROP TRIGGER trg_escv_incendios_todos_subtablas ON
sch_ambiente.escv_incendios_todos;
--DROP FUNCTION sch_ambiente.trg_escv_incendios_todos_subtablas();

CREATE OR REPLACE FUNCTION sch_ambiente.trg_escv_incendios_todos_subtablas()
  RETURNS trigger AS $BODY$
BEGIN
IF (TG_OP = 'DELETE') THEN
DELETE FROM sch_ambiente.escv_incendios_puntos_muestreo
WHERE fir_code = OLD.fir_code;
 ELSIF (TG_OP = 'UPDATE') OR (TG_OP = 'INSERT') THEN
-- elimina anteriores para evitar repetidos
DELETE FROM sch_ambiente.escv_incendios_puntos_muestreo
WHERE fir_code = NEW.fir_code;
-- Puntos de muestreo
INSERT INTO sch_ambiente.escv_incendios_puntos_muestreo(   -- poi_code ->
CAMPO SERIE DE 1 A 100
fir_code,
                                fir_name,
                                geom)
(SELECT
    -- generate_series(1,100) -> SERIE DE 1 A 100
                                        NEW.fir_code,
NEW.fir_name,
t1.geom
FROM (SELECT  tx.fir_code,
ST_Setsrid(ST_MakePoint(tx.x, ty.y), 23030) AS geom
FROM
(SELECT NEW.fir_code AS fir_code,
generate_series(
(SELECT cast(ST_XMin(ST_Envelope(geom_23030)) AS int)
FROM sch_ambiente.escv_incendios_todos
WHERE fir_code=NEW.fir_code)+((SELECT cast(sqrt(ST_Area(geom_23030)/100) AS
int)
FROM sch_ambiente.escv_incendios_todos
WHERE fir_code=NEW.fir_code)/2),
(SELECT cast(ST_XMax(ST_Envelope(geom_23030)) AS int)
FROM sch_ambiente.escv_incendios_todos
WHERE fir_code=NEW.fir_code),
(SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int)
FROM sch_ambiente.escv_incendios_todos
WHERE fir_code=NEW.fir_code)) AS x)
AS tx
JOIN
(SELECT NEW.fir_code AS fir_code,
generate_series(
(SELECT cast(ST_YMin(ST_Envelope(geom_23030)) AS int)
FROM sch_ambiente.escv_incendios_todos
WHERE fir_code=NEW.fir_code)+((SELECT cast(sqrt(ST_Area(geom_23030)/100) AS
int)
FROM sch_ambiente.escv_incendios_todos
WHERE fir_code=NEW.fir_code)/2),
(SELECT cast(ST_YMax(ST_Envelope(geom_23030)) AS int)
FROM sch_ambiente.escv_incendios_todos
WHERE fir_code=NEW.fir_code),
(SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int)
FROM sch_ambiente.escv_incendios_todos
WHERE fir_code=NEW.fir_code)) AS y)
AS ty
ON tx.fir_code = ty.fir_code)
AS t1,
sch_ambiente.escv_incendios_todos AS t2
WHERE t2.fir_code = NEW.fir_code
AND (t1.geom && t2.geom_23030)
AND ST_Intersects(t1.geom, t2.geom_23030))
LIMIT 100;
END IF;
RETURN NULL;
END;
$BODY$ LANGUAGE plpgsql;

CREATE TRIGGER trg_escv_incendios_todos_subtablas
AFTER INSERT OR UPDATE OR DELETE ON sch_ambiente.escv_incendios_todos
FOR EACH ROW EXECUTE PROCEDURE
sch_ambiente.trg_escv_incendios_todos_subtablas();

Obrigado,

Eloi Ribeiro
GIS Analyst
39,45º -4,40º
http://eloiribeiro.wordpress.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a