示例#1
0
    def __init__(self,
                 width,
                 height,
                 column_mapping=None,
                 style_file=None,
                 symbology=None,
                 parent=None):
        """
        Parameters
        ----------
        width: int
          Width in pixels
        height: int
          Height in pixels
        column_mapping: dict
          Layer column mapping with the following keys:
          - rock_code_column : name of the column which holds the rock code
          - formation_code_column : name of the column which holds the formation code
          - rock_description_column
          - formation_description_column
        style_file: str
          File name of the QGIS style file to load
        symbology: QDomDocument
          QGIS style, as XML document
        parent: QObject:
          Qt parent object
        """

        LogItem.__init__(self, parent)

        self.__width = width
        self.__height = height
        self.__min_z = 0
        self.__max_z = 100

        self.__data = None
        self.__layer = None

        self.__column_mapping = column_mapping if column_mapping is not None else {}

        # change current directory, so that relative paths to SVG get correctly resolved
        os.chdir(os.path.dirname(__file__))

        if style_file:
            doc = QDomDocument()
            doc.setContent(open(style_file, "r").read())
            self.__renderer = QgsFeatureRenderer.load(doc.documentElement(),
                                                      QgsReadWriteContext())
        elif symbology:
            self.__renderer = QgsFeatureRenderer.load(
                symbology.documentElement(), QgsReadWriteContext())
        else:
            self.__renderer = QgsFeatureRenderer.defaultRenderer(
                POLYGON_RENDERER)
示例#2
0
    def __init__(self,
                 size=QSizeF(400, 200),
                 render_type=POINT_RENDERER,
                 x_orientation=ORIENTATION_LEFT_TO_RIGHT,
                 y_orientation=ORIENTATION_UPWARD,
                 allow_mouse_translation=False,
                 allow_wheel_zoom=False,
                 symbology=None,
                 parent=None):

        """
        Parameters
        ----------
        size: QSize
          Size of the item
        render_type: Literal[POINT_RENDERER, LINE_RENDERER, POLYGON_RENDERER]
          Type of renderer
        x_orientation: Literal[ORIENTATION_LEFT_TO_RIGHT, ORIENTATION_RIGHT_TO_LEFT]
        y_orientation: Literal[ORIENTATION_UPWARD, ORIENTATION_DOWNWARD]
        allow_mouse_translation: bool
          Allow the user to translate the item with the mouse (??)
        allow_wheel_zoom: bool
          Allow the user to zoom with the mouse wheel
        symbology: QDomDocument
          QGIS symbology to use for the renderer
        parent: QObject
        """
        LogItem.__init__(self, parent)

        self.__item_size = size
        self.__data_rect = None
        self.__data = None
        self.__delta = None
        self.__x_orientation = x_orientation
        self.__y_orientation = y_orientation

        # origin point of the graph translation, if any
        self.__translation_orig = None

        self.__render_type = render_type # type: Literal[POINT_RENDERER, LINE_RENDERER, POLYGON_RENDERER]

        self.__allow_mouse_translation = allow_mouse_translation
        self.__allow_wheel_zoom = allow_wheel_zoom

        self.__layer = None

        self.__default_renderers = [QgsFeatureRenderer.defaultRenderer(POINT_RENDERER),
                            QgsFeatureRenderer.defaultRenderer(LINE_RENDERER),
                            QgsFeatureRenderer.defaultRenderer(POLYGON_RENDERER)]
        symbol = self.__default_renderers[1].symbol()
        symbol.setWidth(1.0)
        symbol = self.__default_renderers[0].symbol()
        symbol.setSize(5.0)
        symbol = self.__default_renderers[2].symbol()
        symbol.symbolLayers()[0].setStrokeWidth(1.0)

        if not symbology:
            self.__renderer = self.__default_renderers[self.__render_type]
        else:
            self.__renderer = QgsFeatureRenderer.load(symbology.documentElement(), QgsReadWriteContext())

        # index of the current point to label
        self.__old_point_to_label = None
        self.__point_to_label = None
示例#3
0
    def __init__(self,
                 layer,
                 column_mapping,
                 filter_expression=None,
                 size=QSizeF(400, 200),
                 render_type=POLYGON_RENDERER,
                 x_orientation=ORIENTATION_LEFT_TO_RIGHT,
                 y_orientation=ORIENTATION_UPWARD,
                 symbology=None,
                 parent=None):
        """
        Parameters
        ----------
        layer: QgsVectorLayer
          Input vector layer
        column_mapping: dict
          Layer column mapping with the following keys:
          - min_event_column : name of the column which holds the minimum x value
          - max_event_column : name of the column which holds the maximum x value
          - value_column : name of the column which holds the value
        filter_expression: str
          Filter expression to apply to the input layer
        size: QSize
          Size of the item
        render_type: Literal[LINE_RENDERER, POLYGON_RENDERER]
          Type of renderer
        x_orientation: Literal[ORIENTATION_LEFT_TO_RIGHT, ORIENTATION_RIGHT_TO_LEFT]
        y_orientation: Literal[ORIENTATION_UPWARD, ORIENTATION_DOWNWARD]
        symbology: QDomDocument
          QGIS symbology to use for the renderer
        parent: QObject
        """
        LogItem.__init__(self, parent)

        self.__item_size = size
        self.__data_rect = None
        self.__data = None
        self.__x_orientation = x_orientation
        self.__y_orientation = y_orientation

        if render_type not in (LINE_RENDERER, POLYGON_RENDERER):
            raise RuntimeError(
                "Render type not supported: {}".format(render_type))
        self.__render_type = render_type  # type: Literal[POINT_RENDERER, LINE_RENDERER, POLYGON_RENDERER]

        self.__layer = layer
        self.__column_mapping = column_mapping
        self.__filter_expression = filter_expression

        self.__default_renderers = [
            None,
            QgsFeatureRenderer.defaultRenderer(LINE_RENDERER),
            QgsFeatureRenderer.defaultRenderer(POLYGON_RENDERER)
        ]
        symbol = self.__default_renderers[1].symbol()
        symbol.setWidth(1.0)
        symbol = self.__default_renderers[2].symbol()
        symbol.symbolLayers()[0].setStrokeWidth(1.0)

        if not symbology:
            self.__renderer = self.__default_renderers[self.__render_type]
        else:
            self.__renderer = QgsFeatureRenderer.load(
                symbology.documentElement(), QgsReadWriteContext())

        # values cache
        self.__min_x_values = []
        self.__max_x_values = []
        self.__y_values = []
        # index of the current point to label
        self.__old_point_to_label = None
        self.__point_to_label = None

        # determine data window on loading
        # FIXME we should use the database when possible
        self.__min_x_field = column_mapping["min_event_column"]
        self.__max_x_field = column_mapping["max_event_column"]
        self.__y_field = column_mapping["value_column"]

        req = QgsFeatureRequest()
        req.setFilterExpression(filter_expression)
        req.setSubsetOfAttributes(
            [self.__min_x_field, self.__max_x_field, self.__y_field],
            layer.fields())
        min_x, max_x = None, None
        min_y, max_y = None, None
        for f in layer.getFeatures(req):
            if min_x is None or f[self.__min_x_field] < min_x:
                min_x = f[self.__min_x_field]
            if max_x is None or f[self.__max_x_field] > max_x:
                max_x = f[self.__max_x_field]
            if min_y is None or f[self.__y_field] < min_y:
                min_y = f[self.__y_field]
            if max_y is None or f[self.__y_field] > max_y:
                max_y = f[self.__y_field]

        if min_x is None:
            return

        # Add a 10% buffer above max
        h = max_y - min_y
        if h == 0.0:
            max_y = min_y + 1.0
            h = 1.0
        max_y += h * 0.1

        self.set_data_window(QRectF(min_x, min_y, max_x - min_x,
                                    max_y - min_y))