sexta-feira, 14 de julho de 2023
Criação de um ambiente virutal para pygis
quarta-feira, 2 de novembro de 2022
Como representar a área de um píxel a partir do centroid
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();
segunda-feira, 1 de agosto de 2022
Linhas duplicadas no banco de dados Postgres ... como resolver?
Quando uma tabela do banco de dados Postgresql possui registros duplicados é
possível identificar utilizando uma "Window Function" que vai gerar um novo
valor sequencial baseado nos critérios que forem definidos pelo usuário.
Para deixar mais claro vou exemplificar com uma tabela bem simples:
select orb_pto, ano, lim_ndvi, lim_nbrfrom tabela_limiares tl order by orb_pto, ano; orb_pto ano lim_ndvi lim_nbr 216_065 2018 0.2 0.5 216_065 2018 0.2 0.5 216_065 2019 0.2 0.5 216_065 2019 0.2 0.5 216_066 2018 0.2 0.5 216_066 2018 0.2 0.5
É possível notar que existem linhas duplicadas porém difícil de identificar.
Utilizando um comando para criar um número sequencial baseado em uma condição é possível melhorar esta visualização
select orb_pto, ano, lim_ndvi, lim_nbr, row_number() over( partition by orb_pto, ano order by 1,2 ) as num_lin from tabela_limiares tl; orb_pto ano lim_ndvi lim_nbr num_lin 216_065 2018 0.2 0.5 1 216_065 2018 0.2 0.5 2 216_065 2019 0.2 0.5 1 216_065 2019 0.2 0.5 2 216_066 2018 0.2 0.5 1 216_066 2018 0.2 0.5 2
Note que sempre que o num_lin for igual a 2 representa que aquela tupla considerando orb_pto e ano estão duplicadas. Porém antes de apagar esta linha quero me certificar que as quatro condições são únicas, e por isso vou fazer a consulta um pouco mais refinada:
with duplicados as ( select orb_pto, ano, lim_ndvi, lim_nbr, row_number() over( partition by orb_pto, ano, lim_ndvi, lim_nbr order by 1,2 ) as num_lin from tabela_limiares tl ) select * from duplicados where duplicados.num_lin =2 ; orb_pto ano lim_ndvi lim_nbr num_lin 216_065 2018 0.2 0.5 2 216_065 2019 0.2 0.5 2 216_066 2018 0.2 0.5 2 216_066 2019 0.2 0.5 2 216_067 2018 0.2 0.5 2 217_063 2019 0.2 0.5 2
Pronto agora eu posso apagar ou inserir em outra tabela conforme meu interesse
with duplicados as ( select *, row_number() over( partition by orb_pto, ano order by 1,2 ) as num_lin from tabela_limiares tl )insert into aq30m_limiar (orbita_ponto, lim_ndvi, lim_nbr, ano) (select orb_pto, lim_ndvi, lim_nbr, ano from duplicados where duplicados.num_lin =1 );CUIDADO COM O DELETE!!!!
A inspiração para este post veio do vídeo https://www.scalingpostgres.com/episodes/225-psql-gexec-delete-duplicates-postgres-podcast-puny-powerful/
quarta-feira, 15 de setembro de 2021
Como utilizar o comando PARALLEL
Um inicio é ler a documentação em https://www.gnu.org/software/parallel/parallel_tutorial.html
na falta de algum exemplo melhor tenho este ...
#!/bin/bash
for ano in {2001..2019}
do
echo gdal_translate -of GTiff -a_srs EPSG:4326 -co TILED=YES Merge_IGBP_C6_"$ano".nc Vegetation_"$ano".tif >>lista.txt
done
nohup parallel -j 5 < lista.txt > lista.log &
Sucesso!!
sexta-feira, 30 de julho de 2021
Consultas encadeadas utilizando With
Neste post estou apresentando o esquema comentado de uma consulta encadeada que agiliza as análises de grandes quantidade de dados.
with alias_1 as (
select colunas,
(row_number() over(partition by coluna order by coluna)) as id -- Exemplo de "Window Function"
from tabela
), -- a virgula indica que pode ter outras tabelas disponíveis
alias_2 as (
select coluna
from tabela
) -- sem a virgura indica que será feira uma consulta final
select a1.coluna, a2.coluna
from alias_1 a1, alias_2 a2
where a1.coluna = a2.coluna;
dica para formatacao do codigo http://hilite.me/
sábado, 5 de junho de 2021
Como criar um retângulo (polígono) a partir de de dois pontos.
Existem situações que é necessário criar um Bounding Box ou Retângulo Envolvente para executar uma filtragem no Banco de Dados. Neste caso vamos utilizar os dois pontos encontrados no comando ogrinfo que foi explicado em https://geoajuda.blogspot.com/2021/01/como-saber-qual-o-bounding-box-envelope.html
st_setsrid( st_makebox2d( st_makepoint(-58.8984,-9.8412), st_makepoint(-46.0608,2.5911)), 4326)
Aqui está o link [https://postgis.net/docs/ST_MakeBox2D.html] para detalhamento do comando no manual
sexta-feira, 22 de janeiro de 2021
Uso do comando find para organizar diretórios
- Identificar o espaço em disco usado:
du -shc /srv/www/users/*
- Identificar o número de arquivos:
find /srv/www/users -type f | wc -l
- Remover arquivos com data de acesso igual ou superior a 30 dias; o parâmetro ctime é para criação e modificação e o tempo é múltiplo de 24hs ou seja +1 representa 2 dias atráz.
find /srv/www/users -type f -atime +30 -delete
find /srv/www/users -type d -empty -delete
find /srv/www/users -type f -size -1k -delete
Em 28/06/2024 encontrei outra dificuldade que foi a quantidade de erros por falta de permissão que os comandos find estavam retornando. Assim aprimorei os comando adicionando no final o redirecionamento da saída de erro para o null com a seguinte instrução 2>/dev/null
Uma boa referência que encontrei https://www.digitalocean.com/community/tutorials/how-to-use-find-and-locate-to-search-for-files-on-linux-pt