【问题标题】:Select and zoom features of a layer using PyQgis使用 PyQgis 选择和缩放图层的特征
【发布时间】:2015-10-09 18:28:52
【问题描述】:

我想选择特征并放大它们并使用 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 和另一层之间的连接(我没有将代码放在这里,因为我认为它没有链接)。

非常感谢您提供答案、线索或任何东西:)!

【问题讨论】:

    标签: python qgis


    【解决方案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.."
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 2020-05-31
      • 2019-03-21
      • 2020-03-15
      • 2019-08-22
      相关资源
      最近更新 更多