6 votos

Cómo contar el número de líneas conectadas a un punto?

Tengo una red de agua que y necesito instalar codos y Tees (T). Cuando 2 líneas de conectarse a un punto, quiero instalar un codo, cuando 3 se conectan las líneas, quiero instalar una Camiseta.

¿Cómo puedo obtener ArcGIS o QGIS para determinar el número de líneas que están conectadas a un punto, y designar a un codo o una camiseta basa en que criterios?

enter image description here

6voto

GreyCat Puntos 146

No es un problema de geometría (buffer, etc.) pero un simple problema de Teoría de grafos (nodos y bordes conectados) y Python tiene muchos módulos para lidiar con los Gráficos (PythonGraphApi, Gráficas en Python, Python Patrones de la Aplicación de Gráficos, ...)

En su problema, usted no necesita una capa de puntos, usted sólo necesita los puntos o nodos de la polilínea. Ellos son los vértices/nodos de un Grafo y los segmentos entre dos nodos son los bordes de la misma Gráfica. Y usted quiere encontrar los nodos con un grado 2 y 3 (número de aristas incidentes a los vértices a = cuando 2 líneas de conectarse a un punto, quiero instalar un codo, cuando 3 se conectan las líneas, quiero instalar un Tee)

La capa:

enter image description here

La Gráfica correspondiente donde podemos ver directamente los puntos (2 y 3 se conectan las líneas de figuras hechas con la NetworkX módulo):

enter image description here

Voy a utilizar aquí la NetworkX módulo (puro módulo de Python). El módulo puede abrir directamente los archivos de forma que genera un networkx.Gráfico (Networkx: SIG shapefile) pero yo lo hago en la consola de Python de QGIS:

Tenemos que extraer todos los segmentos de la capa (de punto a punto): la cadena de línea debe ser iterado pares de dividir la polilínea en segmentos.

def pairs(list):
    '''generator to iterate over pairs in a list '''
    for i in range(1, len(list)):
        yield list[i-1], list[i]

La creación de la Gráfica:

import networkx as nx 
# select the polyline layer
layer = qgis.utils.iface.activeLayer()
# create a Graph
G = nx.Graph()
# add the nodes and the edges to the Graph = segment point i -> point i+1
for features in layer.getFeatures():
    segment = features.geometry().asPolyline()
    # add the two end points of a segment as two nodes and an edge (point1 -> point2) to the Graph
    for seg_start, seg_end in pair(segment):
        G.add_edges_from([(seg_start, seg_end)])

Ahora tenemos los nodos y las aristas de la Gráfica:

 print G.nodes() # = nodes of the polyline in (x,y) form
 [(198133,93258.8), (198757,93232.4), (197592,94296.2), (197579,93232.4), (198761,94274.3), (198146,94287.5)]
 print G.edges() # = all the segments of the polyline
 [((198133,93258.8), (198146,94287.5)), ((198757,93232.4), (198761,94274.3)), ((197592,94296.2), (197579,93232.4)), ((197592,94296.2), (198146,94287.5)), ((198761,94274.3), (198146,94287.5))]

Buscamos los nodos que el grado es > 1

 for i in G.nodes():
    if G.degree(i) > 1:
        print QgsPoint(i), G.degree(i)
 (197592,94296.2) 2
 (198761,94274.3) 2
 (198146,94287.5) 3

Y obtenemos los puntos:

Resultado:

enter image description here

4voto

betzelelgalut Puntos 16

Depende de Su estructura de datos y precisión, pero supongo que ha capas separadas por puntos y líneas. Si es así, esto es relativamente fácil con Python (PyQGIS o arcpy) - ejemplo con pyqgis podría tener este aspecto:

#point_layer - vector layer with points
#line_layer - vector layer with lines

iter_p=point_layer.getFeatures() #features from layer
iter_l=list(line_layer.getFeatures()) #changing iterator to list to avoid exhaustion

connections=0 #counter for number of intersections

for p in iter_p:
    geom_p=p.geometry().buffer(10,3) #create a small buffer around points, 10 is an arbitrary value, change it according to precision of Your data
    for l in iter_l:
        geom_l=l.geometry()
        if geom_p.intersects(geom_l):
            connections=connections+1 # if intersection is true increase counter by one
    if connections==2:
        #here a set of instructions for doing something - for example changing attrubute value for Tee, elbow or something else 
    #etc...for each significant value of intersections
    connections=0 #reseting counter

2voto

xenny Puntos 670

En Arcgis, la forma más simple es el uso de "spatial join" : esto le dará el número de líneas que interesect su punto. Con el fin de asegurarse de que sus puntos están ubicados exactamente en las intersecciones, una de integrar podría ser necesario.

Por otro lado, usted debe ser consciente de la topología con el fin de saber lo que te están contando. Usted asume aquí que todas sus líneas se dividen en punto de ubicación, pero usted debe asegurarse de que. De lo contrario, usted podría tener los puntos de intersección de 2 líneas en un Tee. Un método más robusto tendría, por tanto, consisten en la creación de buffers alrededor de cada punto y contando el número de puntos de las intersecciones entre las líneas y el búfer, no sólo el número de líneas que se cruzan.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X