terça-feira, fevereiro 28, 2012

Curso online de Mapserver 6



Olá Amigos,

Estarei ministrando um treinamento online sobre Mapserver 6 a partir do dia 24/03/2012 através da Acesso Livre Consultoria.

Maiores detalhes sobre o curso neste link.

Garanta já a sua vaga realizando a pré-incrição através deste formulário: http://goo.gl/LqrEm

Um abraço e até lá :)

quarta-feira, fevereiro 15, 2012

GRASS: Snapping points to lines

Trabalhar com dados espaciais de diversas fontes nem sempre é uma tarefa fácil, ainda mais quando espera-se que os mesmos obedeçam regras topológicas para que as análises espaciais sejam consistentes.

Um problema topológico comumente enfrentado pode ser visto na Figura 1, onde determinada análise espacial requer que uma camada de pontos tenha que estar devidamente conectada a uma camada linear. Os pontos vermelhos da direita indicam as feições com problemas de conectividade.

Figura 1: Problema topológico - os pontos devem estar conectados aos arcos.

Este problema pode ser resolvido através de uma edição vetorial na camada de pontos, utilizando o recurso snapping, porém se o usuário tiver de editar centenas (ou até milhares) de pontos, este tipo de edição torna-se inviável.

Uma solução é utilizar os recursos do GRASS aliado a versatilidade dos comandos linux para edição/manipulação de arquivos textuais (cat, sed, tail, awk, head, etc.).

Neste exemplo, temos uma rede de drenagem e pontos de controle, que deveriam estar conectados a esta rede (Figura 2). Aparentemente o problema não ocorre (por conta da escala), porém, utilizando a ferramenta zoom é possível identificar que os pontos não tocam os arcos (Figura 3).

Figura 2 - Rede de drenagem e os pontos de controle não conectados.

Figura 3 - Detalhe do problema de conectividade

Segue a solução com os comandos do GRASS:

#adicionar duas colunas que receberão as coordenadas (to_x,to_y), da linha mais próxima do ponto
v.db.addcolumn pontos_controle col="to_x double precision, to_y double precision"

#calcular a menor distância entre os pontos e as linhas e povoar as colunas com as coordenadas do endpoint
v.distance from=pontos_controle to=rios  upload=to_x,to_y column="to_x,to_y"

A Figura 4 mostra a tabela de atributos da camada "pontos_controle" após os dois comandos acima, o par (x,y) representa a coordenada correta, obtida através do cálculo de uma distância euclidiana entre o ponto e coordenada mais próxima da linha.

Figura 4 - Campos povoados com as coordenadas
O comando v.out.ascii permite exportar uma camada vetorial para um arquivo txt:

v.out.ascii input=pontos_controle@analises layer=1 output=/home/marcello/Desktop/pontos_ok.txt columns=to_x,to_y format=point

A Figura 5 mostra o arquivo gerado, observe que as coordenadas corretas são as que estão após o terceiro pipe ( | ), na quarta e quinta coluna:

Figura 5 - Arquivo gerado com o comando v.out.ascii.

Por último, o comando v.in.ascii importa as coordenadas corretas:

#Obs: x=4 e y=5 indicam as colunas com as coordenadas que devem ser lidas na importação
v.in.ascii input=/home/marcello/Desktop/pontos_ok.txt output=pontos_ok x=4 y=5

O resultado pode ser observado na Figura 6, o ponto verde indica a posição correta do ponto  e o vermelho indica a coordenada original.
Figura 6 - Coordenada corrigida (ponto verde).

Caso fosse necessário, poderíamos retirar as colunas que não são do nosso interesse do arquivo ASCII, através da seguinte instrução:

cat pontos_ok.txt | awk -F "|" '{print $4,$5}' > coords_pontos_ok

Ficando o arquivo ASCII como mostra a Figura 7.

Figura 7 - Arquivo  ASCII apoś a remoção das colunas desnecessárias.

That's all folks! até o próximo tutorial.