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 . -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 {} \; 


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.

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.

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 days

Para 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"; 
done

Portanto, 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}
% 20131031

A principal diferença é que estamos passando o ano que pretendemos avaliar e com isto saber se é biossesto ou não.