使用PyQgis选择和缩放图层的功能

时间:2015-07-20 14:58:53

标签: python qgis

我想选择功能并放大它们,并使用PyQgis完成所有这些步骤。

而且我能够分开进行这两种操作,但是当我尝试混合它们时它似乎不起作用。

我使用的两个代码都来自互联网。这是我用来选择图层特征的内容:

from qgis.core import *
import qgis.utils
lyrMap = QgsVectorLayer('C:/someplace', 'MapName', 'ogr')
QgsMapLayerRegistry.instance().addMapLayer(lyrMap)

expr = QgsExpression("'Attribute' IS NOT NULL")
it = lyrMap.getFeatures(QgsFeatureRequest(expr))
ids = [i.id() for i in it] #select only the features for which the expression is true
lyrMap.setSelectedFeatures(ids)

似乎可以解决问题,因为在QGis上选择了功能。

为了缩放代码更简单,它只是:

canvas = qgis.utils.iface.mapCanvas()
canvas.zoomToSelected(lyrMap)

但似乎画布并不认为lyrMap上有选择而只是什么都不做。我试图在QGis中手动进行选择,然后使用zoomToSelected进行缩放,并且它有效。

但我的目标是不需要手动进行选择......

注意:我不认为这是问题,但我正在进行选择的属性是来自lyrMap和另一层之间的连接(我没有把代码放在这里,因为我认为它没有链接)。

感谢您提供答案,线索或任何真正的:)!

1 个答案:

答案 0 :(得分:1)

这适用于我的插件。我正在使用python 2.7和QGIS 1.8和2.0.1。您可以在使用矢量文件并将其添加到注册表后使用此代码。

self.rubberBand = None
#create vertex marker for point..older versons..
self.vMarker = None
#add rubberbands 
self.crossRb = QgsRubberBand(iface.mapCanvas(),QGis.Line)
self.crossRb.setColor(Qt.black)


def pan(self):
        print "pan button clicked!"
        x = self.dlg.ui.mTxtX.text()
        y = self.dlg.ui.mTxtY.text()
        if not x:
            return
        if not y:
            return
        print x + "," + y
        canvas = self.canvas
        currExt = canvas.extent()
        canvasCenter = currExt.center()
        dx = float(x) - canvasCenter.x()
        dy = float(y) - canvasCenter.y()
        xMin = currExt.xMinimum() + dx
        xMax = currExt.xMaximum() + dx
        yMin = currExt.yMinimum() + dy
        yMax = currExt.yMaximum() + dy
        newRect = QgsRectangle(xMin,yMin,xMax,yMax)
        canvas.setExtent(newRect)
        pt = QgsPoint(float(x),float(y))
        self.zoom(pt)
        canvas.refresh()

def zoom(self,point):
        canvas = self.canvas
        currExt = canvas.extent()
        leftPt = QgsPoint(currExt.xMinimum(),point.y())
        rightPt = QgsPoint(currExt.xMaximum(),point.y())
        topPt = QgsPoint(point.x(),currExt.yMaximum())
        bottomPt = QgsPoint(point.x(),currExt.yMinimum())
        horizLine = QgsGeometry.fromPolyline( [ leftPt , rightPt ] )
        vertLine = QgsGeometry.fromPolyline( [ topPt , bottomPt ] )
        self.crossRb.reset(QGis.Line)
        self.crossRb.addGeometry(horizLine,None)
        self.crossRb.addGeometry(vertLine,None)
        if QGis.QGIS_VERSION_INT >= 10900:
            rb = self.rubberBand
            rb.reset(QGis.Point)
            rb.addPoint(point)
        else:
            self.vMarker = QgsVertexMarker(self.canvas)
            self.vMarker.setIconSize(10)
            self.vMarker.setCenter(point)
            self.vMarker.show()

        # wait .5 seconds to simulate a flashing effect
        QTimer.singleShot(500,self.resetRubberbands)

    def resetRubberbands(self):
        print "resetting rubberbands.."
        canvas = self.canvas
        if QGis.QGIS_VERSION_INT >= 10900:
            self.rubberBand.reset()
        else:
            self.vMarker.hide()
            canvas.scene().removeItem(self.vMarker)
        self.crossRb.reset()
        print "completed resetting.."