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.
2 comentários:
Marcello, muito boa a solução. Eu mesmo já passei por uma situação semelhante a esta e fiquei desesperado para solucionar até que desisti de fazer. Parabéns pelo post. Muito útil.
Obrigado Esdras, o GRASS realmente é um software fantástico, pena ele não ser tão utilizado. Um abraço
Postar um comentário