def average_linestrings(line1: QgsLineString, line2: QgsLineString, weight: float = 1) -> QgsLineString: """ Averages two linestring geometries """ g1 = line1.clone() # project points from g2 onto g1 for n in range(line2.numPoints()): vertex = line2.pointN(n) _, pt, after, _ = g1.closestSegment(vertex) g1.insertVertex(QgsVertexId(0, 0, after.vertex), pt) # iterate through vertices in g1 out = [] for n in range(g1.numPoints()): vertex = g1.pointN(n) _, pt, after, _ = line2.closestSegment(vertex) # average pts x = (vertex.x() * weight + pt.x()) / (weight + 1) y = (vertex.y() * weight + pt.y()) / (weight + 1) out.append(QgsPoint(x, y)) return QgsLineString(out)
def qgslinestring_angle(linestring: QgsLineString, point: QgsPoint): """ Calculate angle of a QgsLineString at specified QgsPoint. """ distance, closest_point, vertex_id, left_of = linestring.closestSegment(point) """ print( distance, closest_point, linestring.vertexNumberFromVertexId(vertex_id), left_of ) """ p1 = linestring.pointN(linestring.vertexNumberFromVertexId(vertex_id) - 1) p2 = linestring.pointN(linestring.vertexNumberFromVertexId(vertex_id)) return vector_angle(p1, p2)