Preciso conectar pontos de ônibus (pontos) a uma camada de rede (dados OSM). Esses pontos de ônibus não ficam diretamente nas linhas (veja a captura de tela) nem devem ser movidos. Uso PostGIS, pgrouting e QGIS e a rede já é roteável com colunas de origem e destino, etc.
Principalmente, quero fazer duas coisas depois:
- Obter as distâncias entre os pontos de ônibus usando a análise de caminho mais curto.
- Criando isócrones com distâncias a pé do ponto de ônibus usando a rede OSM.
Para obter valores exatos, é necessário que o roteiro 'inicie' e 'pare' mais próximo dos pontos de ônibus. Em muitos casos, o nó existente mais próximo estará muito longe para obter valores exatos. Mas não deve haver um roteamento para o local real do ponto de ônibus. No meu exemplo da figura, você pode ver como deve ser o roteamento entre as paradas.
Existe a possibilidade de inserir automaticamente novos nós na rede (LINESTRING) que estão mais próximos aos pontos de ônibus ou é possível iniciar o roteamento em um tipo de 'ponto fictício' definido apenas para a consulta (semelhante ao que a estrada plugin gráfico no QGIS faz)?
Esta é a minha solução completa. Isso envolve uma espécie de hack para fazer a divisão: eu obtenho os pontos nas linhas (maneiras de usar a terminologia OSM)
ST_ClosestPoint
, e os amortizo por uma distância muito pequena para que a divisão funcione. Caso contrário, erros de imprecisão / arredondamento impediam a divisão.Isso tem o problema de gerar duas divisões em cada linha por ponto (devido ao buffer). Para meu uso, isso foi bom, pois mais tarde eu rotei entre os pontos de divisão mais próximos dos pontos originais, que estavam fora da linha, e poderia ser um dos dois pontos de divisão da interseção do buffer de linha.
Comecei baixando os dados do OSM e inserindo-os no Postgres:
Dividindo as maneiras usando um buffer:
Crie a topologia necessária para rotear com pgrouting:
fonte
Como estou trabalhando em uma tarefa semelhante, só queria contar sobre a abordagem que estou usando atualmente. Isso faz uso do GRASS GIS, mas, no que diz respeito às minhas experiências com o PostGIS, é bastante complicado adicionar vários novos pontos aos LineStrings existentes dividindo-os nos respectivos locais - embora eu tenha certeza de que existe uma solução conveniente.
I já fez uso do GRASS GIS
v.net
função usando a opçãoconnect
. Basta escolherinput vector line layer
epoints layer
. Há a opção de encaixar os pontos no ponto mais próximo das linhas ou criar novas conexões entre o ponto mais próximo das linhas e o novo ponto.Aqui está uma imagem antes e depois. No lado direito, para cada ponto da camada de pontos, um nó na rede rodoviária foi adicionado:
Posteriormente no PostGIS, depois de criar sua
..._vertices_pgr
tabela fora da rede rodoviária, atribua seus pontos ao vértice mais próximo para que você possa usá-los em suas solicitações de roteamento. Para esta tarefa, você pode fazer uso daST_ClosestPoint
função conforme executada por @Setraworks em sua resposta.As desvantagens dessa abordagem são:
Essa abordagem funciona bem se você tiver um número definido de pontos a serem adicionados à rede rodoviária (como no exemplo da pergunta com pontos de ônibus).
Se alguém puder fornecer um exemplo de trabalho usando o PostGIS, eu adoraria ler sobre isso!
fonte
Há uma postagem que discute um problema semelhante. Você pode vê-la no seguinte local: http://osdir.com/ml/qgis-user-gis/2011-11/msg00220.html
fonte