理论分析
本文主要实现在地图工具(QgsMapToolEmitPoint
)中实现捕捉功能。
需要重构canvasPressEvent
和canvasMoveEvent
两个事件。
def canvasMoveEvent(self, e):
# 捕捉
snapMatch = self.snapper.snapToMap(e.pos())
self.snapIndicator.setMatch(snapMatch)
if snapMatch.isValid():
self.snapMatchPoint = snapMatch.point()
else:
self.snapMatchPoint = None
if not self.isEmittingPoint:
return
self.cursor_point = e.mapPoint()
self.showLine()
def canvasPressEvent(self, e):
if self.snapMatchPoint:
self.points.append(self.snapMatchPoint)
else:
self.points.append(e.mapPoint())
self.isEmittingPoint = True
并且需要在__init__
中添加一下配置:
# 捕捉
self.snapIndicator = QgsSnapIndicator(self.canvas)
self.snapper = self.canvas.snappingUtils()
config = QgsSnappingConfig()
config.setEnabled(True)
config.setType(QgsSnappingConfig.Vertex)
config.setUnits(QgsTolerance.Pixels)
config.setTolerance(12)
# https://qgis.org/pyqgis/master/core/QgsSnappingConfig.html#qgis.core.QgsSnappingConfig.SnappingMode
config.setMode(Qgis.SnappingMode.AllLayers)
self.snapper.setConfig(config)
效果展示
-
源代码地址:https://github.com/luolingchun/PyQGIS
-
参考地址:https://gis.stackexchange.com/questions/416944/highlighting-snapping-position-in-pyqgis