Выберите и масштабируйте объекты слоя с помощью PyQgis

Я хочу выбрать функции, увеличить их и выполнить все эти шаги с помощью 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)

Но, похоже, canvas не считает, что на lyrMap есть выделение, и просто ничего не делает. Я попытался сделать выбор вручную в QGis, а затем увеличить масштаб с помощью zoomToSelected, и это сработало.

Но моя цель - сделать это без необходимости делать выбор вручную...

Примечание. Я не думаю, что это проблема, но атрибут, по которому я делаю выбор, связан с соединением между lyrMap и другим слоем (я не помещал сюда код, потому что не думаю, что он связан).

Заранее спасибо за ответы, подсказки или что-нибудь на самом деле :) !


person François    schedule 20.07.2015    source источник


Ответы (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.."
person Chetan chadha    schedule 05.09.2015