Exemplo n.º 1
0
    def test_polygon_polygon_obstacle_obstacle_factor_less(self):
        # Test line label but obstacle exists with an equal or lower obstacle factor vs label priority => LABEL
        self.layer = TestQgsPalLabeling.loadFeatureLayer('polygon_center')
        self.layer.setLabelsEnabled(True)
        obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('polygon_small')

        for label_priority in range(0, 11):
            for obstacle_weight in range(0, label_priority + 1):
                obstacle_label_settings = QgsPalLayerSettings()
                obstacle_label_settings.obstacle = True
                obstacle_label_settings.drawLabels = False
                obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2
                obstacle_label_settings.obstacleSettings().setType(
                    QgsLabelObstacleSettings.PolygonInterior)
                obstacleLayer.setLabeling(
                    QgsVectorLayerSimpleLabeling(obstacle_label_settings))
                obstacleLayer.setLabelsEnabled(True)

                self._TestMapSettings = self.cloneMapSettings(
                    self._MapSettings)
                self.lyr.placement = QgsPalLayerSettings.OverPoint
                self.lyr.priority = label_priority
                self.checkTest()
        self.removeMapLayer(obstacleLayer)
        self.removeMapLayer(self.layer)
        self.layer = None
Exemplo n.º 2
0
    def test_point_point_obstacle_obstacle_factor_less(self):
        # Test point label but obstacle exists with an equal or lower obstacle factor vs label priority => LABEL
        self.layer = TestQgsPalLabeling.loadFeatureLayer('point')
        obstacleLayer = TestQgsPalLabeling.loadFeatureLayer(
            'point_ordered_obstacle1')

        for label_priority in range(0, 11):
            for obstacle_weight in range(0, label_priority + 1):
                obstacle_label_settings = QgsPalLayerSettings()
                obstacle_label_settings.obstacle = True
                obstacle_label_settings.drawLabels = False
                obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2
                obstacleLayer.setLabeling(
                    QgsVectorLayerSimpleLabeling(obstacle_label_settings))
                obstacleLayer.setLabelsEnabled(True)

                self._TestMapSettings = self.cloneMapSettings(
                    self._MapSettings)
                self.lyr.placement = QgsPalLayerSettings.OverPoint
                self.lyr.quadOffset = QgsPalLayerSettings.QuadrantAboveRight
                self.lyr.priority = label_priority
                self.checkTest()
        self.removeMapLayer(obstacleLayer)
        self.removeMapLayer(self.layer)
        self.layer = None
Exemplo n.º 3
0
    def convert_fdo_annotations(dest_layer: QgsVectorLayer, context):  # pylint: disable=unused-argument
        """
        Converts FDO annotations
        """
        # one label class, use simple labeling
        label_settings = QgsPalLayerSettings()
        label_settings.fieldName = 'TextString'
        label_settings.drawLabels = True
        label_settings.placement = QgsPalLayerSettings.OverPoint
        label_settings.dataDefinedProperties().setProperty(
            QgsPalLayerSettings.Family, QgsProperty.fromField('FontName'))
        label_settings.dataDefinedProperties().setProperty(
            QgsPalLayerSettings.Size, QgsProperty.fromField('FontSize'))
        label_settings.dataDefinedProperties().setProperty(
            QgsPalLayerSettings.Bold, QgsProperty.fromField('Bold'))
        label_settings.dataDefinedProperties().setProperty(
            QgsPalLayerSettings.Italic, QgsProperty.fromField('Italic'))
        label_settings.dataDefinedProperties().setProperty(
            QgsPalLayerSettings.Underline, QgsProperty.fromField('Underline'))

        quadrant_property = QgsProperty.fromExpression("""case
    when  "VerticalAlignment" = 0 then -- top
    case
        when  "HorizontalAlignment" = 0 then 0
        when  "HorizontalAlignment" = 1 then 1
        when  "HorizontalAlignment" = 2 then 2
    end

    when  "VerticalAlignment" = 1 then -- center
    case
        when  "HorizontalAlignment" = 0 then 3
        when  "HorizontalAlignment" = 1 then 4
        when  "HorizontalAlignment" = 2 then 5
    end

    when  "VerticalAlignment" in (2,3) then -- baseline, bottom
    case
        when  "HorizontalAlignment" = 0 then 6
        when  "HorizontalAlignment" = 1 then 7
        when  "HorizontalAlignment" = 2 then 8
    end
end""")
        label_settings.dataDefinedProperties().setProperty(
            QgsPalLayerSettings.OffsetQuad, quadrant_property)
        label_settings.dataDefinedProperties().setProperty(
            QgsPalLayerSettings.LabelRotation,
            QgsProperty.fromExpression('360-"Angle"'))
        label_settings.dataDefinedProperties().setProperty(
            QgsPalLayerSettings.OffsetXY,
            QgsProperty.fromExpression(
                ' concat(  "XOffset" ,\',\', "YOffset" )'))

        labeling = QgsVectorLayerSimpleLabeling(label_settings)
        dest_layer.setLabeling(labeling)
Exemplo n.º 4
0
    def convert_label_style(properties: LabelStyle,
                            context) -> QgsPalLayerSettings:
        """
        Converts a LabelStyle to QGIS equivalent
        """
        label_settings = QgsPalLayerSettings()
        label_settings.drawLabels = True

        LabelConverter.convert_label_text_symbol(properties.text_symbol,
                                                 label_settings, context)
        LabelConverter.convert_overposter(properties.overposter,
                                          QgsWkbTypes.UnknownGeometry,
                                          label_settings, context)

        label_settings.layerType = QgsWkbTypes.PointGeometry
        return label_settings
    def test_polygon_placement_with_obstacle(self):
        # Horizontal label placement for polygon and a line obstacle
        self.layer = TestQgsPalLabeling.loadFeatureLayer('polygon_rect')
        obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('polygon_with_hole_line_obstacle')
        obstacle_label_settings = QgsPalLayerSettings()
        obstacle_label_settings.obstacle = True
        obstacle_label_settings.drawLabels = False
        obstacle_label_settings.obstacleFactor = 7
        obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings))
        obstacleLayer.setLabelsEnabled(True)

        self._TestMapSettings = self.cloneMapSettings(self._MapSettings)
        self.lyr.placement = QgsPalLayerSettings.Horizontal
        self.checkTest()
        self.removeMapLayer(obstacleLayer)
        self.removeMapLayer(self.layer)
        self.layer = None
Exemplo n.º 6
0
    def test_polygon_line_obstacle_obstacle_factor_greater_equal(self):
        # Test polygon label but obstacle exists with a greater obstacle factor vs label priority => NO LABEL
        self.layer = TestQgsPalLabeling.loadFeatureLayer('polygon_center')
        self.layer.setLabelsEnabled(True)
        obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('line_placement_4')

        for label_priority in range(0, 11):
            for obstacle_weight in range(label_priority + 1, 11):
                obstacle_label_settings = QgsPalLayerSettings()
                obstacle_label_settings.obstacle = True
                obstacle_label_settings.drawLabels = False
                obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2
                obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings))
                obstacleLayer.setLabelsEnabled(True)

                self._TestMapSettings = self.cloneMapSettings(self._MapSettings)
                self.lyr.placement = QgsPalLayerSettings.OverPoint
                self.lyr.priority = label_priority
                self.checkTest()
        self.removeMapLayer(obstacleLayer)
        self.removeMapLayer(self.layer)
        self.layer = None
Exemplo n.º 7
0
    def convert_label_engine_layer_properties(
            properties: LabelEngineLayerProperties, layer_geometry_type,
            context) -> QgsPalLayerSettings:
        """
        Converts LabelEngineLayerProperties to QGIS equivalent
        """
        label_settings = QgsPalLayerSettings()
        label_settings.drawLabels = properties.label_features

        LabelConverter.convert_label_text_symbol(properties.text_symbol,
                                                 label_settings, context)

        label_settings.fieldName = ExpressionConverter.convert(
            properties.expression, properties.expression_parser,
            properties.advanced_expression, context)
        label_settings.isExpression = True

        LabelConverter.convert_overposter(properties.overposter,
                                          layer_geometry_type, label_settings,
                                          context)

        label_settings.scaleVisibility = properties.scale_range_max or properties.scale_range_min
        # layer.zoom_max = "don't show when zoomed out beyond"
        zoom_max = properties.scale_range_max
        # layer.zoom_min = "don't show when zoomed in beyond"
        zoom_min = properties.scale_range_min
        if zoom_max and zoom_min and zoom_min > zoom_max:
            # inconsistent scale range -- zoom_max should be bigger number than zoom_min
            zoom_min, zoom_max = zoom_max, zoom_min

        # qgis maximum scale = don't show when zoomed in beyond, i.e. ArcGIS zoom_min
        label_settings.maximumScale = zoom_min
        # qgis minimum scale = don't show when zoomed out beyond, i.e. ArcGIS zoom_max
        label_settings.minimumScale = zoom_max

        return label_settings
    def test_line_line_obstacle_obstacle_factor_less(self):
        # Test line label but obstacle exists with a lower obstacle factor vs label priority => LABEL
        self.layer = TestQgsPalLabeling.loadFeatureLayer('line_short')
        self.layer.setLabelsEnabled(True)
        obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('line')

        for label_priority in range(0, 11):
            for obstacle_weight in range(0, label_priority):
                obstacle_label_settings = QgsPalLayerSettings()
                obstacle_label_settings.obstacle = True
                obstacle_label_settings.drawLabels = False
                obstacle_label_settings.obstacleFactor = obstacle_weight
                obstacleLayer.setLabeling(
                    QgsVectorLayerSimpleLabeling(obstacle_label_settings))
                obstacleLayer.setLabelsEnabled(True)

                self._TestMapSettings = self.cloneMapSettings(
                    self._MapSettings)
                self.lyr.placement = QgsPalLayerSettings.Line
                self.lyr.priority = label_priority
                self.checkTest()
        self.removeMapLayer(obstacleLayer)
        self.removeMapLayer(self.layer)
        self.layer = None
    def test_point_polygon_obstacle_obstacle_factor_greater_equal(self):
        # Test point label but polygon obstacle exists with a greater than or equal to obstacle factor vs label priority => NO LABEL
        self.layer = TestQgsPalLabeling.loadFeatureLayer('point')
        obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('narrow_polygon')

        for label_priority in range(0, 10):
            for obstacle_weight in range(label_priority, 11):
                obstacle_label_settings = QgsPalLayerSettings()
                obstacle_label_settings.obstacle = True
                obstacle_label_settings.drawLabels = False
                obstacle_label_settings.obstacleFactor = obstacle_weight
                obstacleLayer.setLabeling(
                    QgsVectorLayerSimpleLabeling(obstacle_label_settings))
                obstacleLayer.setLabelsEnabled(True)

                self._TestMapSettings = self.cloneMapSettings(
                    self._MapSettings)
                self.lyr.placement = QgsPalLayerSettings.OverPoint
                self.lyr.quadOffset = QgsPalLayerSettings.QuadrantBelowRight
                self.lyr.priority = label_priority
                self.checkTest()
        self.removeMapLayer(obstacleLayer)
        self.removeMapLayer(self.layer)
        self.layer = None