sábado, julho 20, 2013

QGIS: cáculo da precipitação média pelo método de Thiessen

O cálculo da precipitação média em uma bacia hidrográfica é realizado através de dados coletados por pluviômetros que estão em áreas próximas e/ou dentro da mesma. Por definição a precipitação média é a lâmina d'água de altura uniforme sobre toda a área considerada, associada a um período de tempo.

O método de Thiessen é um dos mais usuais para a determinação da precipitação média, consiste em atribuir um fator de peso aos totais precipitados em cada pluviômetro, proporcionais a área de influência de cada um (VILLELA, 1975). Este método será demonstrado a seguir no Software Quantum GIS.

Na figura abaixo temos três layers abertos no QGIS, rainfall_gauges (estações pluviométricas com dados totais mensais de precipitação), streams (rede de drenagem) e basin (bacia hidrográfica em estudo).



Para criar os polígonos de Thiessen, acesse o menu Vector > Geometry Tools > Voronoi Polygons:



Escolha a camada dos postos pluviométricos, se necessário aplique um buffer para que o layer gerado cubra toda a bacia:



Em seguida corte o layer criado em função do limite da bacia. Vá em Vector > Geoprocessing Tools > Clip:



Em Input vector layer escolha o layer dos polígonos de Thiessen e em Clip layer escolha a bacia hidrográfica:


Com as áreas de influência dos postos pluviométricos definidas (figura abaixo), serão criados alguns campos na tabela de atributos.



Habilite o modo de edição e clique em Open field calculator:


Crie o campo area_km2, neste caso os dados estão em UTM e para obter os resultados em km2 deve-se dividir por 1.000.000. Salve o resultado e saia do modo de edição.


Em seguida, vá em Vector > Analysis Tools > Basic statistics:



Obtenha as estatísticas do Layer basin_thiessen, deve ser anotado o valor da soma das áreas (Sum = 3179.0643), que corresponde a área total da bacia.


Habilite o modo de edição mais uma vez para o layer thiessen_basin e crie mais um campo (area_per) contendo o valor da área de cada polígono dividida pela área total da bacia, em seguida salve a edição:


O último campo a ser criado armazenará o valor da precipitação ponderada (rainfall_p), obtido a partir da multiplicação dos valores dos campos rainfall_m e area_per, em seguida salve as alterações e saia do modo de edição:



Para obter o valor da precipitação média, acesse o menu Vector > Analysis Tools > Basic statistics e escolha o campo rainfall_p:


Em Sum temos o resultado para a precipitação média mensal, que é de 24,72 mm.

O mesmo procedimento pode ser realizado no GRASS através dos comandos abaixo:
# definição do driver sqlite para armazenamento das tabelas (importante!!!)
db.connect driver=sqlite database='$GISDBASE/$LOCATION_NAME/$MAPSET/sqlite.db'
# verificando a conexão
db.connect -p
# criação da camada contendo os polígonos de thiessen
v.voronoi input=rainfall_gauges output=thiessen
# clip da camada thiessen com os limites da bacia hidrográfica
v.overlay ainput=thiessen binput=basin output=clip_thiessen operator=and
# criação do campo area_km2
v.db.addcol map=clip_thiessen columns='area_km2 double precision'
# preenchimento do campo criado anteriormente
v.to.db map=clip_thiessen type='boundary' option='area' units='kilometers' columns='area_km2'
# valor da área da bacia em km2 (soma das áreas dos polígonos da camada clip_thiessen)
echo "SELECT sum(area_km2) FROM clip_thiessen" | db.select
# criação do campo area_per (porcentagem em relação a área total)
v.db.addcol map=clip_thiessen columns='area_per double precision'
# preenchimento do campo area_per
echo "UPDATE clip_thiessen SET area_per = (area_km2/3179.0643)" | db.execute
# criação do campo rainfall_per (valor da precipitação ponderada)
v.db.addcol map=clip_thiessen columns='rainfall_per double precision'
# preenchimento do campo rainfall_per (rainfall_m x area_per)
echo "UPDATE clip_thiessen SET rainfall_per = (a_rainfall_m * area_per)" | db.execute
# valor da precipitação média
echo "SELECT sum(rainfall_per) FROM clip_thiessen" | db.select
view raw gistfile1.sh hosted with ❤ by GitHub

Referências:

VILLELA, sm; MATOS, A. Hidrologia aplicada. 1975.

domingo, julho 14, 2013

Pivot Table no PostgreSQL

Pivot Table (ou Crosstab) é uma análise que resulta na inversão de linhas por colunas em uma consulta SQL. Funciona de forma semelhante a uma matriz inversa e seu uso resume uma série de registos em uma tabela mais fácil de ser interpretada, por exemplo:

Figura 1 - Conjunto de dados

Digamos que a partir do conjunto de dados da Figura 1 seja necessário totalizar a quantidade de acidentes por sexo para cada bairro. O resultado pode ser visto na Figura 2.

Figura 2 - Exemplo de Pivot Table

Utilizando a função de agregação SUM() em conjunto com a expressão CASE obtemos o resultado da Pivot Table:

SELECT bairro,
sum(CASE WHEN sexo ='MASCULINO' THEN 1 ELSE 0 END) AS total_homens,
sum(CASE WHEN sexo ='FEMININO' THEN 1 ELSE 0 END) AS total_mulheres
FROM acidentes
GROUP BY bairro
ORDER BY total_homens DESC, total_mulheres DESC;
view raw gistfile1.sql hosted with ❤ by GitHub