quarta-feira, 2 de novembro de 2022

Como representar a área de um píxel a partir do centroid

Neste post encontrei um script sql que foi utilizado para gerar o que chamei de pixel de fogo, que na verdade representa uma área nominal teórica da imagem do satélite no qual um determinado foco foi extraído. Em um caso mais fiel a geometria da imagem em relação ao plano Terrestre ajustes devem ser realizados para levar em consideração o IFOV (Istantaneous Field of View - Campo de. Visada Instantâneo), porém para uma grande maioria das aplicações este exemplo atende.

CREATE TABLE public.pixel_foco (
	fid serial NOT NULL,
	foco_id varchar(80) NOT NULL,
	data_hora_gmt timestamp NOT NULL,
	satelite varchar(100) NOT NULL,
	geometria geometry(POLYGON, 4326) NOT NULL,
	CONSTRAINT pixel_foco_pkey PRIMARY KEY (foco_id)
);
CREATE INDEX sidx_pixel_foco_geometria ON public.pixel_foco USING gist (geometria);


CREATE OR REPLACE FUNCTION public.create_pixel_foco()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
BEGIN
  IF NEW.satelite in ('NOAA-20', 'NPP-375') THEN
  INSERT INTO pixel_foco(foco_id,data_hora_gmt, satelite, geometria) VALUES(NEW.foco_id, NEW.data_hora_gmt, new.satelite, ST_buffer(new.geometria, 0.00375, 'endcap=square'));
  ELSIF NEW.satelite in ('AQUA_M-M', 'AQUA_M-T', 'TERRA_M-M', 'TERRA_M-T') THEN
  INSERT INTO pixel_foco(foco_id,data_hora_gmt, satelite, geometria) VALUES(NEW.foco_id, NEW.data_hora_gmt, new.satelite, ST_buffer(new.geometria, 0.005, 'endcap=square'));
  end if;

  RETURN NEW;
END;
$function$;


CREATE TRIGGER create_pixel_foco_trigger BEFORE INSERT ON public.focos FOR EACH ROW EXECUTE PROCEDURE public.create_pixel_foco();