使用PyQGIS接口,在QGIS的Canvas上绘制的思路主要有两种,一种是依靠数据显示,另一种是直接绘制。
本文选用QgsMapCanvasItem类,采用直接绘制的方法,在QGIS的Canvas上绘制图形。
QgsMapCanvasItem介绍
QgsMapCanvasItem是Canvas绘制的接口类,主要用于绘制一些在Canvas上“短暂”显示的内容。
在QGIS内部,已经存在的实现类如下所示。有想深入了解的朋友们,请浏览相应类的实现类代码。

QgsAdvancedDigitizingCanvasItem:绘制CAD工具的图形元素。
QgsGeometryRubberBand:橡皮筋类(考虑曲面几何形状)。
QgsHighlight:要素高亮。
QgsMapCanvasAnnotationItem:地图注记绘制。
QgsRubberBand:地图上绘制瞬态要素(例如鼠标拖动的线条等)。
QgsSnapToGridCanvasItem:显示空间分辨率网格。
QgsVertexMarker:矢量符号标记绘制类。
QgsMapCanvasItem绘制核心要点
1. 初始化
继承QgsMapCanvasItem并传入canvas参数。
实现类在实例化后,QGIS将自动把实现类添加到画布的绘制列表中。示例代码如下:
class CanvasDotItem(QgsMapCanvasItem):
def __init__(self, canvas):
super().__init__(canvas) # 必须传入canvas参数
self.canvas = canvas
self.radius = 5
2.坐标转换
将地理坐标转换为屏幕像素坐标。使用toCanvasCoordinates方法。
canvas_point = self.toCanvasCoordinates(geo_location)
3.Qt绘制
采用Qt的绘制方式,设置画刷等,操作QPainter进行绘制。示例代码如下:
def paint(self, painter, option, widget):
if self.geo_locationis None: return
point = self.toCanvasCoordinates(self.geo_location)
painter.setBrush(QColor(255, 255, 0)) # 设置填充颜色
painter.setPen(Qt.NoPen) # 取消边框
painter.drawEllipse(point, self.radius, self.radius) # 绘制圆形
4.调优
由于每次地图移动或缩放时,都会触发绘制函数。所以,如何尽快的完成绘制,是调优的关键。
核心目标:
1.及时调用clear()或移除不再需要的要素。
2.尽量减少调用坐标转换。如果太密的数据点,是否需要考虑抽稀;避免绘制超出显示范围的数据。
更多PyQGIS开发问题,欢迎留言或联系我们。转载须注明出处。