Análise De Redes Com O QGIS

21 de Fevereiro, 2016

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.

Rede viária da cidade de Pinhel

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.

Troço com sentido de vetorização contrário ao sentido de 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…):

Plugin Swap Vector Direction

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

Inverter a direção da geometria

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 Calcular:

	($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”):

Comprimento de todos os troços

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

Comprimento dos troços no sentido inverso

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

Troços de sentido unico

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

Ferramenta v.net.distance

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.

Caminho mais curto com a ferramenta v.net.distance

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).

Caminho mais curto das escolas para os hospitais

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.

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.

Isócronas com a ferramenta v.net.iso

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.

Ferramenta v.net.salesman

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.

Percurso otimizado com a ferramenta v.net.salesman

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

Ferramentas de análise de redes disponíveis no Processing

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



Categorias: análise de redes, caixeiro-viajante, caminho mais curto, grass, isocronas, processing, routing


Blog desenvolvido com Octopress