¿Cómo obtener los datos de una característica seleccionada en QGIS usando Python?

10

Tengo un problema / pregunta con respecto a python y QGIS. ¿Es posible obtener los datos de una característica seleccionada en QGIS usando python, y si es así, cómo?

En mi ejemplo, tengo una capa que muestra algunas parcelas para la planificación urbana. Si ahora selecciono una de las parcelas, quiero obtener los datos para exactamente esta parcela. Estos datos deben leerse mediante un script de Python y luego agregarse a un archivo PDF creado automáticamente. El último paso es fácil, pero no obtuve los datos de esta función seleccionada.

Es posible obtener datos de la capa activa, pero ¿también es posible obtener los datos de una característica seleccionada de esta capa?

Espero que me pueda ayudar. Saludos

Sven
fuente

Respuestas:

15

Las llamadas layer.selectedFeatures()devolverán una lista con las funciones seleccionadas. Luego puede llamar feature.attributeMap()a cada una de las funciones seleccionadas para obtener un diccionario de los atributos de cada función.

layer = qgis.utils.iface.activeLayer()
selected_features = layer.selectedFeatures()
for i in selected_features:
    attrs = i.attributeMap()
    for (k,attr) in attrs.iteritems():
    print "%d: %s" % (k, attr.toString())

Recientemente tuve una pregunta similar respondida aquí: al iterar sobre una capa vectorial con pyqgis, ¿cómo puedo verificar si una función está seleccionada?

Ciro
fuente
raro, los objetos QgsFeature que resultan de selected_features no tienen método de geometría ...
user32882
9

Solo quería publicar algunas actualizaciones a la respuesta anterior a la luz de los cambios en la API QGIS Python desde la versión 2.0 .

Como antes, obtendría una lista de características seleccionadas con iface.activeLayer().selectedFeatures(), sin embargo, en las QGISversiones >= 2.0ahora usa la función en QgsFeature.attributes()lugar de QgsFeature.attributeMap(). Las dos funciones no son exactamente las mismas: attributes()ahora devuelve una lista , mientras que la anterior attributeMap()devolvió un diccionario . Tómese un momento para navegar por la documentación de la API para QgsFeature.attributes(), QgsAttributes, etc para entender cómo se almacenan / acceder a los atributos.

Si está interesado, puede leer sobre algunos de los fundamentos de los cambios de API en este hilo de la lista de correo: [Qgis-developer] nuevas características de selección de api de vector . Brevemente (en palabras del desarrollador de QGIS Martin Dobias):

Acceso a atributos: ya no existe f.attributeMap(), porque los atributos ahora se almacenan en un vector (Python:) en listlugar de un mapa (Python:) dict. QgsFeatureLa clase emula el objeto contenedor de Python 4 para que pueda acceder a los atributos como si la QgsFeatureinstancia fuera una lista o un diccionario, con claves como índices de campo o nombres de campo:

f[0] ... primer atributo

f["type"] ... atributo llamado "tipo"

Todavía es posible obtener todos los atributos: f.attributes()devuelve una lista de valores.

Entonces, como un ejemplo específico de lo que preguntó cómo hacer (obtener datos para una sola característica que ha seleccionado), suponga que tiene una capa de citycaracterísticas que contienen y que cada una tiene una lista de atributos, incluido un countyatributo. Para obtener el countyvalor de una ciudad específica que ha seleccionado (por ejemplo Helena, AR), haga lo siguiente en la consola de Python:

city = iface.activeLayer().selectedFeatures()[0]
city["county"]
# OUTPUTS: u'Phillips'

Si desea los valores de todos los campos en la tabla de atributos de la ciudad, simplemente usaría:

cityData = city.attributes()
J. Taylor
fuente
También puede obtener todos los nombres de campo de este ejemplo usando city.fields (). Names () que devolvería una lista de nombres de campo.
Cary H
1

Me gustaría agregar algo útil a la respuesta proporcionada por J. Taylor y señalar que la respuesta actual aceptada de 2012 ya no es correcta:

El objeto QgsFeature admite __geo_interface__atributos útiles , que devuelve un diccionario de una característica dada. El diccionario está en realidad en un estándar GeoJSON, por lo que se incluyen todos los pares de atributos-valores y la geometría. La característica existe desde hace algún tiempo, descrita por primera vez por Sean Gillies en algún momento de 2012, con un ejemplo de uso aquí . No pude encontrar ninguna información de qué versión de QGIS está disponible y aún no he probado QGIS 3, pero seguramente estaba disponible al menos desde QGIS 2.14.

TL; DR:

layer = qgis.utils.iface.activeLayer()
selected_features = layer.selectedFeatures()
for i in selected_features:
    attrs = i.__geo_interface__
    print attrs # GeoJSON attributes of a feature
adamczi
fuente