Tenho dados de pontos ao longo das ruas, gostaria de transformar esses pontos em simples linhas coloridas. Qualquer ponteiro como esse problema pode ser chamado ou qualquer algoritmo que possa me ajudar a resolver isso?
Eu esperava usar PostGIS
funções para fazer isso, mas estou aberto a sugestões, esses são dados de um .shp
arquivo.
Edit1: Atualizado a imagem para demonstrar a solução ideal desse problema.
Desenhar a linha seria puramente baseado na distância entre esses pontos; não há mais nada que eu possa usar para agrupá-los. Idealmente, isso seria pontos à distância máxima especificada ao longo da linha projetada? E por linha projetada, quero dizer, encontrar o 1º ponto e o próximo mais próximo, em seguida, projetar uma linha e verificar se há algum ponto nessa linha a uma distância máxima de qualquer um dos que já estão na linha.
Respostas:
O que outras pessoas estão dizendo
Você pode usar uma consulta recursiva para explorar o vizinho mais próximo de cada ponto, começando em cada extremidade detectada das linhas que deseja construir.
Pré - requisitos : prepare uma camada postgis com seus pontos e outra com um único objeto Multi-linestring contendo suas estradas. As duas camadas devem estar no mesmo CRS. Aqui está o código para o conjunto de dados de teste que eu criei, modifique-o conforme necessário. (Testado no postgres 9.2 e postgis 2.1)
Aqui estão os passos :
Gere para cada ponto a lista de todos os vizinhos e a distância deles que atendem a esses três critérios.
A distância não deve exceder uma proporção definida pelo usuário da distância do vizinho mais próximo (isso deve acomodar melhor a digitalização irregular do que a distância fixa)Essa parte era realmente muito difícil de implementar, aderida ao raio de pesquisa fixoVamos chamar esta tabela de "o gráfico"
Selecione o ponto final da linha juntando-se ao gráfico e mantendo apenas o ponto que possui exatamente uma entrada no gráfico.
Vamos chamar esta tabela de "eol" (fim de linha)
fácil? que a recompensa por fazer um ótimo gráfico, mas as coisas de espera ficarem loucas na próxima etapa
Configure uma consulta recursiva que alternará de vizinhos para vizinhos a partir de cada eol
Vamos chamar esta tabela de "recurse_eol"
Mantenha apenas a linha mais longa para cada ponto inicial e remova todos os caminhos duplicados exatos Exemplo: os caminhos 1,2,3,5 E 5,3,2,1 são a mesma linha descoberta por seus dois "final de linha" diferentes
Verifica manualmente os erros restantes (pontos isolados, linhas sobrepostas, ruas de formas estranhas)
Atualizado como prometido, ainda não consigo descobrir por que a consulta recursiva às vezes não fornece exatamente o mesmo resultado ao iniciar a partir do eol oposto de uma mesma linha, para que algumas duplicatas possam permanecer na camada de resultados a partir de agora.
Sinta-se à vontade para perguntar que entendo totalmente que esse código precisa de mais comentários. Aqui está a consulta completa:
fonte
Como o @FelixIP aponta, o primeiro passo é encontrar os pontos que formarão cada linha. Você pode fazer isso chamando ST_ClusterWithin com sua distância máxima de separação:
Em seguida, você precisará usar alguma heurística para criar uma linha através de todos os pontos em cada cluster. Por exemplo, se você puder assumir que as linhas desejadas sejam monotônicas em Y, poderá classificar os pontos em cada cluster e alimentá-los no ST_MakeLine . Combinando que todos juntos ficariam assim:
fonte