quarta-feira, 22 de abril de 2015
Como consultar dados dentro de um array no postgresql
dias_com_foco é um array e quero receber todos os eventos dentro de um intervalo de tempo, então preciso saber se para cada registro o valor inicial e final do array de dias está dentro do período do meu interesse.
SELECT evento_id, data, dias_com_foco, duracao, numero_dias_com_foco, numero_focos, parent, geometria
FROM eventos_requeima
where dias_com_foco[1] >= '20050101' and dias_com_foco[array_length(dias_com_foco,1)] <= '20051231'
limit 9;
dias_com_foco[1]= retorna o valor do primeiro elemento do array;
array_length(dias_com_foco,1) = retorna a quantidade de elementos do array, portanto vou conseguir saber qual o último dia registrado.
quarta-feira, 13 de agosto de 2014
Como utilizar case no postgresql
No exemplo apresentado abaixo foi criado um novo campo no retorno da consulta que determina o nível crítico dos eventos de queimadas baseado na duração do evento em dias. Note que foram criados quatro níveis e desconsiderados os eventos com apenas um dia de duração.
Consulta:
select duracao, ST_AsGeoJson(ST_Centroid(the_geom), 3),
case when duracao = 2 then 'observação'
when duracao between 3 and 7 then 'atenção'
when duracao between 8 and 14 then 'alerta'
when duracao >= 15 then 'alerta máximo'
end as nivel
from evento_requeima
where data = 20140730 and duracao > 1;
Retorno:
duracao;geojson;nivel
2;"{"type":"Point","coordinates":[-48.333,-22.731]}";"observação"
2;"{"type":"Point","coordinates":[-46.051,-12.259]}";"observação"
2;"{"type":"Point","coordinates":[-44.891,-7.34]}";"observação"
2;"{"type":"Point","coordinates":[-48.133,-8.785]}";"observação"
10;"{"type":"Point","coordinates":[-57.056,-12.548]}";"alerta"
uma nova referencia encontrei em:
https://popsql.com/learn-sql/postgresql/how-to-write-a-case-statement-in-postgresql/
terça-feira, 15 de julho de 2014
Como utilizar array em bash?
Uma forma de manipular array em BASH pode ser vista abaixo:
lista=("ch1.env" "ch2.env" "ch20.env" "LandSeaMask.env" "SensorZenith.env" "SolarZenith.env")
for ext in "${lista[@]}"
do
echo "arquivos.${ext}"
case "${ext}" in
ch1.env)
#~ echo "nodata=0"
nodata="0"
type="UInt16"
;;
ch2.env)
echo "nodata=0"
nodata="0"
type="UInt16"
;;
ch20.env)
#~ echo "nodata=0"
nodata="0"
type="UInt16"
;;
SensorZenith.env)
#~ echo "nodata=-32767"
nodata="-32767"
type="Int16"
;;
SolarZenith.env)
#~ echo "nodata=-32767"
nodata="-32767"
type="Int16"
;;
LandSeaMask.env)
#~ echo "nodata=221"
nodata="221"
type="Byte"
;;
esac
done
Note que neste caso o operador "@" está controlando a iteração de tal maneira que não é necessário fazer a contagem do total de elementos do array. Porém caso seja necessário utilizar um elemento específico esta forma não atende.
segunda-feira, 23 de junho de 2014
Listagem de diretórios vazios
Para listar os diretórios sem arquivos dentro uma maneira é utilizar o seguinte comando:
find "/L1_TERRA/2011_01/tif/" -type d -depth -empty -print -exec \rm -rf {} \;
Caso necessário encontrar arquivos vazios o comando é:
find "/L1_TERRA/2011_01/tif/" -type d -depth -empty -print -exec \rm -rf {} \;
Caso necessário encontrar arquivos vazios o comando é:
find . -maxdepth 1 -empty -type f -exec rm {} \;
Para apagar arquivos com mais de 30 dias:
find /logs/virs375/log_cron_sh_20* -ctime +30 -exec /bin/rm {} \;
Para apagar arquivos com mais de 30 dias:
find /logs/virs375/log_cron_sh_20* -ctime +30 -exec /bin/rm {} \;
terça-feira, 13 de maio de 2014
Modificações no tipo de geometria no Postgis 2.0
Quando criei este post meu problema e solução foi este:
Depois de criado uma tabela espacial no banco Postgresql eu fui ver meus dados utilizando o Quantun GIS. Notei que não estava aparecendo na listagem das layers disponíveis aquela que me interessava. Para corrigir o problema descobri que a partir da versão 2.0 do Postgis o controle das minhas layers deixou de ser uma tabela e passou para uma view do sistema (ver detalhes em http://postgis.refractions.net/docs/using_postgis_dbmanagement.html#Manual_Register_Spatial_Column).
Enfim para resolver a receita é a seguinte:
ALTER TABLE footprint_noaa ADD COLUMN geom2 geometry(MULTIPOLYGON,4291);
UPDATE footprint_noaa
SET poligono=r.gm
from
(
Select st_multi(the_geom)::geometry(MultiPolygon, 4291) as gm ,gid from footprint_noaa
) as r
WHERE footprint_noaa.gid = r.gid;
ALTER TABLE footprint_noaa DROP COLUMN the_geom;
ALTER TABLE geom2 RENAME footprint_noaa TO the_geom;
Assim a tabela ficou devidamente registrada na GEOMETRY_COLUMNS e o quantum-gis entendeu tudo direitinho.
Depois disto eu aprendi outra maneira mais correta e direta da seguinte maneira:
ALTER TABLE my_table
ALTER COLUMN geom TYPE geometry(LineString, 4326)
USING ST_SetSRID(geom, 4326);
sexta-feira, 4 de outubro de 2013
Validação de Datas em Bash
Para fazer uma validação de um numero inteiro se ele representa uma data válida é possível utilizar o seguinte comando shell:
if (date --date 20050214 > /dev/null 2>&1); then echo "data valida"; else echo "data INVALIDA" ; fi
isto foi utilizado para selecionar um conjunto de arquivos que varia em um intervalo de dias, da seguinte maneira
data_inicio='20050115'
data_fim='20050215'
dir_dados='/dados'
for a in $( seq ${data_inicio} ${data_fim})
do
if (date --date "$a" > /dev/null 2>&1)
then
#echo "data valida"
ls -d "${dir_dados}/*${a}*" >> ${lista_W}
fi
done
Que neste caso joga para uma lista o path com os dados para serem utilizados em outro processo.
if (date --date 20050214 > /dev/null 2>&1); then echo "data valida"; else echo "data INVALIDA" ; fi
isto foi utilizado para selecionar um conjunto de arquivos que varia em um intervalo de dias, da seguinte maneira
data_inicio='20050115'
data_fim='20050215'
dir_dados='/dados'
for a in $( seq ${data_inicio} ${data_fim})
do
if (date --date "$a" > /dev/null 2>&1)
then
#echo "data valida"
ls -d "${dir_dados}/*${a}*" >> ${lista_W}
fi
done
Que neste caso joga para uma lista o path com os dados para serem utilizados em outro processo.
terça-feira, 1 de outubro de 2013
Como identificar o último dia do mês
Estive procurando uma forma para saber qual o último dia do mês corrente, e encontrei uma referência que fazia uma tabela como esta apresentada abaixo.
Para isto foi utilizado o seguinte código bash:
Portanto, adaptando este código podemos fazer o seguinte
A principal diferença é que estamos passando o ano que pretendemos avaliar e com isto saber se é biossesto ou não.
Jan - 31 days
Feb - 28 days / 29 days (leap year)
Mar - 31 days
Apr - 30 days
May - 31 days
Jun - 30 days
Jul - 31 days
Aug - 31 days
Sep - 30 days
Oct - 31 days
Nov - 30 days
Dec - 31 daysPara isto foi utilizado o seguinte código bash:
for m in {1..12}; do
date -d "$m/1 + 1 month - 1 day" "+%b - %d days";
donePortanto, adaptando este código podemos fazer o seguinte
data_atual="20131001"
ultimodia=$(date -d "${data_atual} + 1 month - 1 day" +%Y%m%d )
echo ${ultimodia}
% 20131031A principal diferença é que estamos passando o ano que pretendemos avaliar e com isto saber se é biossesto ou não.
Assinar:
Postagens (Atom)