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);