Encontrar interseções de recursos em uma camada de linha usando QGIS
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
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 eps
valor 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.
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".
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.
- Execute Extrair vértices específicos com 0 e -1 (para obter pontos para todos os nós inicial e final)
- Use Buffer no resultado com, digamos, 0,2 metros ou algo assim, talvez menos dependendo dos seus dados.
- 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.
- 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.
- 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)