16.3. 플러그인 레이어 사용

사용자 플러그인이 맵 레이어를 렌더링하기 위해 자신만의 메소드를 이용하는 경우, 이를 구현하는 데 QgsPluginLayer 클래스에 기반한 사용자만의 레이어 유형을 작성하는 것이 가장 좋을 수도 있습니다.

16.3.1. QgsPluginLayer 상속 클래스 만들기

다음은 최소한의 QgsPluginLayer 클래스를 구현하는 예시입니다. 워터마크 예제 플러그인 의 원본 코드를 기반으로 하고 있습니다.

이 구현의 일부로써, 사용자 지정 렌더링 작업자가 캔버스에 실제 그려지는 내용을 정의합니다.

 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)