18. プラグインレイヤを使う
ヒント
pyqgisコンソールを使わない場合、このページにあるコードスニペットは次のインポートが必要です:
1from qgis.core import (
2 QgsPluginLayer,
3 QgsPluginLayerType,
4 QgsMapLayerRenderer,
5 QgsApplication,
6 QgsProject,
7)
8
9from qgis.PyQt.QtGui import QImage
もしプラグインがマップレイヤをレンダリングするために独自のメソッドを使うのであれば、 QgsPluginLayer
に基づいて独自のレイヤタイプを書くのが実装するための最良の方法かもしれません。
18.1. QgsPluginLayerのサブクラス化
以下は最小限のQgsPluginLayerの実装例です。これは Watermark example plugin のオリジナルのコードを基にしています。
カスタムレンダラーは、キャンバスへの実際の描画を定義する実装の一部です。
1class WatermarkLayerRenderer(QgsMapLayerRenderer):
2
3 def __init__(self, layerId, rendererContext):
4 super().__init__(layerId, rendererContext)
5
6 def render(self):
7 image = QImage("/usr/share/icons/hicolor/128x128/apps/qgis.png")
8 painter = self.renderContext().painter()
9 painter.save()
10 painter.drawImage(10, 10, image)
11 painter.restore()
12 return True
13
14class WatermarkPluginLayer(QgsPluginLayer):
15
16 LAYER_TYPE="watermark"
17
18 def __init__(self):
19 super().__init__(WatermarkPluginLayer.LAYER_TYPE, "Watermark plugin layer")
20 self.setValid(True)
21
22 def createMapRenderer(self, rendererContext):
23 return WatermarkLayerRenderer(self.id(), rendererContext)
24
25 def setTransformContext(self, ct):
26 pass
27
28 # Methods for reading and writing specific information to the project file can
29 # also be added:
30
31 def readXml(self, node, context):
32 pass
33
34 def writeXml(self, node, doc, context):
35 pass
プラグインレイヤは、他のマップレイヤと同じようにプロジェクトやキャンバスに追加することができます:
plugin_layer = WatermarkPluginLayer()
QgsProject.instance().addMapLayer(plugin_layer)
このようなレイヤを含むプロジェクトをロードする場合、ファクトリークラスが必要です:
1class WatermarkPluginLayerType(QgsPluginLayerType):
2
3 def __init__(self):
4 super().__init__(WatermarkPluginLayer.LAYER_TYPE)
5
6 def createLayer(self):
7 return WatermarkPluginLayer()
8
9 # You can also add GUI code for displaying custom information
10 # in the layer properties
11 def showLayerProperties(self, layer):
12 pass
13
14
15# Keep a reference to the instance in Python so it won't
16# be garbage collected
17plt = WatermarkPluginLayerType()
18
19assert QgsApplication.pluginLayerRegistry().addPluginLayerType(plt)