我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文中苏南大叔主要需求是获得地图坐标,监控鼠标事件仅仅是实现上述需要的必要手段。相关代码就分两篇文章来描述,一部分描述鼠标事件的监控机制,另一部分描述地图坐标的识别机制。

苏南大叔:qgis插件开发:如何通过maptool监控canvas鼠标事件? - qgis-plugin-maptool
qgis插件开发:如何通过maptool监控canvas鼠标事件?(图2-1)

本文测试环境:qgis@3.16.14-hannoverwin10。本篇文章的插件基于qgis plugin builder创建,具体的步骤可以参考下面这篇文章:

打开一张地图文件

打开一张地图文件,这事儿说起来应该是挺容易的。从同组的兄弟那里,获得了个一个江西省的地形地图文件,主要组成文件如下:

苏南大叔:qgis插件开发:如何通过maptool监控canvas鼠标事件? - tif-file
qgis插件开发:如何通过maptool监控canvas鼠标事件?(图2-2)

把主体tif文件拖进去qgis即可打开,而使用file=>open的话,似乎并不能满足我们的需求。有点奇怪不是?

添加mapTool开始监控

在打开了一张地图的前提下,为这个地图添加个maptool的概念,这个maptool能做啥呢?能做的事情很多。比如:本文中的需求,对鼠标事件进行监控。

maptool是作用于canvas上面的,所以要先获得canvas对象。

qgis里面的canvas和网页里面canvas貌似不是一个东西,概念不同。
def __init__(self, iface):
    # ...
    self.canvas = iface.mapCanvas()
    # ...
def iconAction(self):
    # ...
    from .testMapTool import TestMapTool
    self.mapTool = TestMapTool(self.canvas, self.iface)
    self.canvas.setMapTool(self.mapTool)
    # ...

testMapTool.py文件:

class TestMapTool(QgsMapToolEmitPoint):
    def __init__(self, canvas, iface):
        self.iface = iface
        self.canvas = canvas
        QgsMapToolEmitPoint.__init__(self, self.canvas)

    def canvasReleaseEvent(self, e):
        # ...
        pass

    def canvasPressEvent(self, e):
        # ...
        pass

    def canvasMoveEvent(self, e):
        # ...
        pass

这里监听了三个事件,分别是:move/press/release,即:鼠标移动,鼠标按下,鼠标抬起动作。那么,通过对事件e的解析,就可以继续后续逻辑。

获得坐标值

canvasReleaseEvent或者canvasPressEvent或者canvasMoveEvent内,写自己的逻辑吧。下面是两个事件e和坐标point转化的例子。

  • toMapCoordinates()方法只存在于maptool里面,从QgsMapToolEmitPoint获得的能力。
    def canvasReleaseEvent(self, e):
        point = self.toMapCoordinates(e.pos())
        # ...
        pass
  • e.pos()就是鼠标事件的坐标,.x()就是lat值,.y()就是lon值。
    def canvasReleaseEvent(self, e):
        # from qgis._core import QgsPointXY
        point = QgsPointXY(e.pos().x(),e.pos().y())
        # ...
        pass

移除mapTool停止监控

self.canvas.setMapTool(None)
self.mapTool = None

或者:

self.canvas.unsetMapTool(self.mapTool)
self.mapTool = None

相关链接

总结

通过maptool获得对canvas的鼠标事件监控能力,通过e.pos()获得坐标,然后通过把坐标转化为point对象,实现后续逻辑。更多qgis相关文章,请点击苏南大叔的博客文章:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   qgis