Encontrar intersecciones de características en una capa de línea usando QGIS

Nov 25 2020

Quiero encontrar intersecciones en la misma capa como la imagen de abajo. Todas las líneas son entidades independientes en la misma capa.

¿Cómo puedo encontrar estas intersecciones en QGIS?

Respuestas

8 KadirŞahbaz Nov 25 2020 at 10:26

Con el siguiente script puede obtener el resultado que espera. Pero, en primer lugar, utilice la "Vector geometry > Multipart to singleparts"herramienta si los pares de líneas del mismo color tienen las mismas características. Porque el script usa el punto más cercano entre geometrías.

Establecer el nombre de la capa. También necesita establecer el epsvalor de epsilon ( ) para asumir que dos líneas se cruzan o se tocan. Porque pequeños cambios en decimales en coordenadas afectan el resultado. Por lo tanto, algunas herramientas y funciones relacionadas con una geometría contienen un umbral.

Supongo que los datos están en el sistema de coordenadas proyectadas. Si es geográfico, disminuya 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: La secuencia de comandos también muestra el punto de intersección resaltado en la imagen.

6 Taras Nov 25 2020 at 06:22

Intente usar el geoalgoritmo "Intersecciones de líneas" que crea puntos donde las líneas se cruzan.

Tenga en cuenta que para 'Input layer'y 'Intersect layer'se eligió la misma capa de línea.

Si las líneas están desconectadas (vea la imagen a continuación), se requiere algún ajuste de geometría adicional, es decir, un ajuste.

Para ajustar geometrías en una capa a las geometrías dentro de la misma capa, aplique "Ajustar geometrías a capa" .

Y luego aplicar el geoalgoritmo "Intersecciones de líneas".

1 hexamon Nov 26 2020 at 08:05

Supongo que cada línea es una característica en lugar de que cada segmento sea una característica. A continuación, puede intentar superponer los nodos inicial y final almacenados en búfer con la capa de línea.

  1. Ejecute Extraer vértices específicos con 0 y -1 (para obtener puntos para todos los nodos iniciales y finales)
  2. Use Buffer en el resultado con, digamos, 0.2 metros o algo, tal vez menos dependiendo de sus datos.
  3. Ejecute los atributos de unión por ubicación (resumen) con los nodos inicial y final almacenados en búfer como entrada y la capa de línea como capa de unión. Asegúrese de marcar la casilla Contar en resúmenes para calcular . Esto le dará un recuento de cuántas líneas se superpone este nodo en búfer.
  4. En la capa de salida de Join, filtre todas las entidades que tengan un recuento de menos de 2. Las restantes deberían ser sus intersecciones.
  5. Ejecute Centroides en el resultado para recuperar los nodos como puntos, o seleccione los nodos extraídos originales que se superponen a los resultados mediante Seleccionar por ubicación .

La idea es que todos los nodos almacenados en búfer deben tener 1 superposición de su propia línea original, a menos que se crucen con otra línea, entonces el recuento será 2 (o más para las intersecciones de varias líneas).