PgRouting - Como cortar links ao atingir custos máximos?

13

Eu tenho um shapefile de polilinha representando uma rede de estradas e um segundo shapefile contendo pontos. Eu gostaria de usar o PostGIS (presumivelmente PgRouting) para identificar sub-redes ou áreas de serviço irradiando desses pontos.

Essencialmente, espero fazer a pergunta: "A partir do ponto X, até onde eu poderia caminhar em qualquer direção, considerando um orçamento total de viagem de 1 km, seguindo a rede de estradas?" O resultado seria um conjunto de polilinhas cortadas, representando o alcance total da possibilidade de viagem, considerando um orçamento de viagem de 1 km.

Para referência, essa análise do GRASS parece ser exatamente o que eu quero fazer (exceto que eu quero fazer isso no PostGIS): http://www.gdf-hannover.de/lit_html/grass60_v1.2_en/node57.html#sec: optalloc

Este próximo exemplo parece ser quase o que eu quero fazer, exceto que parece responder à pergunta "em quais nós eu poderia viajar para obter um orçamento de viagem com a distância X?" http://underdark.wordpress.com/2011/02/12/drive-time-isochrones/

A segunda não é exatamente a resposta que estou procurando, pois quero que as polilinhas sejam cortadas na minha distância de viagem - não me importo se vou até um nó.

Pedro
fonte
Uma opção que me ocorre é de alguma forma dividir minhas polilinhas em muitos pontos. Isso me aproxima da resposta certa, mas parece bastante hacky e ainda não me leva até lá.
18711 Peter

Respostas:

2

Um pensamento que eu tinha era: 1) executar a rotina driving_distance e 2) usar a rotina "points_as_polygon" do pgRouting (que chama a função alphashape) para gerar os menores polígonos a distâncias de custo determinadas com base nos pontos da rotina driving_distance retorna. Depois, você pode selecionar todas as ruas dentro dos polígonos, o que lhe dará uma idéia geral da viagem.

Se você não acompanhou a discussão na lista de usuários do pgRouting , eles discutiram mais opções recentemente (tópicos de maio e junho de 2011).

RyanKDalton
fonte
1
Discussões interessantes da lista de usuários. Pena que a função driving_distance esteja com erros.
Underdark
1

Como esse é realmente um problema gráfico, você precisa das informações de conectividade / topologia + custo. Para pg_routing, essa é a tabela que você envia para os algoritmos de caminho mais curto. Este artigo tem informações sobre como criar um (presumo que você já tenha um). Desculpe, não posso dar a função exata em pg_routing que faz isso, mas escrever uma deve ser possível. No entanto, posso lhe dizer que, se você continuar chamando o shortest_path repetidamente, estará executando o algoritmo abaixo repetidamente e destruindo o resultado - não é nada eficiente.

Sua solução se torna cada passo a passo, adicionando-os a uma "lista curta" e calculando um custo até que seu orçamento (ou seja, distância) seja excedido. Se o orçamento for aceitável (ou seja, o orçamento não foi excedido), você também adiciona a geometria a uma "bolsa de geometria da lista aceitável". Você só precisa processar cada borda exatamente uma vez. Para a última margem (onde seus orçamentos estão excedidos), você precisa obter o comprimento e interpolar a distância exata que deseja percorrer e adicionar o resultado à "lista aceitável". Seu resultado é uma união dessa bolsa de geometria.

Ragi Yaser Burhum
fonte
1
Há uma sutileza na última etapa: algumas arestas podem ser alcançadas a partir de qualquer um dos seus pontos finais. Isso pode fazer com que partes de ambas as extremidades sejam incluídas ou até mesmo a borda inteira, mesmo que atravessar a borda inteira de qualquer um dos pontos de extremidade exceda o limite do orçamento. Por exemplo, considere a viagem do ponto a ao longo de um gráfico não direcionado com arestas de comprimento unitário {(a, b), (a, c), (b, c)} e um orçamento de 1,6. Você pode atingir b ou c a um custo de 1, com 0,6 restantes para gastar. Isso torna todos os pontos ao longo da borda (b, c) acessíveis.
whuber
Você está correto :) +1
Ragi Yaser Burhum
1

"A partir do ponto X, até onde eu poderia caminhar em qualquer direção, considerando um orçamento total de viagem de 1 km, seguindo a rede de estradas?"

Como você só precisa considerar uma região pequena (no máximo 1 km de raio), provavelmente poderá dividir os links em várias partes pequenas (dependendo da precisão que deseja obter) e criar os nós necessários. As redes de "alta resolução" resultantes ainda devem ser gerenciáveis.

underdark
fonte