So zoomen Sie mit pyQGIS auf eine ausgewählte Funktion

10

Ich möchte eine Funktion erstellen, die ein Feature auswählt und darauf zoomt (ähnlich in QGIS). Daher gibt es folgende Funktion:

QgsMapLayerRegistry.instance().addMapLayer(self.vlayer)

def zoomTo(self):
    layer = self.vlayer
    atable = self.ui.table

    selectList=[]
    for i in atable.selectionModel().selectedRows():
        ID = atable.item(i.row(),0).text()
        selectList.append(int(ID))

    layer.setSelectedFeatures(selectList)

Die ausgewählten Features werden auf der Karte hervorgehoben. Ich habe jedoch keine Ahnung, wie ich die ausgewählten Features "zoomen" oder in der Mitte der Karte fokussieren soll.

Martin
quelle

Antworten:

14

Sie müssen die Ausmaße des Kartenbereichs auf die Ausmaße der Auswahl festlegen:

box = layer.boundingBoxOfSelected()
iface.mapCanvas().setExtent(box)
iface.mapCanvas().refresh()
Nathan W.
quelle
Vielen Dank! Und wie kann ich das iface mit der tatsächlich geöffneten QGIS-Karte in Beziehung setzen?
Martin
Arbeiten Sie an einem Plugin oder einer eigenständigen App?
Nathan W
Ja, verstanden. Ich arbeite an einem Plugin. Ich habe das vergessen gis.utils.iface. Jetzt funktioniert es perfekt. Danke nochmal!
Martin
5

Das Zoomen auf ausgewählte Funktionen kann auch durch Auslösen der Option "Auf Auswahl zoomen" im Menü "Ansicht" ausgeführt werden.

eMenu = self.iface.viewMenu()
eMenu.actions() [12].trigger()

Hinweis: Die Indexnummer kann je nach QGIS-Version variieren.


Oder direkter:

iface.actionZoomToSelected().trigger()
Sjs
quelle
2
Ich würde diese Methode nicht verwenden. Was ist, wenn in einer neuen qgis-Version die Funktionen auf Index 13 verschoben werden? Die Fehlerbehebung bei solchen Problemen macht definitiv keinen großen Spaß ...
Mozzbozz
@mozzbozz Ich stimme zu. Die erste Antwort ist die beste Wahl. Dies kann eine zweite alternative Option sein. Bearbeiten Sie die Antwort gemäß Ihrem Vorschlag. Vielen Dank!
Sjs
3
Wenn Sie die Option auslösen möchten, denke ich, iface.actionZoomToSelected().trigger()ist ein wenig sicherer :)
Joseph
@ Joseph Kannst du die Antwort nach deinem Vorschlag bearbeiten?
Sjs
1
@ Joseph Ich hätte nichts dagegen;) froh, dass du die Antwort noch besser aussehen lässt!
Sjs
0

# Die erste QMessageBox zeigt alle ausgewählten Funktionen an:

lyr = iface.activeLayer();
fts = lyr.selectedFeatures();
ftsCount = lyr.selectedFeatureCount();
sFts = str(ftsCount);
msgBox = QMessageBox();
msgBox.setText(sFts +' selected features');
msgBox.exec_();

# Zweiter Zoom auf ausgewählte Funktionen:

iface.actionZoomToSelected().trigger();
107473
quelle