Encontrar interseções de recursos em uma camada de linha usando QGIS

Nov 25 2020

Quero encontrar interseções na mesma camada como a imagem abaixo. Todas as linhas são recursos separados na mesma camada.

Como posso encontrar essas interseções no QGIS?

Respostas

8 KadirŞahbaz Nov 25 2020 at 10:26

Usando o script a seguir, você pode obter o resultado esperado. Mas, em primeiro lugar, use a "Vector geometry > Multipart to singleparts"ferramenta se os pares de linhas da mesma cor têm as mesmas características. Porque o script usa o ponto mais próximo entre as geometrias.

Defina o nome da camada. Você também precisa definir o epsvalor epsilon ( ) para assumir que duas linhas se cruzam ou se tocam. Porque pequenas mudanças no decimal nas coordenadas afetam o resultado. Portanto, algumas ferramentas e funções relacionadas a uma geometria contêm um limite.

Presumo que os dados estejam no sistema de coordenadas projetadas. Se for geográfico, diminua eps.

# specify minimum distance to assume that lines intersect/touch
eps = 0.01 # 0.01 meter = 1 cm

line_lyr = QgsProject.instance().mapLayersByName('LINE_LAYER_NAME')[0]
crs = line_lyr.crs().authid()

# make new point layer
point_lyr = QgsVectorLayer("Point?crs=" + crs, "points", "memory")
point_lyr.startEditing()

for line1 in line_lyr.getFeatures():
    geom1 = line1.geometry()
    
    for line2 in line_lyr.getFeatures():
        geom2 = line2.geometry()
        
        if (geom1.distance(geom2) < eps 
            and line1.id() < line2.id()): # to avoid duplicate points 
               
            point = geom1.nearestPoint(geom2)
            feature = QgsFeature()
            feature.setGeometry(point)
            point_lyr.addFeature(feature)    
    
point_lyr.commitChanges()
QgsProject.instance().addMapLayer(point_lyr)

Nota: O script também fornece o ponto de intersecção destacado na imagem.

6 Taras Nov 25 2020 at 06:22

Tente usar o geoalgoritmo " Intersecções de linhas" que cria pontos onde as linhas se cruzam.

Observe que para 'Input layer'e 'Intersect layer'a mesma camada de linha foi escolhida.

Se as linhas estiverem desconectadas (veja a imagem abaixo), alguns ajustes adicionais de geometria são necessários, ou seja, encaixe.

Para encaixar geometrias em uma camada para as geometrias dentro da mesma camada, aplique "Snap geometrias para camada" .

E depois aplique o geoalgoritmo "Intersecções de linha".

1 hexamon Nov 26 2020 at 08:05

Estou assumindo que cada linha é um recurso, em vez de cada segmento ser um recurso. Você pode então tentar sobrepor os nós iniciais e finais em buffer com a camada de linha.

  1. Execute Extrair vértices específicos com 0 e -1 (para obter pontos para todos os nós inicial e final)
  2. Use Buffer no resultado com, digamos, 0,2 metros ou algo assim, talvez menos dependendo dos seus dados.
  3. Execute Join Attributes By Location (Summary) com os nós inicial e final armazenados em buffer como Input e a camada de linha como Join layer. Certifique-se de marcar a caixa Contar em resumos para calcular . Isso lhe dará uma contagem de quantas linhas esse nó em buffer se sobrepõe.
  4. Na camada de saída do Join, filtre todos os recursos que têm uma contagem menor que 2. Os restantes devem ser suas interseções.
  5. Execute Centroids no resultado para obter os nós de volta como pontos ou selecione os nós extraídos originais que se sobrepõem aos resultados por meio de Selecionar por localização .

A ideia é que todos os nós em buffer devem ter 1 sobreposição de sua própria linha original, a menos que eles se cruzem com outra linha, então a contagem será 2 (ou mais para interseções multilinhas)