Beispiel #1
0
    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)
Beispiel #2
0
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)