Análise de Redes com o QGIS
Análise de Redes com o QGIS avatar

Graças ao trabalho do Médéric Ribreux [0], o QGIS passará a integrar, a partir da versão 2.14 LTR, um conjunto de funcionalidades de análise de redes, através das ferramentas v.net.* [1] do GRASS, integradas no Processing.

Apesar destas ferramentas provirem e serem executadas pelo GRASS, o modelo de implementação no Processing permite que a sua utilização no QGIS seja significativamente mais simples e intuitiva do que na versão original, já que a construção do modelo topológico de redes é feito de forma transparente para o utilizador.

Assim, para executar a maior parte das análises, basta dispor de uma layer de linhas (arcs) e outra[s] de pontos (nodes).

Para já, estas ferramentas só funcionam com o GRASS 7.0.x como base. No entanto, está prevista a adaptação para utilização com o GRASS 6.4 e com o GRASS 7.1.x [2].

De seguida apresentam-se alguns exercícios de aplicação destas ferramentas.

Preparação da layer de linhas (rede viária)

A layer de linhas a utilizar pode, por exemplo, conter a rede viária de um determinado local. No presente caso, vai utilizar-se um extrato da rede viária da cidade de Pinhel.

Em termos de estrutura não é necessário seguir nenhum modelo rígido, bastando que a rede esteja topologicamente correta. Uma questão importante prende-se com os troços de sentido único ou de trânsito proibido, já que as ferramentas que se irão utilizar, permitem distinguir essas situações através da tabela de atributos.

Desta forma, nos troços de sentido único, vai ser necessário verificar o sentido em que a linha foi vetorizada.

A figura seguinte apresenta, a verde, os troços das ruas com duplo sentido, e a vermelho, os troços de sentido único. Note-se que a seta representa o sentido em que cada um desses troços foi digitalizado.

Analisando a imagem em pormenor, pode verificar-se que existe um troço que tem o sentido de vetorização contrário ao sentido de trânsito, o que iria causar um erro na análise de redes. Portanto, é importante verificar todos os troços e orientar a direção dos que forem de sentido único na direção em que se processa o trânsito.

Para corrigir este erro, é necessário inverter a direção do troço. Para o efeito, pode utilizar-se o plugin “Swap Vector Direction” do QGIS (Menu Plugins -> Manage and Install Plugins…):

Depois de instalado, basta colocar a layer em edição, selecionar o(s) troço(s) a inverter e clicar no ícone da ferramenta:

Após as geometrias estarem de acordo com o sentido de trânsito, vai ser necessário indicar, num campo da tabela de atributos, que estes troços são de sentido único. Para isso, é necessário compreender a noção de “custo” nas análises de redes. Para interiorizar este conceito, basta pensar nas pesquisas que vulgarmente se fazem nas aplicações de GPS para automóvel. Quando se pretende deslocar do ponto A para o ponto B, a aplicação questiona se se deseja calcular a rota mais curta ou a rota mais rápida. Nesse caso, a aplicação coloca à disposição do utilizador dois parâmetros que vão servir de “custo” para o cálculo do percurso: a distância e o tempo de deslocação.

A distância é o parâmetro de “custo” mais simples de utilizar, já que basta calcular o comprimento de cada troço da rede viária (no QGIS, Field Calculator -> função $length).

Para usar o tempo de deslocação também não é complexo, mas é necessário saber qual é a velocidade média/máxima em cada troço. Tendo esse valor em Km/h, basta aplicar a fórmula no Field Calculator:

($length/1000) x 60 / [Velocidade média em Km/h]

Seguindo a mesma lógica, podem usar-se outros parâmetro para o “custo”, nomeadamente, o declive dos troços.

Nos exemplos seguintes vai usar-se, simplesmente, a distância.

Desta forma, cria-se um campo na tabela de atributos para calcular o comprimento de todos os troços (Field calculator -> Novo campo decimal (real) -> “dois_senti”):

De seguida, cria-se um novo campo, mas com o nome “um_senti”:

Finalmente, selecionam-se todos os troços com sentido único da rede viária e atribui-se-lhe o valor “-1”:

Com isto vai poder indicar-se que o troço está bloqueado no sentido inverso ao da vetorização. Todos os restantes troços serão praticáveis em ambos os sentidos e terão, para um lado e para o outro, um “custo” semelhante. Se se estivesse a considerar o declive do terreno no parâmetro “custo”, então já se poderia refletir aqui um “custo” distinto, consoante a direção fosse a da subida ou da descida da rua.

Deste modo, a layer de linhas está pronta para ser utilizada.

Distância entre dois pontos (v.net.distance)

Para calcular a distância entre dois pontos, criam-se duas novas layers de pontos, uma para inserir o ponto de início e outra o ponto de destino.

De seguida, corre-se a ferramenta v.net.distance do Processing, indicando: a layer da rede viária; a layer com o ponto de início; a layer com o ponto de destino; a margem que deve ser dada para unir os pontos de início e destino à rede, caso estes não estejam sobrepostos; o campo com o valor do “custo” para todos os troços; o campo com o valor do “custo” para os troços de sentido único

Curiosamente, a ferramenta calcula o percurso no sentido contrário, ou seja, do ponto de destino para o ponto de início, pelo que se se pretender o percurso exatamente na direção início -> destino, têm de se inverter as layers que se definem na ferramenta v.net.distance. O resultado é o da figura seguinte, onde se pode observar que o sentido do trânsito foi devidamente respeitado.

Utilizando a mesma ferramenta, poderia calcular-se a distância de “muitos-para-muitos”, como mostra o exemplo do seu manual [3], onde é calculado o caminho mais curto e a distância a partir de um conjunto de escolas (círculos a verde), até às unidades de saúde mais próximas (cruzes a vermelho).

Divisão da rede através de isolinhas de custo (v.net.iso)

Esta ferramenta é muito útil quando se está a usar o tempo de deslocação como parâmetro de “custo”, uma vez que devolve como resultado, as isócronas dos tempos de deslocação.

Neste caso, vai calcular-se a distância a partir de um conjunto de serviços existentes na cidade de Pinhel, com a ferramenta v.net.iso.

Nota apenas para o campo “Costs for isolines”, onde se definem os valores de “custo” que, neste caso, diz respeito à distância em metros. O resultado é o da figura seguinte.

O problema do caixeiro-viajante (v.net.salesman)

O Problema do Caixeiro Viajante é um problema que tenta determinar a menor rota para percorrer uma série de cidades (visitando uma única vez cada uma delas), regressando à cidade de origem. Trata-se de um problema de otimização NP-difícil inspirado na necessidade dos vendedores realizarem entregas em diversos locais (as cidades), percorrendo o menor caminho possível e reduzindo, dessa forma, o tempo necessário para a viagem e os possíveis custos com transporte e combustível [4].

Este algoritmo também se encontra no Processing e vai usar-se para calcular o percurso mais curto que permite percorrer todos os serviços inventariados no exemplo anterior.

São devolvidos dois resultados, um correspondendo à geometria do percurso otimizado, e o outro a uma tabela alfanumérica onde é apresentada a sequência ótima de visita aos serviços, identificados pelo respetivo ID (9 -> 4 -> 5 -> 6 -> 7 -> 8 -> 3 -> 1 -> 2), bem como o “custo” associado.

Para além das apresentadas, existem mais 17 ferramentas v.net.* no Processing, prontas para resolver muitos problemas de análise de redes.

Referências

[0] https://medspx.fr/

[1] https://grass.osgeo.org/grass70/manuals/v.net.html

[2] https://github.com/qgis/QGIS/pull/2628

[3] https://grass.osgeo.org/grass70/manuals/v.net.distance.html

[4] https://pt.wikipedia.org/wiki/Problema_do_caixeiro-viajante

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *