Cálculo de área entre curvas de nível – voltando ao assunto

Buenas, pessoal!

A algum tempo atrás publicamos um tutorial sobre Cálculo de área entre curvas de nível, onde procuramos resolver uma dúvida que surgiu na lista de usuários do gvSIG através da aplicação de vários geoprocessos, e onde pudemos aprender várias técnicas do gvSIG. No entanto, no referido artigo trabalhamos com uma simplificação dos dados, e quando fomos trabalhar com dados “reais”, num segundo momento, percebemos que estavam ocorrendo alguns problemas com o procedimento, e não estava sendo gerado o resultado esperado.

Uma das vantagens de trabalhar em comunidade é que o conhecimento é compartilhado, bem como as tentativas de resolver os problemas que aparecem. E foi com a ajuda do Gustavo Agüero Córdoba, que mantém o excelente blog GvSig Consultores AA, que conseguimos não apenas resolver o problema que apareceu, mas também ampliar os conhecimentos não só sobre o gvSIG, mas também sobre os geoprocessos, o Sextante e outras ferramentas que estão disponíveis para a nossa utilização. O objetivo desse artigo é compartilhar esse conhecimento que foi gerado. Vamos aos fatos:

Revisando a questão geradora apresentada, nosso objetivo será calcular a área existente entre uma série de curvas de nível, que foram digitalizadas na forma de um arquivo shape de linhas. Para isso, teremos que transformar essas linhas em polígonos, para que seja possível medir a área.

Para trabalharmos com dados reais, estarei utilizando os arquivos shapes das curvas de nível do estado do Rio Grande do Sul, obtidos do DVD Base Vetorial Contínua do Rio Grande do Sul – Escala 1:50.000, material editado pelo Laboratório de Geoprocessamento do Centro de Ecologia da URGS. Por razões de direitos autorais, e também de tamanho do arquivo, não estarei disponibilizando o arquivo total, e sim apenas um arquivo com os shapes da área de interesse e as respectivas curvas de nível que estão contidas na área de interesse que iremos trabalhar.

Nessa primeira parte do tutorial iremos trabalhar no gvSIG passo-a-passo, executando cada um dos algoritmos necessários para alcançar o nosso objetivo. Em um próximo tutorial mostraremos como automatizar o processo através da execução de um modelo do sextante, que iremos  criar.

Buenas… chega de conversa e vamos botar a mão na massa! Em primeiro lugar, vamos criar um projeto, e nele inserir uma nova vista, com projeção WGS84/UTM zone 22S (EPSG 32722), que é o sistema de referência utilizado pelo shape que iremos trabalhar. Nesta vista, inseri o shape das curvas de nivel do RS, e também o shape da área de interesse que queremos trabalhar, conforme pode ser visualizado abaixo:

curvas01

Neste tutorial iremos utilizar apenas os geoprocessos disponibilizados pelo Sextante, muito embora alguns dos algoritmos também estejam disponíveis nas ferramentas de geoprocessamento do gvSIG.

O primeiro processo que iremos aplicar é o Cortar (ou Clip), para podermos selecionar apenas as curvas de nível que estão dentro da nossa área de interesse.

curvas02

 Para tanto, abrimos o Sextante e procuramos pelo geoprocesso Cortar (Clip). Na janela que abre, selecionamos a camada das curvas de nível como Camada a recortar, e a camada da área de interesse como Camada de recorte. Em seguida, selecionamos o local e o nome do arquivo que iremos gerar, no campo Camada recortada [vetorial], e clicamos em OK. O geoprocesso Cortar será aplicado, e teremos uma nova camada no nosso TOC, com o resultado: uma camada shape (vetorial) de linhas que representam as curvas de nível existentes na nossa área de interesse. A partir de agora podemos descartar a camada de curvas de nível total, e aproveitar para renomear a camada de resultado para algo mais significativo, de forma a não nos perdermos no processo. Lembramos que o arquivo que está disponibilizado para download contém exatamente esses dois shapes, portanto, você poderá executar o processo com esse material.

curvas03

 Muito bem. Teoricamente poderíamos aplicar o geoprocesso Poligonar linhas (Polygonize) diretamente sobre essa nova camada gerada, que teríamos o resultado que buscamos. Vejamos o que acontece. Primeiramente, os dados de entrada:

curvas04

E o resultado obtido:

curvas05

Como podemos ver, não obtivemos o que esperávamos! Mas, por quê? A resposta é simples, e está contida na descrição da rotina que utilizamos: “Este algoritmo converte  linhas em polígonos, considerando apenas as bordas (limites ou fronteiras), as quais descrevem áreas fechadas, e sem retornar polígonos sobrepostos”. Ou seja: o algoritmo aplicado fez apenas o que ele foi programado para fazer… converteu apenas as linhas cujas áreas estavam fechadas. As demais não puderam ser transformadas em polígonos por não estarem fechadas.

Para contornarmos esse problema precisamos forçar o fechamento dessas curvas. Como fazer isso? Utilizando o polígono definido pela área de interesse, que contorna a nossa área, e unindo ele com as curvas de nível. Esse processo deve ser feito em dois passos, pois a área de interesse é um polígono, e precisaremos antes transformá-la em uma polilinha, para depois podermos finalmente uni-la com as curvas de nível. Para converter um polígono em polilinhas utilizaremos o geoprocesso… Converter polígono em polilinha (Polygons to polylines):

curvas06

 Na seção Entradas, Camada vetorial, definimos como camada de Polígono a ser convertida a camada que contém a área de interesse, e definimos em Resultados, Linhas [vetorial], o caminho e o nome para o arquivo shape que será gerado pelo algoritmo. Ao clicarmos em OK o geoprocesso será aplicado e obteremos como resultado uma nova camada, que contém a nossa área de interesse, agora como uma flamante polilinha:

curvas07

Agora podemos passar para o próximo passo: juntar as duas camadas de polilinhas, de modo a forçar o fechamento das curvas de nível, utilizando o geoprocesso Juntar (Merge):

curvas08

 Na janela do algoritmo Juntar (Merge), na seção Entrada, Camada vetorial, definimos como Camada principal a camada que contém as curvas de nível, e como Camadas adicionais selecionamos a camada que geramos no passo anterior, contendo a nossa área de interesse transformada em polilinha. Ao clicarmos em OK o geoprocesso será aplicado e obteremos como resultado uma nova camada contendo a junção das duas camadas que especificamos:

curvas09

Mais uma vez, teoricamente, agora já poderíamos aplicar o geoprocesso Poligonar linhas (Polygonize) e teríamos o nosso resultado esperado. Se os dados com os quais estivermos trabalhando estiverem corrigidos topologicamente, poderíamos estar acabando o nosso trabalho. No entanto, não é esse o caso, como pode ser visto na figura abaixo, que mostra o resultado da aplicação do algoritmo Poligonar linhas (Polygonize) na camada que obtemos no passo anterior:

curvas09a

Isso acontece porque os nossos dados não foram tratados topologicamente, conforme pode ser conferido na próxima figura, onde demos um zoom na área de curvas de nível e selecionamos algumas delas:

curvas10

Como podemos observar, algumas linhas estão “rompidas”. São linhas que, embora pertençam a mesma curva de nível, estão separadas, mas não conseguíamos visualizar isso pela simples observação. Possivelmente esse erro foi gerado no processo de digitalização das curvas de nível. Para alcançarmos o nosso objetivo precisamos aplicar um algoritmo que consiga unir estas linhas, deixando assim o nosso arquivo topologicamente correto.

O algoritmo a ser usado neste caso será o Juntar linhas adjacentes (Join adjacent lines):

curvas11

 Na seção Entrada, Camada vetorial, definimos como Camada de entrada a camada que obtivemos no último passo realizado, isto é, a camada de polilinhas resultante da junção das curvas de nível com a área de interesse. Em Opções, definimos o valor de 1.0 para Tolerância. Por último, definimos em Resultados, Resultados[vetorial], o caminho e o nome que será usado para o shape resultante do processo. Clicamos em OK, e teremos o geoprocesso aplicado e obteremos no TOC uma nova camada, agora com as polilinhas das curvas de nível devidamente corrigidas.

curvas12

Finalmente poderemos aplicar o geoprocesso Poligonar linhas (Polygonize) sobre a camada resultante:

curvas13

E obteremos a nossa camada de polígonos, contendo a área entre as curvas de nível:

curvas14

Se selecionarmos alguns dos polígonos poderemos comprovar que agora obtemos os mesmos corretamente:

curvas15

No entanto, não obstantemente… ainda teremos um passo a realizar antes de calcularmos a área entre cada curva de nível:

Como havíamos comentado anteriormente, algumas curvas de nível tinham erros de restituição, o que gerava problemas de topologia. Ao corrigirmos esses erros com a junção de linhas próximas, conseguimos solucionar os problemas de topologia, mas algumas vezes a aplicação desse processo pode gerar alguns polígonos extras que, mesmo pequenos, alteram a área resultante. Como esse arquivo em que estamos trabalhando parece ter sido afetado por todas as instâncias possíveis da Lei de Murphy, também tivemos presente este problema, como podemos observar neste zoom da aplicação da área de interesse sobre a nossa camada de polígonos final (área em amarelo):

curvas16

Para corrigir este problema basta aplicar novamente o geoprocesso Cortar (Clip), agora usando como Camada a recortar a camada de polígonos que acabamos de gerar, e como Camada de recorte, a camada que contém o polígono da área de interesse. Com isso, conseguimos delimitar os polígonos apenas dentro da área de interesse, conforme podemos visualizar abaixo:

curvas16a

Agora poderemos, finalmente, obter o dado que buscávamos no início do nosso tutorial: calcular qual a área dos intervalos entre as curvas. Para tanto, basta acessarmos o menu Camada > Adicionar informação geométrica e, na janela que se abre, selecionar em Camada a camada relativa aos polígonos das curvas de nível corrigidas e, em seguida, selecionar Área na coluna da esquerda e clicar na seta para a direita, de forma a passá-la para a coluna da direita.

curvas17a

Clicando em Aceitar, a informação referente a área de cada um dos polígonos será acrescentada na tabela de atributos do shape:

curvas17b

Sempre é interessante, em qualquer trabalho que façamos, comprovar a confiança dos resultados obtidos. Neste caso, essa comprovação está diretamente relacionada com a área total da nossa área de interesse. Sendo assim, é importante verificarmos se a soma das áreas das curvas de nível individuais é igual a área da nossa área de interesse (podem ocorrer pequenas variações para mais ou para menos, em virtude das abstrações que foram aplicadas, mas essas diferenças não podem ser significativas).

Para obtermos essa comprovação devemos utilizar uma das ferramentas que nos possibilitam obter a soma de um campo de uma tabela, como por exemplo, as estatísticas de tabela. Conforme podemos visualizar abaixo, no nosso caso está tudo “nos conformes” (a diferença está na :

curvas18

Antes de encerrarmos essa parte do tutorial, cabe uma pequena mas importante observação: muito embora todos esses procedimentos tenham sido executado no gvSIG 1.12, eles podem ser completamente reproduzidos utilizando o gvSIG 2.0, pois todos os recursos aqui utilizados estão disponíveis e funcionais na nova versão do gvSIG.

E por hoje é só, pessoal! No próximo artigo veremos como utilizar o modelador do sextante para fazermos o mesmo processo de forma automatizada. Voltamos em breve!

Utilizando o GRASS Para Gerar Pontos Aleatórios no gvSIG

Buenas!
Recentemente descrevemos como gerar pontos aleatórios em polígonos utilizando a extensão SEXTANTE no gvSIG. Neste tutorial faremos uso de um algoritmo do GRASS no gvSIG para obter um resultado semelhante. Usei o termo “semelhante” porque o resultado final obtido não é igual ao do tutorial anterior, uma vez que este algoritmo gera pontos aleatórios a partir de uma vista ou de um shape, mas não permite especificar o número de pontos que serão gerados por polígono, que foi a proposta inicial do exercício feito pelo @geoluislopes. No entanto, este algoritmo é muito interessante, podendo gerar não apenas pontos aleatórios em 2D, mas também em 3D. Ou seja: certamente tem o seu momento de aplicação.
Feita esta ressalva, vamos ao tutorial propriamente dito, assumindo que você já está com o GRASS instalado no gvSIG:

Inicialmente, baixe o shape dos municípios do RS, que usaremos neste tutorial. Crie uma nova vista com a projeção WGS 84 (EPSG 4326), abra a mesma e insira o shape.

ptos_aleat01g

Apliquei um zoom na área de interesse, onde quero que os pontos sejam gerados (neste caso, na região central do RS).
ptos_aleat02g

Acessamos a extensão SEXTANTE, através do ícone “SEXTANTE Toolbox”. Na janela da extensão, navegamos até encontrar os algorítimos do GRASS.

ptos_aleat03g

Utilizando a árvore de algorítimos, vamos navegando até encontrar o algorítimo desejado: GRASS > Vector (v.*) > v.random

ptos_aleat04g

Um clic duplo no nome do algorítimo irá abrir a sua janela de entrada de dados, onde poderemos configurar as opções disponíveis. Na primeira aba, “Parameters”, vamos alterar apenas o “n”, que determina o número de pontos a serem gerados, que fixei em 50. As demais opções não nos interessam neste momento, a não ser “v.random: output(vector)”, que detemina se a camada resultante será gerada em um arquivo temporário ou se iremos salvá-la para um arquivo específico. Podemos deixar a opção default de gerar para um arquivo temporário.

ptos_aleat05g

Na segunda aba, “Region”, iremos defenir a região onde o algorítimo será aplicado. Existem 3 opções:

  1. “User defined”, onde podemos determinar manualmente o local de aplicação, alterando os parâmetros “Range X” e “Range Y”.
  2. “Use extent from view”, onde poderemos escoher uma vista para aplicar o algorítimo (a visualiação atual da mesma fixará os parâmetros “Range X” e “Range Y”).
  3. “Use extent from layer”, onde poderemos esolher uma camada onde o algorítimo será aplicado (somente em toda a extensão da camada).

Escolhi a segunda opção, para gerar os pontos aleatórios na visualização da vista que estava ativa.

ptos_aleat06g

Ao clicarmos em “Ok” o algorítimo será aplicado conforme os parâmetros escolhidos, e o resultado aparecerá em uma nova vista. Devemos então selecionar a camada gerada e exportá-la (Camada > Exportar para > SHP).

ptos_aleat08g

Depois de exportar a camada podemos fechar a vista gerada e, voltando para a vista anterior, adicionamos a camada que salva para visualizar os resultados.

ptos_aleat09g

Par conhecer maiores detalhes do algorítimo v.random, basta acessar a página do mesmo no manual online do GRASS.

Junção Espacial (Spatial Join) no gvSIG

Buenas, pessoal!

Semana passada surgiu na Lista gvSIG_BR a dúvida se o gvSIG tem a opção de executar o geoprocesso Junção Espacial (Spatial Join). A necessidade que gerou a dúvida era a seguinte situação: havia um shape de polígonos, com a sua tabela de atributos vinculada, e um shape de pontos, sobrepostos aos polígonos. O que precisava ser feito era transferir os dados do shape de polígonos para o shape de pontos, de forma que os pontos que caem dentro de um polígono assumam os valores daquele polígono.

Esta situação pode ser resolvida com o geoprocesso Junção Espacial (Spatial Join), que está disponibilizado em todas as versões do gvSIG. Este geoprocesso é similar a um Join entre tabelas alfanuméricas, permite transferir os atributos de uma camada para outra com base em uma característica comum. A diferença entre o “Join Tradicional” e um Join Espacial é que as características comuns consideradas, não são que “um” ou “muitos” atributos das tabelas possuam o mesmo valor (ex: chaves primárias), mas sim as características espaciais. A junção de tabelas já foi muito bem explicada pelo Esdras no artigo Relacionar tabelas no gvSIG. Vamos ao tutorial, então:

Aberto o gvSIG, no Gestor de Projetos, criamos uma nova Vista, com as devidas configurações de suas propriedades. Para os fins do tutorial estou chamando esta vista de “Junção Espacial”.

juncao01 - Share on Ovi

Abrimos a Vista, e vamos adicionar os shapes em questão, clicando em Vista > Adicionar camada (ou utilizar o atalho Alt+O, ou ainda clicando no ícone correspondente). Na janela que se abre, na aba Arquivos, clicar em Adicionar, escolher o caminho onde estão armazenados os shapes e selecionar os dois shapes. Aqui estou usando um shape de polígonos, contendo a divisão municipal do RS, e um shape de pontos, com alguns pontos indicando as sedes dos municípios de meu interesse.

juncao03 - Share on Ovi

Só para facilitar o entendimento, essa é a tabela de atributos do shape de polígonos (visualizada através da opção Camada > Ver tabela de atributos, ou do ícone Ver tabela de atributos).

juncao04 - Share on Ovi

E essa é a tabela de atributos do shape de pontos:

juncao05 - Share on Ovi

Como pode ser visto, não há nenhum campo em comum entre as tabelas, pelo qual pudéssemos fazer a junção das tabelas.
Vamos ao geoprocesso: clicamos em Vista > Gestor de geoprocessos e, na árvore de geoprocessos que está a esquerda da janela que se abre, vamos abrindo as opções, até encontrar a desejada: Geoprocessos > Análises > Proximidade > Junção espacial

juncao06 - Share on Ovi

No lado direito da janela aparece uma descrição do geoprocesso, explicando a sua aplicação e as opções existentes. Clicamos em Abrir geoprocesso, na parte debaixo da janela. Abrirá uma nova janela: Ferramentas de análise.

juncao07 - Share on Ovi

Aqui é que está o coração do processo, No primeiro campo, Camada de entrada, definimos qual a camada que servirá como origem (a camada que irá receber os atributos, neste caso, a camada do shape de pontos). Se deixarmos marcada a opção “Usar somente os elementos selecionados” o geoprocesso será realizado somente para os elementos que estiverem previamente selecionados na camada. Não selecionaremos esta opção, pois queremos que a Junção espacial seja feita para todos os pontos do shape.

No segundo campo, Camada de recorte, selecionamos a camada que será juntada a primeira, cedendo os atributos de sua tabela. No nosso caso, a camada do shape de polígonos. Deixamos a opção “Usar o mais próximo” marcada, indicando que queremos uma relação 1 -> 1.

Por último, no campo Camada de saída, clicamos em Abrir e escolhemos o nome do shape que será gerado e o local de armazenamento do mesmo. Definido este ítem, basta clicar em Aceitar para que o geoprocesso seja executado.

De volta a janela principal, teremos a nova camada já inserida na Vista, como um novo shape.

juncao08 - Share on Ovi

Se abrirmos a tabela de atributos do novo shape, veremos que ocorreu a junção das tabelas, que era o nosso objetivo inicialmente proposto.´

juncao09 - Share on Ovi

Por enquanto é isso, pessoal…
Até a próxima! ;)