2 votos

El objeto 'QgsVectorDataProvider' no tiene el atributo 'select'

Quiero crear una capa de herramientas en QGIS 2.4 que seleccione cualquier característica vectorial que se cruce con ese punto. En mi script he probado la siguiente función:

def selectFeature(self, point, button):

       pntGeom = QgsGeometry.fromPoint(point)
       pntBuff = pntGeom.buffer( (self.canvas.mapUnitsPerPixel() * 2),0)
       rect = pntBuff.boundingBox()
       cLayer = self.canvas.currentLayer()
       selectList = []
       if cLayer:
               provider = cLayer.dataProvider()
               feat = QgsFeature()
               provider.select([],rect)
               while provider.nextFeature(feat):
                       if feat.geometry().intersects(pntGeom):
                               selectList.append(feat.id())
               cLayer.setSelectedFeatures(selectList)

Pero tengo el siguiente error:

AttributeError: El objeto 'QgsVectorDataProvider' no tiene el atributo 'select' en la línea "provider.select([],rect)"

¿Qué estoy haciendo mal?

1voto

Elmo Gallen Puntos 133

He probado tu código, pero no funciona. No puede encontrar la función seleccionada. Por lo tanto, hago una edición de su código. Este es el código editado:

def selectFeature(self, point, button):
        pntGeom = QgsGeometry.fromPoint(point)
        pntBuff = pntGeom.buffer((self.canvas.mapUnitsPerPixel() * 2), 0)
        rect = pntBuff.boundingBox()

        cLayer = self.canvas.currentLayer()
        selectList = []
        if cLayer:
            rq = QgsFeatureRequest(rect)
            for feature in cLayer.getFeatures(rq):
                print feature
                if feature.geometry().intersects(rect):
                    selectList.append(feature.id())

            cLayer.setSelectedFeatures(selectList)
        else:
            print "No layer selected on TOC"

        print selectList

Siento no poder añadir esta respuesta como comentario, porque mi reputación no es suficiente. Espero que esto pueda ayudar a otros.

0voto

Jauder Ho Puntos 3172

El siguiente código debería reemplazar todo en su if bloque:

if cLayer:
    for features in cLayer.getFeatures():
        if feat.geometry().intersects(pntGeom):
              selectList.append(feat.id())
     cLayer.setSelectedFeatures(selectList)

El select no existe en ninguna de las 2.0 versión de QGIS. Hay una select en el objeto de capa sin embargo es para seleccionar visualmente los objetos en la pantalla que no es lo que quieres aquí.

Consejo profesional:

Utiliza el siguiente código para limitar tu área de búsqueda o de lo contrario estarás haciendo un bucle con todas las características a pesar de todo:

  if cLayer:
    rq = QgsFeatureRequest(rect)
    for features in cLayer.getFeatures(rq):
        if feat.geometry().intersects(pntGeom):
              selectList.append(feat.id())
     cLayer.setSelectedFeatures(selectList)

Esto creará un QgsFeatureRequest que limita el área de búsqueda para devolver las características a través de lo pasado en QgsRectangle

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