Estou tentando usar o QGIS 2.14 para conectar uma rede de estradas a uma grade hexagonal, mas estou obtendo artefatos estranhos.
Eu criei uma grade hexagonal com MMQGIS , as células são aproximadamente 20 x 23 m. Eu tampei a rede rodoviária em 1m e a densifiquei para que haja um nó a cada poucos metros. Você pode ver o que estou tentando alcançar abaixo. Como você pode ver, posso fazê-lo funcionar em alguns casos: -
- azul é a estrada densificada (uma linha em buffer)
- vermelho é a versão 'hexificada' - é isso que eu quero encontrar
- o cinza é a grade hexagonal
Em seguida, usei o novo recurso Geometrias de snap para encaixar os nós no canto hexagonal mais próximo. Os resultados são promissores, mas parece haver alguns casos extremos em que a linha se expande para preencher o hexágono (ou parte dele): -
O motivo do buffer é que as geometrias de Snap não permitem que você faça snap em uma camada cuja geometria é diferente. Por exemplo, você não pode encaixar nós em uma camada LINE para pontos em uma camada POINT). Parece ser o mais feliz encaixar POLYGON em POLYGON.
Suspeito que as estradas se expandem quando um lado da linha da estrada com buffer salta para um lado da célula hexadecimal e o outro lado pula para o outro lado da célula hexadecimal. No meu exemplo, as estradas que cruzam oeste-leste em um ângulo agudo parecem ser as piores.
Coisas que eu tentei, sem sucesso: -
- protegendo a rede rodoviária por uma pequena quantidade, permanecendo um polígono, mas é muito fino.
- densificar as células hexadecimais (para que haja nós ao longo das bordas, não apenas nos cantos)
- variando a distância máxima de encaixe (isso tem o maior efeito, mas não consigo encontrar um valor ideal)
- usando camadas LINE, não POLYGONs
Acho que, se eu mudar para o uso de apenas camadas de linha, ele funcionará por um tempo e travará. Parece salvar seu trabalho à medida que avança - algumas linhas foram parcialmente processadas.
Alguém sabe de outra maneira de ajustar pontos em uma linha para o ponto mais próximo em outra camada de linha / polígono, idealmente sem precisar usar o postgres / postgis (embora uma solução com o postgis também seja bem-vinda)?
EDITAR
Para quem quiser experimentar, coloquei um projeto inicial do QGIS aqui no Dropbox . Isso inclui as camadas de grade hexadecimal e de densidade. (A rede rodoviária é do OSM, portanto, pode ser baixada usando o QuickOSM, por exemplo, se você precisar fazer com que o original subestime as estradas).
Observe que está no OSGB (epsg: 27700) que é um UTM localizado para o Reino Unido, com unidades em metros.
Respostas:
Minha solução envolve um script PyQGIS que é mais rápido e eficaz do que um fluxo de trabalho que envolve snapping (tentei também). Usando meu algoritmo, obtive estes resultados:
Você pode executar os seguintes trechos de código em sequência no QGIS (no console do QGIS Python). No final, você obtém uma camada de memória com as rotas encaixadas no QGIS.
O único pré-requisito é criar um Shapefile de estrada com várias partes (use
Processing->Singleparts to multipart
, usei o campofictitiuos
comoUnique ID field
parâmetro). Isso nos dará umroads_multipart.shp
arquivo com um único recurso.Aqui está o algoritmo explicado:
Obtenha os lados hexagonais mais próximos onde as rotas se cruzam. Para cada hexágono, criamos 6 triângulos entre cada par de vértices vizinhos e o centróide correspondente. Se alguma estrada cruzar um triângulo, o segmento compartilhado pelo hexágono e pelo triângulo será adicionado à rota final ajustada. Esta é a parte mais pesada de todo o algoritmo, que demora 35 segundos em execução na minha máquina. Nas duas primeiras linhas existem 2 caminhos de Shapefile, você deve ajustá-los para se ajustarem aos seus próprios caminhos de arquivo.
Livre-se dos segmentos desconectados (ou 'abertos') usando listas, tuplas e dicionários do Python . Nesse ponto, existem alguns segmentos desconectados restantes, ou seja, segmentos que têm um vértice desconectado, mas o outro conectado a pelo menos outros 2 segmentos (veja segmentos vermelhos na próxima figura). Precisamos nos livrar deles.
Agora podemos criar uma camada vetorial da lista de coordenadas e carregá-la no mapa QGIS :
Outra parte do resultado:
Se você precisar de atributos nas rotas ajustadas, poderíamos usar um Índice Espacial para avaliar rapidamente interseções (como em /gis//a/130440/4972 ), mas isso é outra história.
Espero que isto ajude!
fonte
Eu fiz isso no ArcGIS, certamente pode ser implementado usando QGIS ou simplesmente python com pacote capaz de ler geometrias. Certifique-se de que as estradas representem a rede, ou seja, se cruzem apenas nas extremidades. Você está lidando com OSM, suponho que seja o caso.
Se você não quiser ver isso:
Não tente usar pontos de corrente nas linhas Voronoi. Eu temia que isso só piorasse. Portanto, sua única opção é criar uma rede a partir das linhas de Voronoi e encontrar rotas entre os pontos finais da estrada, o que também não é grande coisa.
fonte
Sei que você está pedindo um método QGIS, mas aceite uma resposta complicada:
Notas:
fonte
Se você dividir a linha da estrada em segmentos em que cada segmento esteja completamente contido pelo hexágono, sua decisão sobre quais segmentos de linha do hexágono usar seria se a distância do centróide do segmento da estrada dividida ao ponto médio de cada lado do hexágono era menos da metade da diâmetro do hexágono (ou menor que o raio de um círculo que se encaixa dentro do hexágono).
Portanto, se você (um segmento de cada vez) seleciona segmentos de linhas hexagonais (em que cada segmento é um lado do hexágono) que estão a uma distância do raio do hexágono, você pode copiar essas geometrias de linhas e mesclá-las em qualquer identificador exclusivo usado para o conjunto de dados da estrada.
Se você tiver problemas para mesclar no identificador exclusivo, poderá aplicar o buffer e selecionar por local somente esses segmentos para aplicar os atributos do seu conjunto de dados da estrada; Dessa forma, você não precisaria se preocupar em fazer correspondências falsas com um buffer muito grande.
O problema com a ferramenta snap é que ela encaixa pontos indiscriminadamente; é difícil encontrar a tolerância perfeita para usar. Com essa metodologia, você identificaria corretamente quais segmentos de linhas hexagonais usar e, em seguida, substituiria a geometria dos dados de sua estrada (ou inseriria as geometrias em um conjunto de dados diferente).
Além disso, se você ainda tiver problemas com os segmentos de linha que saltam de um lado do hexágono para o outro, poderá dividir a linha em segmentos por vértices, calcular o comprimento de cada linha e remover quaisquer segmentos de linha maiores que o comprimento médio de um lado do hexágono.
fonte
O snapper de geometria no qgis 3.0 foi reformulado e agora permite o snap entre diferentes tipos de geometria. Ele também tem muitas correções. Você pode tentar uma versão "instantâneo diário" para obter acesso ao snapper aprimorado antes que o 3.0 seja lançado oficialmente.
fonte