Skip to content

Instantly share code, notes, and snippets.

@thbaumann
Created July 17, 2025 06:43
Show Gist options
  • Save thbaumann/c320b33d9cef0267ac37578b75bd0e04 to your computer and use it in GitHub Desktop.
Save thbaumann/c320b33d9cef0267ac37578b75bd0e04 to your computer and use it in GitHub Desktop.
zoom to each point and wait for rendercomplete signal
from qgis.PyQt.QtWidgets import QDockWidget, QPushButton, QVBoxLayout, QWidget
from qgis.PyQt.QtCore import Qt
from qgis.core import QgsProject, QgsPointXY
from qgis.utils import iface
# Steuerungsvariablen
stop_script = False
features = []
index = 0
waiting_for_render = False
# Layername und Maßstab
#layer_name = 'Dein_Punktlayername' # ← Hier ggf den exakten Layernamen eintragen, wenn nicht der active layer benutzt wird
scale = 500
def start_zoom():
global stop_script, features, index
stop_script = False
index = 0
# Layer suchen
######### man kann auch über den Layernamen gehen...
#layers = QgsProject.instance().mapLayersByName(layer_name)
#if not layers:
# print(f"❌ Layer '{layer_name}' nicht gefunden!")
# return
#layer = layers[0]
#######################
layer =iface.activeLayer() # ich geh lieber ueber den aktiven layer
features.clear()
features.extend(layer.getFeatures())
# Signal verbinden
try:
iface.mapCanvas().renderComplete.disconnect(on_render_complete)
except TypeError:
pass # Falls vorher nicht verbunden
iface.mapCanvas().renderComplete.connect(on_render_complete)
zoom_next()
def stop_zoom():
global stop_script
stop_script = True
try:
iface.mapCanvas().renderComplete.disconnect(on_render_complete)
except TypeError:
pass # Signal war nicht verbunden
print("⏹️ Zoom-Vorgang gestoppt.")
def zoom_next():
global index, features, stop_script, waiting_for_render
if stop_script or index >= len(features):
print("✅ Fertig oder abgebrochen.")
try:
iface.mapCanvas().renderComplete.disconnect(on_render_complete)
except TypeError:
pass
return
feature = features[index]
point = feature.geometry().asPoint()
iface.mapCanvas().setCenter(QgsPointXY(point))
iface.mapCanvas().zoomScale(scale)
iface.mapCanvas().refresh()
waiting_for_render = True
def on_render_complete(painter):
global index, waiting_for_render
if waiting_for_render:
waiting_for_render = False
index += 1
zoom_next()
# Dock-Widget mit Buttons
dock = QDockWidget("🔍 Punkt-Zoom-Steuerung", iface.mainWindow())
widget = QWidget()
layout = QVBoxLayout()
btn_start = QPushButton("▶️ Start")
btn_start.clicked.connect(start_zoom)
layout.addWidget(btn_start)
btn_stop = QPushButton("⏹️ Stopp")
btn_stop.clicked.connect(stop_zoom)
layout.addWidget(btn_stop)
widget.setLayout(layout)
dock.setWidget(widget)
iface.addDockWidget(Qt.LeftDockWidgetArea, dock)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment