16.3. 플러그인 레이어 사용

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

16.3.1. QgsPluginLayer 상속 클래스 만들기

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class WatermarkLayerRenderer(QgsMapLayerRenderer):

    def __init__(self, layerId, rendererContext):
        super().__init__(layerId, rendererContext)

    def render(self):
        image = QImage("/usr/share/icons/hicolor/128x128/apps/qgis.png")
        painter = self.renderContext().painter()
        painter.save()
        painter.drawImage(10, 10, image)
        painter.restore()
        return True

class WatermarkPluginLayer(QgsPluginLayer):

    LAYER_TYPE="watermark"

    def __init__(self):
        super().__init__(WatermarkPluginLayer.LAYER_TYPE, "Watermark plugin layer")
        self.setValid(True)

    def createMapRenderer(self, rendererContext):
        return WatermarkLayerRenderer(self.id(), rendererContext)

    def setTransformContext(self, ct):
        pass

    # Methods for reading and writing specific information to the project file can
    # also be added:

    def readXml(self, node, context):
        pass

    def writeXml(self, node, doc, context):
        pass

다른 모든 맵 레이어와 마찬가지로, 프로젝트 및 캔버스에 플러그인 레이어를 추가할 수 있습니다.

plugin_layer = WatermarkPluginLayer()
QgsProject.instance().addMapLayer(plugin_layer)

이런 레이어를 가지고 있는 프로젝트를 불러오는 경우, 팩토리 클래스가 필요합니다:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
class WatermarkPluginLayerType(QgsPluginLayerType):

    def __init__(self):
        super().__init__(WatermarkPluginLayer.LAYER_TYPE)

    def createLayer(self):
        return WatermarkPluginLayer()

    # You can also add GUI code for displaying custom information
    # in the layer properties
    def showLayerProperties(self, layer):
        pass


# Keep a reference to the instance in Python so it won't
# be garbage collected
plt =  WatermarkPluginLayerType()

assert QgsApplication.pluginLayerRegistry().addPluginLayerType(plt)