Como se puede actualizar automáticamente la tabla de atributos de una capa en Qgis al mover una línea, de forma que se actualicen los campos que contienen las coordenadas de inicio y de final de la línea con código Python
Respuestas
¿Demasiados anuncios?Para actualizar automáticamente la tabla de atributos de una capa en QGIS al mover una línea y actualizar los campos de coordenadas de inicio y final de la línea con código Python, puedes utilizar el siguiente script:
from qgis.core import QgsProject
# Obtener la capa activa
layer = iface.activeLayer()
# Conectar la señal de edición de la capa
layer.featureAdded.connect(updateAttributes)
# Función para actualizar los atributos al mover la línea
def updateAttributes(feature):
# Obtener la geometría de la línea
geom = feature.geometry()
# Obtener las coordenadas de inicio y final de la línea
start_point = geom.vertexAt(0)
end_point = geom.vertexAt(geom.vertexCount() - 1)
# Actualizar los campos de coordenadas de inicio y final en la tabla de atributos
layer.startEditing()
feature.setAttribute('start_coord', start_point)
feature.setAttribute('end_coord', end_point)
layer.updateFeature(feature)
layer.commitChanges()
# Guardar el proyecto de QGIS
QgsProject.instance().write()
Este script se encarga de conectar la señal de edición de la capa activa en QGIS y al mover una línea, se ejecuta la función updateAttributes
que actualiza los campos de coordenadas de inicio y final en la tabla de atributos. Recuerda guardar el proyecto de QGIS después de ejecutar el script para que los cambios queden guardados.
No consigo que se conecte y ejecute la función updateAttributes. Tengo una capa con los siguientes atributos: Xi, Yi, Xf, Yf que son las coordenadas iniciales y finales de la línea. Dibujo una línea y si ejecuto este código
from qgis.core import QgsProject
# def updateAttributes(feature):
layer = iface.activeLayer() features = layer.getFeatures() for feature in features:
Obtener la geometría de la línea
geom = feature.geometry()
# Obtener las coordenadas de inicio y final de la línea
start_point = geom.vertexAt(0)
x1=start_point.x()
y1=start_point.y()
# end_point = geom.vertexAt(geom.vertexCount() - 1)
end_point = geom.vertexAt(1)
x2=end_point.x()
y2=end_point.y()
print('x1: ', x1)
print('y1: ', y1)
print('x2: ', x2)
print('y2: ', y2)
# Actualizar los campos de coordenadas de inicio y final en la tabla de atributos
layer.startEditing()
feature.setAttribute('Xi', x1)
feature.setAttribute('Yi', y1)
feature.setAttribute('Xf', x2)
feature.setAttribute('Yf', y2)
layer.updateFeature(feature)
layer.commitChanges()
# Conectar la señal de edición de la capa
# layer.featureAdded.connect(updateAttributes)
QgsProject.instance().write()
obtengo: exec(Path('C:/Users/Admin/AppData/Local/Temp/tmpn8d1cz85').read_text()) x1: 295104.8545802747 y1: 4335509.52886282 x2: 295842.04603664426 y2: 4335717.9494839925 y en la tabla de atributos el campo Xi -> NULL y los demás campos se actualizan correctamente
Creo que la solución a mi pregunta era tan fácil como poner en la capa, en sus propiedades, en Valor predeterminado, la expresión x( start_point( $geometry )) para la coordenada X de inicio de la línea y x(end_poin($geometry)) para la X final. Y en la coordenada Y poner y(start_point($geometry) e y(end_point($geometry) para el final de línea. Marcando la casilla de Aplicar valor predeterminado al actualizar. No se aún como hacerlo con código, aunque quizás, después de configurar las propiedades de la capa, no lo necesite. Muchas gracias por su ayuda, con la que seguiré practicando.