4 votos

Cómo seleccionar campos específicos usando getFeatures() sin obtenerlos todos en QGIS-3.10

Así que estoy tratando de convertir el código de ArcGIS a QGIS. La parte que estoy en este momento es la conversión:

lst_fields = ["full_id", "osm_id", "osm_type", "boundary", "is_in", "leisure", "name", "type", "landuse"]
with arcpy.da.UpdateCursor(urh, lst_fields) as cursor:
    for row in cursor:
         ...

Sin embargo, con QGIS tengo que utilizar en su lugar:

with edit(vector_layer):
    for row in vector_layer.getFeatures(request):

No encontré la forma de obtener sólo los campos especificados en la lista aparte de hacer otro bucle for y hacer esto y luego almacenar los valores en otra lista:

row.attributes()[row.fields().indexFromName('boundary')]

El código que tengo ahora mismo es:

lst_fields = ["full_id", "osm_id", "osm_type", "boundary", "is_in", "leisure", "name", "type", "landuse"]
vector_layer = QgsVectorLayer(repertoire+'\\protected_areas.shp','ogr')
request = QgsFeatureRequest().setSubsetOfAttributes(lst_fields, vector_layer.fields())

with edit(vector_layer):
    for row in vector_layer.getFeatures(request):
        print(lst_fields)
        print(row.fields().names())

La primera huella da esto:

['full_id', 'osm_id', 'osm_type', 'boundary', 'is_in', 'leisure', 'name', 'type', 'landuse']

La segunda huella da esto:

['full_id', 'osm_id', 'osm_type', 'boundary', 'is_in', 'leisure', 'name', 'type', 'wikidata', 'wikipedia', 'landuse', 'name_de', 'sagns_id', 'website']

Pensé que la petición haría que las dos impresiones dieran el mismo resultado. Volveré a decir cuál es mi pregunta por si no ha quedado claro:

¿Hay alguna forma de obtener sólo los campos especificados en la lista como era posible en arcGIS sin necesidad de otro bucle for que guardara el valor de 1 campo cada vez?

3voto

user160584 Puntos 61

German ya señaló que QgsFeatureRequest.setSubsetOfAttributes([li_required_idx]) devuelve None para cualquier atributo que no esté en li_required_idx . Con un poco de comprensión de listas es posible obtener li_attr igual a li_fields en el siguiente código:

lyr = iface.activeLayer()
li_required_fields = ["POP_EST", "NAME_RU", "POP_DENSITY"]
request = QgsFeatureRequest().setSubsetOfAttributes(li_required_fields, lyr.fields())

for f in lyr.getFeatures(request):
    li_attr = [attr for attr in f.attributes() if attr is not None]
    print(li_attr)

Ahora todos los atributos de la solicitud ( li_required_fields ) están en ( li_attr ). Si desea obtener 1 atributo a la vez, entonces usando la función f[required_attr] es probablemente el mejor enfoque, como sugirió German.

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