Portada › Foros QGIS › 6. Python › Complemento Selección por Atributos
Etiquetado: complemento, pyhon, qgis, selección por atributos
- Este debate tiene 0 respuestas, 1 mensaje y ha sido actualizado por última vez el hace 1 año, 9 meses por
Miguel.
-
AutorEntradas
-
-
agosto 18, 2024 a las 2:35 pm #2984
Miguel
ParticipanteHola,
Estoy haciendo un complemento de QGIS con Python. Igual que el proceso Selección por Atributos que hay en la caja de herramientas, añadiendo hacer zoom a la selección.Tengo un par de errores. ¿Me podéis ayudar?
He creado una ventana para recopilar 3 datos:
* Desplegable para seleccionar la capa. Objeto llamado desplegable_capa.
* Desplegable para seleccionar el atributo de la capa anterior. Objeto llamado desplegable_atributo.
* Campo para escribir el texto del valor del elemento que quiero buscar. Objeto llamado input_valor.Al ejecutar el complemento, el primer desplegable recoge perfectamente todas las capas vectoriales y puedes seleccionar una.
Pero el segundo desplegable sólo recoge los atributos de una de las capas vectoriales. Y lo repite varias veces. Y cuando cambias la capa del desplegable superior, en este no se cambian a sus atributos.
¿cómo tengo que poner el código?
Y para seleccionar el atributo he optado por la expresión capa.selectByExpression(‘\»Atributo\»=\’Valor\»)
pero no se como poner los campos de los objetos de la ventana.
Si pongo los datos de un atributo y valor concreto en el código, el complemento funciona. Pero tengo en lugar de escribir un atributo y valor concreto en el código tengo que poner el objeto de la ventana, para que pueda hacer la búsqueda con la ventana y no modificando el código en cada búsqueda.¿Cómo tengo que poner el código?
Otra opción es con el proceso de la caja de herramientas processing.run(«qgis:selectbyattribute», {‘INPUT’:capa,’FIELD’:atributo,’OPERATOR’:7,’VALUE’:self.dlg.input_valor,’METHOD’:0})
Pero no se como poner el objeto dentro.Este es el código del complemento:
def run(self):
«»»Metodo que realmente realiza todo el trabajo»»»if self.first_start == True:
self.first_start = False
self.dlg = BuscadorDialog()# Muestra el cuadro de dialogo
self.dlg.show()# Seleccionar capa
capas_proyecto = QgsProject.instance().mapLayers().values()
for capa in capas_proyecto:
if capa.type() == QgsMapLayer.VectorLayer:
self.dlg.desplegable_capa.addItem(capa.name(), capa)
iface.setActiveLayer(capa)# Seleccionar atributo
capas_a_buscar = QgsProject.instance().mapLayers().values()
for capa_a_buscar in capas_a_buscar:
capa_a_buscar_dp = capa.dataProvider()
capa_a_buscar_dp_atributos = capa_a_buscar_dp.fields()
capa_a_buscar_dp_atributos_lista = capa_a_buscar_dp_atributos.toList()
for atributo in capa_a_buscar_dp_atributos_lista:
self.dlg.desplegable_atributo.addItem(atributo.name(), atributo)# Run the dialog event loop
result = self.dlg.exec_()# See if OK was pressed
if result == 1:
iface.setActiveLayer(capa)
capa.selectByExpression(‘atributo=self.dlg.input_valor’)# Hacer zoom a los elementos seleccionados
iface.actionZoomToSelected().trigger()¿Me podéis ayudar?
Muchas gracias
-
-
AutorEntradas
- Debes estar registrado para responder a este debate.