Saltar al contenido

Unir / fusionar líneas que se tocan y se cruzan en QGIS

Solución:

En los complementos de QGIS, encontrará un complemento de ‘combinación de líneas’, que a primera vista parece lograr lo que busca.

citado de la descripción:

MergeLines

Simplifica la topología de una red de líneas fusionando líneas adyacentes.

Este complemento fusiona segmentos de una red de líneas (por ejemplo, una red fluvial) para simplificar su topología. Actualmente hay dos métodos de fusión disponibles: longitud (un segmento se fusiona con su vecino más largo) y alineación (un segmento se fusiona con su mejor vecino alineado).

ACTUALIZAR:

A continuación encontrará un script de geoprocesamiento del que espero que haga lo que desea. Para propósitos de prueba, creé un shapefile con un montón de líneas que se cruzan irregularmente y sin atributos (red):

ingrese la descripción de la imagen aquí

El cuadro de diálogo estándar al ejecutar el script se ve así (en este caso, el resultado es una capa de memoria):

ingrese la descripción de la imagen aquí

La ejecución del script produce una ‘copia’ de los datos de entrada con un campo ‘subred’ que distingue a qué subred pertenece una característica. Con un estilo categorizado, el resultado se ve así:

ingrese la descripción de la imagen aquí

Esto se puede disolver usando el campo ‘subred’.

Cree un nuevo script de geoprocesamiento, copie el código en el editor, guárdelo y todo debería funcionar.

##Networking=group
##lIn=vector
##lOut=output vector

from qgis.core import *
from qgis.utils import *
from qgis.gui import *
from PyQt4.QtCore import *
from PyQt4.QtGui import QColor
#from processing.core.VectorWriter import VectorWriter

c=iface.mapCanvas()
rubberBand = []

v = processing.getObject(lIn)

#generate a list of all features in the layer
subNets = []
flist = []
for f in v.getFeatures():
    flist.append(f)


def makeSubnets(featureList):
    #print "making subnet ---------------------------------------------------"
    if len(featureList) > 1:
        print [featureList[0]]
        print featureList[1:]
        #print "start finding a subnet"
        fTest, fRest = findSubnet([featureList[0]], featureList[1:])
        #print "finished finding a subnet"
        subNets.append(fTest)
        makeSubnets(fRest)
    else:
        subNets.append(featureList)

def findSubnet(featTest, featRest):
    found = True
    while found:
        newTestList = []
        #print "candidates: ", len(featTest)
        #print "search in: ", len(featRest)
        #print "-------------"
        for fT in featTest:
            for fR in featRest:
                if not fT.geometry().disjoint(fR.geometry()):
                    #print "!"
                    newTestList.append(fR)
                    #addRubberBand(fR.geometry())

        featTest += newTestList

        if newTestList == []:
            found = False
        else:
            #print "Found (undis)joining segments"
            for fn in newTestList:
                if fn in featRest:
                    featRest.remove(fn)
                    #print "removed ", fn
                else:
                    pass
                    #print "allready removed ", fn

    return featTest, featRest

def addRubberBand(theGeom):
    rubberBand.append(QgsRubberBand(c, False))
    rubberBand[-1].setToGeometry(theGeom, None)
    rubberBand[-1].setColor(QColor(255,0,0))
    rubberBand[-1].setWidth(3)

makeSubnets(flist)

fields = QgsFields()
fields.append(QgsField('subnet', QVariant.Int))
writer = QgsVectorFileWriter(lOut, None, fields, QGis.WKBLineString,     v.crs())

net = 0
for sn in subNets:
    for f in sn:
        #print net, f
        feat = QgsFeature()
        feat.setFields(fields)
        feat.setGeometry(f.geometry())
        feat.setAttribute('subnet', net)
        writer.addFeature(feat)
    net += 1
del writer

ACTUALIZACIÓN # 2:

Para crear un script de geoprocesamiento, haga lo siguiente (tengo la interfaz gráfica de usuario en alemán, así que trato de traducir en en):

R: Menú ‘Procesamiento’ -> ‘Caja de herramientas’ (aparece como un muelle a la derecha)

B: en ‘Scripts […]’->’ Herramientas ‘haga doble clic en’ crear nuevo script ‘

ingrese la descripción de la imagen aquí

Aparece un editor con una pequeña barra de herramientas, en la que se copia el código anterior. Aquí puede:

C: guarde el guión. Aparece (en este caso) en el grupo ‘Networking’ o en cualquier grupo que escriba en la primera línea del guión ##MyGroup=group. Tenga cuidado de no escribir espacios en blanco en el ##-¡¡¡líneas!!!

D: Inicie el guión con los dos pequeños engranajes. Aparece una interfaz gráfica de usuario (cp. Arriba) con las capas de entrada y salida definidas en la línea de script 2 y 3. Cuando lo guarde, inicie alternativamente el script haciendo doble clic en su nombre en ‘scripts’> ‘mygroup’> ‘myscriptname’ (si está guardado debajo myscriptname.py)

ingrese la descripción de la imagen aquí

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *