6 votos

Arrastrar a todos veritices en un punto determinado mediante programación en pyqgis

Estoy escribiendo un Plugin en el que construir redes con punto y de la línea de geometrías. Una Herramienta que debe dar al Usuario la posibilidad de hacer cambios a la red arrastrando y soltando los puntos a otra ubicación. Desde los puntos son a veces conectadas a las líneas quiero el vértice de las líneas conectadas a la nueva ubicación. Me las arreglé para escribir una herramienta que hace exactamente eso, pero si varias características de línea están conectados al mismo punto de falla y sólo arrastra una línea. He probado de bucle a través de todas las funciones de línea y pensé que debería funcionar, pero sólo se mueve en una línea y no sé por qué.

aquí un par de fotos para ilustrar mi problema:

This is how the network could be made up Esta es la forma en que la red podría estar constituido por

changing one point with one line works as expected el cambio de un punto con una línea funciona como se esperaba changing the middle point fails el cambio de medio punto de falla

Escribí un maptool clase de pasar el QgsMapTool.

En el canvasPressEvent me llaman por dos métodos, uno se busca las características y el otro para los vértices. si hay resultados que permiten arrastrar y empezar a editar. Aquí está el código de partes donde creo que el problema podría estar en

def findVertexAt (self, pos):

    self.lineFeatures=[]
    self.vertices = []

    point = QgsPoint(self.canvas.getCoordinateTransform().toMapCoordinates(pos.x(), pos.y()))
    tolerance = self.calcTolerance(pos)
    searchRect = QgsRectangle(point.x() - tolerance,
                              point.y() - tolerance,
                              point.x() + tolerance,
                              point.y() + tolerance)
    request = QgsFeatureRequest()
    request.setFilterRect(searchRect)
    request.setFlags(QgsFeatureRequest.ExactIntersect)

    for feature in self.netLayer.getFeatures(request):
        self.lineFeatures.append(feature)
        i = 0 
        while i <= len(self.lineFeatures)-1:
            vertexCoord, vertex, prevVertex, nextVertex, distSquared = self.lineFeatures[i].geometry().closestVertex(QgsPointXY(point))  
            self.vertices.append(vertex)
            i = i + 1
        return self.vertices

def canvasMoveEvent(self, event):

    point = QgsPoint(self.canvas.getCoordinateTransform().toMapCoordinates(event.pos()))
    pointXY = QgsPointXY(point)

    if self.dragging:

        geometry = QgsGeometry.fromPointXY(pointXY)
        self.layer.changeGeometry(self.feature.id(),geometry)

        if self.lineDragging:
            i = 0
            while i <= len(self.lineFeatures)-1:
                lineGeometry = self.lineFeatures[i].geometry()
                lineGeometry.moveVertex(point, self.vertices[i])                     
                self.netLayer.changeGeometry(self.lineFeatures[i].id(), lineGeometry)
                i = i + 1

El canvasRelease evento, a continuación, simplemente desactiva arrastrar y confirma los cambios

7voto

Elliott Maynard Puntos 11

Esto se puede hacer utilizando QGIS herramientas que se puede activar mediante programación. Es decir, no hay necesidad de reinventar la rueda.

Es decir, usted necesita:

  1. Haga clic en el Enable Topological Editing botón en la Snapping toolbar.

    enter image description here

  2. Iniciar la sesión de edición en su punto y de la línea de capas.

  3. Haga clic en Vertex Tool (All layers).

    enter image description here

Esto permite que una herramienta que puede utilizar para mover un vértice común en tanto punto y de la línea de capas, como se puede ver en este GIF:

enter image description here

El código para permitir que una herramienta de este tipo sería:

QgsProject.instance().setTopologicalEditing(True)

points = QgsProject.instance().mapLayersByName('points')[0]
lines = QgsProject.instance().mapLayersByName('lines')[0]

points.startEditing()
lines.startEditing()

iface.layerTreeView().setCurrentLayer(points)
iface.actionVertexTool().trigger()

Espero que esto ayude!

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