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
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
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)
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
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
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