6 votos

¿Cómo obtener la ruta de las capas que aparecen en un cuadro combinado?

Quiero obtener la ruta de una capa en mi plugin, en la consola funciona bien pero en mi plugin me da el error AttributeError: 'NoneType' object has no attribute 'dataProvider'

 def run(self):
"""Run method that performs all the real work"""
# show the dialog
self.dlg.show()
mapCanvas = self.iface.mapCanvas()
self.dlg.comboBox.clear()
for i in range(mapCanvas.layerCount()-1,-1,-1):
    layer = mapCanvas.layer(i)
    layerName = layer.name()
    self.dlg.comboBox.addItem(layerName)

# Run the dialog event loop
result = self.dlg.exec_()
# See if OK was pressed
if result == 1:

    index = self.dlg.comboBox.currentIndex()
    layer = self.dlg.comboBox.itemData(index)
    layer1 = os.path.dirname( unicode( layer.dataProvider().dataSourceUri() ) )       
    t = "C:/Users/slop2.tif"
    processing.runalg("gdalogr:slope", layer1, 1, True, True, False, 1.0, t)

    pass

3voto

Yada Puntos 9489

Prefiero utilizar QgsMapLayerComboBox objetos. A continuación, es el código recortado en mi plugin para obtener el valor del píxel de una trama bajo un punto. Hay implementado dos QgsMapLayerComboBox objetos: uno para las capas rasterizadas y otro para las capas vectoriales (filtradas con QgsMapLayerProxyModel ):

   def __init__(self, iface):
        """Constructor."""
        self.wcb1 = QgsMapLayerComboBox(self.dlg)
        self.wcb1.setFixedWidth(172)
        self.wcb1.move(170,28)
        self.wcb1.setFilters( QgsMapLayerProxyModel.RasterLayer )
        self.wcb1.enabledChange(True)

        self.wcb2 = QgsMapLayerComboBox(self.dlg)
        self.wcb2.setFixedWidth(172)
        self.wcb2.move(170,68)
        self.wcb2.setFilters( QgsMapLayerProxyModel.VectorLayer )
        self.wcb2.enabledChange(True)

    def run(self):
        """Run method that performs all the real work"""
        rlayer = self.wcb1.currentLayer()
        vlayer = self.wcb2.currentLayer()

Funciona como se puede ver en las siguientes imágenes.

Con los filtros, cada capa se selecciona automáticamente en el QgsMapLayerComboBox :

enter image description here

Después de hacer clic en OK, "el verdadero trabajo" está hecho. En la tabla de atributos de la capa de puntos vectoriales se ha creado un campo "valor" y se ha rellenado con valores rasterizados:

enter image description here

1voto

tobes Puntos 19

En su código, layer es sólo el nombre de la capa que se pone en el combobox. NO es una instancia real de la capa vectorial. Es por eso que usted obtiene un error que la capa no tiene un proveedor.

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