11 votos

Valor máximo del campo de la capa vectorial utilizando PyQGIS

Si tengo una capa vectorial en QGIS, ¿cómo puedo utilizar Python para encontrar el valor máximo que tiene un campo determinado?

Necesito convertir los valores de un campo en valores entre 0 y 1 . Por lo tanto, supongo que tengo que ponerlo en val/maxVal . Por eso necesito encontrar el valor máximo.

0 votos

¿y si quiero evaluar el máximo de cada valor único? Esto no funciona en absoluto... ¿alguien podría encontrar el error? gracias uniquevalues=layer.uniqueValues(index,limit=10000) for uv in uniquevalues: features = layer.getFeatures() for feat in features: values = [] attrs = feat.attributes() values.append(attrs[field]) if feat[field] == uv: maxarea = max(values)

19voto

Yada Puntos 9489

No es necesario obtener una lista completa de los valores de los campos. En QgsVectorLayer existe el método 'maximumValue'. Entonces, esto funciona bien y es más corto:

layer = iface.activeLayer()

idx = layer.fieldNameIndex('fieldName')
print layer.maximumValue(idx)

1 votos

I realmente debería leer la API más a menudo ;)

0 votos

Perfecto - justo lo que necesitaba, y funciona perfectamente. Gracias.

3 votos

Sólo una nota - la mayor ventaja de usar QgsVectorLayer.maximumValue sobre iterar a través de cada valor es que maximumValue puede entregar el cálculo del máximo a la propia fuente de datos. Es decir, para una capa Postgres QGIS enviará una simple consulta "select max("field") from ..." a la base de datos, en lugar de tener que obtener cada característica de la base de datos e iterar a través de ellos. Es una ganancia dramática de rendimiento.

10voto

Rebecca Puntos 51

La respuesta aceptada no funciona en QGIS3.

Ahora hay que hacerlo:

fieldname='id'
layer=iface.activeLayer()
idx=layer.fields().indexFromName(fieldname)
print(layer.maximumValue(idx))

(Pongo el nombre del campo como primera línea para que sea más fácil de cortar y pegar para alguien que quiera probarlo con su capa)

5voto

Mue Puntos 2469

Puede utilizar lo siguiente en el Consola Python para imprimir el valor máximo de un campo determinado:

values = []
layer = qgis.utils.iface.activeLayer()
idx = layer.fieldNameIndex('fieldName')
for feat in layer.getFeatures():
    attrs = feat.attributes()
    values.append(attrs[idx])

print max(values)

1 votos

No es necesario obtener una lista completa de los valores de los campos. En QgsVectorLayer existe el método 'maximumValue'.

1 votos

También funciona, pero la de @xunilk es la mejor solución.

0 votos

@TomChadwin - No se puede discutir allí =)

1voto

ARUNBALAN NV Puntos 101

También existen otros enfoques:

Enfoque 1 : QgsAggregateCalculator con Max

Agregados disponibles para calcular.

No todos los agregados están disponibles para todos los tipos de campo.

Este enfoque está disponible desde QGIS 2.16.

layer = iface.activeLayer()
max_value = layer.aggregate(QgsAggregateCalculator.Max, "name_of_your_field")[0]
print(max_value)

Enfoque 2 : QgsVectorLayerUtils

Contiene métodos de utilidad para trabajar con QgsVectorLayers.

Este enfoque está disponible desde QGIS 3.

layer = iface.activeLayer()
max_value = max(QgsVectorLayerUtils.getValues(layer, "name_of_your_field")[0])
print(max_value)

Enfoque 3 : QgsVectorLayer clase con getFeatures() método

Similar a la solución de @Joseph

layer = iface.activeLayer()
max_value = max([feat["name_of_your_field"] for feat in layer.getFeatures()])
print(max_value)

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