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:
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):
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: