Estoy usando QGIS 3.2. Tengo 4 campos ("kk1"-"kk4") donde al menos uno de los campos contiene un número (real). Quiero calcular la media de estos 1-4 campos y guardar el resultado (la media) en otro campo llamado "mkviskrans". Calculo la media ( basado en esta respuesta ) de estos campos 1-4 usando esta función en la ventana del Editor de Funciones en las Propiedades de las Capas:
@qgsfunction(args=-1, group='Custom')
def mean_col(cols, feature, parent):
vals = [feature[i] for i in cols if feature[i] is not None]
return sum(vals)/float(len(vals))
y llamando a la función desde la ventana de Expresión en la opción Valor por defecto del widget en Propiedades de la capa:
mean_col('kk1','kk2','kk3','kk4')
ACTUALIZACIÓN : Lo intenté return 2.3
en lugar de return sum(vals)/float(len(vals))
. En este caso la tabla de atributos se actualiza automáticamente con el valor 2.3. Esto indica que los valores introducidos por el usuario en "kk1"-"kk4" tienen que ser actualizados/evaluados/"comprometidos". antes de que devuelve el valor medio, es decir, la división-expresión siempre devolverá "Ninguno"? He intentado actualizar los valores de característica/campo de "kk1"-"kk4" antes de devolverlos, pero sin suerte hasta ahora.
Sin embargo, el valor medio no aparece automáticamente en el widget "mkviskrans" "Text Edit" (alias "Midlere kvistkransavstand (dm)"): Ni en la tabla de atributos: Cuando hago clic en una celda de la tabla de atributos, aparece el valor medio: ¿Es posible obtener/mostrar/guardar el valor "sobre la marcha"? He probado diferentes variantes de actualización y/o confirmación dentro de la función:
@qgsfunction(args=-1, group='Custom')
def mean_col(cols, feature, parent):
layer = qgis.utils.iface.activeLayer()
fieldIndex = layer.fields().indexFromName( 'mkviskrans' )
vals = [feature[i] for i in cols if feature[i] is not None]
"""return sum(vals)/float(len(vals))"""
mv = sum(vals)/float(len(vals))
layer.changeAttributeValue(feature.id(), fieldIndex, mv)
layer.commitChanges()
Si guardo las ediciones sin hacer clic en una celda de la tabla de atributos, el promedio (el campo "mkvistkrans") no contendrá ningún valor medio.
(Por supuesto que puedo calcular los valores medios después del trabajo de campo, pero quiero que el usuario vea el valor medio "sobre la marcha" - si es posible).