diff --git a/python/core/symbology-ng/qgssymbollayerutils.sip b/python/core/symbology-ng/qgssymbollayerutils.sip
index e0ea025ae6dd..04a991c01b83 100644
--- a/python/core/symbology-ng/qgssymbollayerutils.sip
+++ b/python/core/symbology-ng/qgssymbollayerutils.sip
@@ -90,6 +90,14 @@ class QgsSymbolLayerUtils
*/
static QgsUnitTypes::RenderUnit decodeSldUom( const QString &str, double *scaleFactor );
+ /** Returns the size scaled in pixels according to the uom attribute.
+ * \param uom The uom attribute from SLD 1.1 version
+ * \param size The original size
+ * \returns the size in pixels
+ * \since QGIS 3.0
+ */
+ static double sizeInPixelsFromSldUom( const QString &uom, double size );
+
static QString encodeScaleMethod( QgsSymbol::ScaleMethod scaleMethod );
static QgsSymbol::ScaleMethod decodeScaleMethod( const QString &str );
diff --git a/src/core/symbology-ng/qgsellipsesymbollayer.cpp b/src/core/symbology-ng/qgsellipsesymbollayer.cpp
index eab0bfff018b..3ff9bfba263e 100644
--- a/src/core/symbology-ng/qgsellipsesymbollayer.cpp
+++ b/src/core/symbology-ng/qgsellipsesymbollayer.cpp
@@ -451,6 +451,10 @@ QgsSymbolLayer *QgsEllipseSymbolLayer::createFromSld( QDomElement &element )
if ( !QgsSymbolLayerUtils::wellKnownMarkerFromSld( graphicElem, name, fillColor, strokeColor, strokeStyle, strokeWidth, size ) )
return nullptr;
+ QString uom = element.attribute( QStringLiteral( "uom" ), "" );
+ size = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, size );
+ strokeWidth = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, strokeWidth );
+
double angle = 0.0;
QString angleFunc;
if ( QgsSymbolLayerUtils::rotationFromSldElement( graphicElem, angleFunc ) )
@@ -462,6 +466,7 @@ QgsSymbolLayer *QgsEllipseSymbolLayer::createFromSld( QDomElement &element )
}
QgsEllipseSymbolLayer *m = new QgsEllipseSymbolLayer();
+ m->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
m->setSymbolName( name );
m->setFillColor( fillColor );
m->setStrokeColor( strokeColor );
diff --git a/src/core/symbology-ng/qgsfillsymbollayer.cpp b/src/core/symbology-ng/qgsfillsymbollayer.cpp
index c8c52b1c63f3..7efdaa4edd54 100644
--- a/src/core/symbology-ng/qgsfillsymbollayer.cpp
+++ b/src/core/symbology-ng/qgsfillsymbollayer.cpp
@@ -381,7 +381,13 @@ QgsSymbolLayer *QgsSimpleFillSymbolLayer::createFromSld( QDomElement &element )
QPointF offset;
QgsSymbolLayerUtils::displacementFromSldElement( element, offset );
+ QString uom = element.attribute( QStringLiteral( "uom" ), "" );
+ offset.setX( QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, offset.x() ) );
+ offset.setY( QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, offset.y() ) );
+ strokeWidth = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, strokeWidth );
+
QgsSimpleFillSymbolLayer *sl = new QgsSimpleFillSymbolLayer( color, fillStyle, strokeColor, strokeStyle, strokeWidth );
+ sl->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
sl->setOffset( offset );
return sl;
}
@@ -2134,6 +2140,10 @@ QgsSymbolLayer *QgsSVGFillSymbolLayer::createFromSld( QDomElement &element )
QgsSymbolLayerUtils::lineFromSld( graphicElem, penStyle, strokeColor, strokeWidth );
+ QString uom = element.attribute( QStringLiteral( "uom" ), "" );
+ size = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, size );
+ strokeWidth = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, strokeWidth );
+
double angle = 0.0;
QString angleFunc;
if ( QgsSymbolLayerUtils::rotationFromSldElement( graphicElem, angleFunc ) )
@@ -2145,6 +2155,7 @@ QgsSymbolLayer *QgsSVGFillSymbolLayer::createFromSld( QDomElement &element )
}
QgsSVGFillSymbolLayer *sl = new QgsSVGFillSymbolLayer( path, size, angle );
+ sl->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
sl->setSvgFillColor( fillColor );
sl->setSvgStrokeColor( strokeColor );
sl->setSvgStrokeWidth( strokeWidth );
@@ -2950,7 +2961,12 @@ QgsSymbolLayer *QgsLinePatternFillSymbolLayer::createFromSld( QDomElement &eleme
offset = sqrt( pow( vectOffset.x(), 2 ) + pow( vectOffset.y(), 2 ) );
}
+ QString uom = element.attribute( QStringLiteral( "uom" ), "" );
+ size = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, size );
+ lineWidth = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, lineWidth );
+
QgsLinePatternFillSymbolLayer *sl = new QgsLinePatternFillSymbolLayer();
+ sl->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
sl->setColor( lineColor );
sl->setLineWidth( lineWidth );
sl->setLineAngle( angle );
diff --git a/src/core/symbology-ng/qgslinesymbollayer.cpp b/src/core/symbology-ng/qgslinesymbollayer.cpp
index 07d09ab221ce..fc2e220bea12 100644
--- a/src/core/symbology-ng/qgslinesymbollayer.cpp
+++ b/src/core/symbology-ng/qgslinesymbollayer.cpp
@@ -462,7 +462,12 @@ QgsSymbolLayer *QgsSimpleLineSymbolLayer::createFromSld( QDomElement &element )
offset = d;
}
+ QString uom = element.attribute( QStringLiteral( "uom" ), "" );
+ width = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, width );
+ offset = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, offset );
+
QgsSimpleLineSymbolLayer *l = new QgsSimpleLineSymbolLayer( color, width, penStyle );
+ l->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
l->setOffset( offset );
l->setPenJoinStyle( penJoinStyle );
l->setPenCapStyle( penCapStyle );
@@ -1518,7 +1523,12 @@ QgsSymbolLayer *QgsMarkerLineSymbolLayer::createFromSld( QDomElement &element )
offset = d;
}
+ QString uom = element.attribute( QStringLiteral( "uom" ), "" );
+ interval = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, interval );
+ offset = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, offset );
+
QgsMarkerLineSymbolLayer *x = new QgsMarkerLineSymbolLayer( rotateMarker );
+ x->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
x->setPlacement( placement );
x->setInterval( interval );
x->setSubSymbol( marker.release() );
diff --git a/src/core/symbology-ng/qgsmarkersymbollayer.cpp b/src/core/symbology-ng/qgsmarkersymbollayer.cpp
index 9e45d39d57c6..336d9553c938 100644
--- a/src/core/symbology-ng/qgsmarkersymbollayer.cpp
+++ b/src/core/symbology-ng/qgsmarkersymbollayer.cpp
@@ -1194,7 +1194,13 @@ QgsSymbolLayer *QgsSimpleMarkerSymbolLayer::createFromSld( QDomElement &element
Shape shape = decodeShape( name );
+ QString uom = element.attribute( QStringLiteral( "uom" ), "" );
+ size = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, size );
+ offset.setX( QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, offset.x() ) );
+ offset.setY( QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, offset.y() ) );
+
QgsSimpleMarkerSymbolLayer *m = new QgsSimpleMarkerSymbolLayer( shape, size );
+ m->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
m->setColor( color );
m->setStrokeColor( strokeColor );
m->setAngle( angle );
@@ -2217,6 +2223,9 @@ QgsSymbolLayer *QgsSvgMarkerSymbolLayer::createFromSld( QDomElement &element )
if ( !QgsSymbolLayerUtils::externalGraphicFromSld( graphicElem, path, mimeType, fillColor, size ) )
return nullptr;
+ QString uom = element.attribute( QStringLiteral( "uom" ), "" );
+ size = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, size );
+
if ( mimeType != QLatin1String( "image/svg+xml" ) )
return nullptr;
@@ -2234,6 +2243,7 @@ QgsSymbolLayer *QgsSvgMarkerSymbolLayer::createFromSld( QDomElement &element )
QgsSymbolLayerUtils::displacementFromSldElement( graphicElem, offset );
QgsSvgMarkerSymbolLayer *m = new QgsSvgMarkerSymbolLayer( path, size );
+ m->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
m->setFillColor( fillColor );
//m->setStrokeColor( strokeColor );
//m->setStrokeWidth( strokeWidth );
@@ -2874,7 +2884,13 @@ QgsSymbolLayer *QgsFontMarkerSymbolLayer::createFromSld( QDomElement &element )
QPointF offset;
QgsSymbolLayerUtils::displacementFromSldElement( graphicElem, offset );
+ QString uom = element.attribute( QStringLiteral( "uom" ), "" );
+ offset.setX( QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, offset.x() ) );
+ offset.setY( QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, offset.y() ) );
+ size = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, size );
+
QgsMarkerSymbolLayer *m = new QgsFontMarkerSymbolLayer( fontFamily, chr, size, color );
+ m->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
m->setAngle( angle );
m->setOffset( offset );
return m;
diff --git a/src/core/symbology-ng/qgssymbollayerutils.cpp b/src/core/symbology-ng/qgssymbollayerutils.cpp
index 8ae51f2d5c44..5a6209806f34 100644
--- a/src/core/symbology-ng/qgssymbollayerutils.cpp
+++ b/src/core/symbology-ng/qgssymbollayerutils.cpp
@@ -4037,3 +4037,23 @@ void QgsSymbolLayerUtils::mergeScaleDependencies( int mScaleMinDenom, int mScale
props[ QStringLiteral( "scaleMaxDenom" )] = QString::number( qMin( parentScaleMaxDenom, mScaleMaxDenom ) );
}
}
+
+double QgsSymbolLayerUtils::sizeInPixelsFromSldUom( const QString &uom, double size )
+{
+ double scale = 1.0;
+
+ if ( uom == QLatin1String( "http://www.opengeospatial.org/se/units/metre" ) )
+ {
+ scale = 1.0 / 0.00028; // from meters to pixels
+ }
+ else if ( uom == QLatin1String( "http://www.opengeospatial.org/se/units/foot" ) )
+ {
+ scale = 304.8 / 0.28; // from feet to pixels
+ }
+ else
+ {
+ scale = 1.0; // from pixels to pixels (default unit)
+ }
+
+ return size * scale;
+}
diff --git a/src/core/symbology-ng/qgssymbollayerutils.h b/src/core/symbology-ng/qgssymbollayerutils.h
index d12ed523adee..82dafb8cae47 100644
--- a/src/core/symbology-ng/qgssymbollayerutils.h
+++ b/src/core/symbology-ng/qgssymbollayerutils.h
@@ -137,6 +137,14 @@ class CORE_EXPORT QgsSymbolLayerUtils
*/
static QgsUnitTypes::RenderUnit decodeSldUom( const QString &str, double *scaleFactor );
+ /** Returns the size scaled in pixels according to the uom attribute.
+ * \param uom The uom attribute from SLD 1.1 version
+ * \param size The original size
+ * \returns the size in pixels
+ * \since QGIS 3.0
+ */
+ static double sizeInPixelsFromSldUom( const QString &uom, double size );
+
static QString encodeScaleMethod( QgsSymbol::ScaleMethod scaleMethod );
static QgsSymbol::ScaleMethod decodeScaleMethod( const QString &str );
diff --git a/tests/src/python/test_qgssymbollayer_readsld.py b/tests/src/python/test_qgssymbollayer_readsld.py
index c30ba1abf96f..70387569c23f 100644
--- a/tests/src/python/test_qgssymbollayer_readsld.py
+++ b/tests/src/python/test_qgssymbollayer_readsld.py
@@ -26,11 +26,23 @@
import qgis # NOQA
import os
+from qgis.PyQt.QtXml import QDomDocument
from qgis.testing import start_app, unittest
from qgis.core import (QgsVectorLayer,
QgsFeature,
QgsGeometry,
- QgsPoint
+ QgsUnitTypes,
+ QgsPoint,
+ QgsSvgMarkerSymbolLayer,
+ QgsEllipseSymbolLayer,
+ QgsSimpleFillSymbolLayer,
+ QgsSVGFillSymbolLayer,
+ QgsSvgMarkerSymbolLayer,
+ QgsLinePatternFillSymbolLayer,
+ QgsSimpleLineSymbolLayer,
+ QgsMarkerLineSymbolLayer,
+ QgsSimpleMarkerSymbolLayer,
+ QgsFontMarkerSymbolLayer
)
from qgis.testing.mocked import get_iface
from utilities import unitTestDataPath
@@ -51,6 +63,28 @@ def createLayerWithOneLine():
return linelayer
+def createLayerWithOnePoint():
+ layer = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer",
+ "addfeat", "memory")
+ pr = layer.dataProvider()
+ f = QgsFeature()
+ f.setAttributes(["test", 123])
+ f.setGeometry(QgsGeometry.fromPoint(QgsPoint(100, 200)))
+ assert pr.addFeatures([f])
+ assert layer.pendingFeatureCount() == 1
+ return layer
+
+
+def createLayerWithOnePolygon():
+ layer = QgsVectorLayer("Polygon?crs=epsg:3111&field=pk:int", "vl", "memory")
+ assert layer.isValid()
+ f1 = QgsFeature(layer.dataProvider().fields(), 1)
+ f1.setAttribute("pk", 1)
+ f1.setGeometry(QgsGeometry.fromPolygon([[QgsPoint(2484588, 2425722), QgsPoint(2482767, 2398853), QgsPoint(2520109, 2397715), QgsPoint(2520792, 2425494), QgsPoint(2484588, 2425722)]]))
+ assert layer.dataProvider().addFeatures([f1])
+ return layer
+
+
class TestQgsSymbolLayerReadSld(unittest.TestCase):
"""
@@ -111,6 +145,264 @@ def testSimpleMarkerRotation(self):
props = layer.renderer().symbol().symbolLayers()[0].properties()
self.assertEqual(props['angle'], '50')
+ def testSymbolSizeUom(self):
+ # create a layer
+ layer = createLayerWithOnePoint()
+
+ # load a sld with marker size without uom attribute (pixels)
+ sld = 'symbol_layer/QgsSvgMarkerSymbolLayer.sld'
+ mFilePath = os.path.join(TEST_DATA_DIR, sld)
+ layer.loadSldStyle(mFilePath)
+
+ sld_size_px = 12
+
+ sl = layer.renderer().symbol().symbolLayers()[0]
+ size = sl.size()
+ unit = sl.outputUnit()
+ self.assertEqual(unit, QgsUnitTypes.RenderPixels)
+ self.assertEqual(size, sld_size_px)
+
+ # load a sld with marker size with uom attribute in pixel
+ sld = 'symbol_layer/QgsSvgMarkerSymbolLayerUomPixel.sld'
+ mFilePath = os.path.join(TEST_DATA_DIR, sld)
+ layer.loadSldStyle(mFilePath)
+
+ sld_size_px = 12
+
+ sl = layer.renderer().symbol().symbolLayers()[0]
+ size = sl.size()
+ unit = sl.outputUnit()
+ self.assertEqual(unit, QgsUnitTypes.RenderPixels)
+ self.assertEqual(size, sld_size_px)
+
+ # load a sld with marker size with uom attribute in meter
+ sld = 'symbol_layer/QgsSvgMarkerSymbolLayerUomMetre.sld'
+ mFilePath = os.path.join(TEST_DATA_DIR, sld)
+ layer.loadSldStyle(mFilePath)
+
+ sld_size_px = 12 / (0.28 * 0.001)
+
+ sl = layer.renderer().symbol().symbolLayers()[0]
+ size = sl.size()
+ unit = sl.outputUnit()
+ self.assertEqual(unit, QgsUnitTypes.RenderPixels)
+ self.assertAlmostEqual(size, sld_size_px, delta=0.1)
+
+ # load a sld with marker size with uom attribute in foot
+ sld = 'symbol_layer/QgsSvgMarkerSymbolLayerUomFoot.sld'
+ mFilePath = os.path.join(TEST_DATA_DIR, sld)
+ layer.loadSldStyle(mFilePath)
+
+ sld_size_px = 12 * (304.8 / 0.28)
+
+ sl = layer.renderer().symbol().symbolLayers()[0]
+ size = sl.size()
+ unit = sl.outputUnit()
+ self.assertEqual(unit, QgsUnitTypes.RenderPixels)
+ self.assertAlmostEqual(size, sld_size_px, delta=0.1)
+
+ def testSymbolSize(self):
+ # create a layers
+ layer = createLayerWithOnePoint()
+ player = createLayerWithOnePolygon()
+
+ # size test for QgsEllipseSymbolLayer
+ sld = 'symbol_layer/QgsEllipseSymbolLayer.sld'
+ mFilePath = os.path.join(TEST_DATA_DIR, sld)
+ layer.loadSldStyle(mFilePath)
+
+ sld_size_px = 7
+ sld_stroke_width_px = 1
+
+ sl = layer.renderer().symbol().symbolLayers()[0]
+ size = sl.symbolWidth()
+ stroke_width = sl.strokeWidth()
+ unit = sl.outputUnit()
+ self.assertTrue(isinstance(sl, QgsEllipseSymbolLayer))
+ self.assertEqual(unit, QgsUnitTypes.RenderPixels)
+ self.assertEqual(size, sld_size_px)
+ self.assertEqual(stroke_width, sld_stroke_width_px)
+
+ # size test for QgsVectorFieldSymbolLayer
+ # createFromSld not implemented
+
+ # size test for QgsSimpleFillSymbolLayer
+ sld = 'symbol_layer/QgsSimpleFillSymbolLayer.sld'
+ mFilePath = os.path.join(TEST_DATA_DIR, sld)
+ player.loadSldStyle(mFilePath)
+
+ sld_stroke_width_px = 0.26
+
+ sl = player.renderer().symbol().symbolLayers()[0]
+ stroke_width = sl.strokeWidth()
+ unit = sl.outputUnit()
+ self.assertTrue(isinstance(sl, QgsSimpleFillSymbolLayer))
+ self.assertEqual(unit, QgsUnitTypes.RenderPixels)
+ self.assertEqual(stroke_width, sld_stroke_width_px)
+
+ # size test for QgsSVGFillSymbolLayer
+ sld = 'symbol_layer/QgsSVGFillSymbolLayer.sld'
+ mFilePath = os.path.join(TEST_DATA_DIR, sld)
+ player.loadSldStyle(mFilePath)
+
+ sld_size_px = 6
+ sld_stroke_width_px = 3
+
+ sl = player.renderer().symbol().symbolLayers()[0]
+ size = sl.patternWidth()
+ stroke_width = sl.svgStrokeWidth()
+ unit = sl.outputUnit()
+ self.assertTrue(isinstance(sl, QgsSVGFillSymbolLayer))
+ self.assertEqual(unit, QgsUnitTypes.RenderPixels)
+ self.assertEqual(size, sld_size_px)
+ self.assertEqual(stroke_width, sld_stroke_width_px)
+
+ # size test for QgsSvgMarkerSymbolLayer
+ sld = 'symbol_layer/QgsSvgMarkerSymbolLayer.sld'
+ mFilePath = os.path.join(TEST_DATA_DIR, sld)
+ layer.loadSldStyle(mFilePath)
+
+ sld_size_px = 12
+
+ sl = layer.renderer().symbol().symbolLayers()[0]
+ size = sl.size()
+ unit = sl.outputUnit()
+ self.assertTrue(isinstance(sl, QgsSvgMarkerSymbolLayer))
+ self.assertEqual(unit, QgsUnitTypes.RenderPixels)
+ self.assertEqual(size, sld_size_px)
+
+ # size test for QgsPointPatternFillSymbolLayer
+ # createFromSld not implemented
+
+ # size test for QgsLinePatternFillSymbolLayer
+ sld = 'symbol_layer/QgsLinePatternFillSymbolLayer.sld'
+ mFilePath = os.path.join(TEST_DATA_DIR, sld)
+ player.loadSldStyle(mFilePath)
+
+ sld_size_px = 4
+ sld_stroke_width_px = 1.5
+
+ sl = player.renderer().symbol().symbolLayers()[0]
+ size = sl.distance()
+ stroke_width = sl.lineWidth()
+ unit = sl.outputUnit()
+ self.assertTrue(isinstance(sl, QgsLinePatternFillSymbolLayer))
+ self.assertEqual(unit, QgsUnitTypes.RenderPixels)
+ self.assertEqual(size, sld_size_px)
+ self.assertEqual(stroke_width, sld_stroke_width_px)
+
+ # test size for QgsSimpleLineSymbolLayer
+ sld = 'symbol_layer/QgsSimpleLineSymbolLayer.sld'
+ mFilePath = os.path.join(TEST_DATA_DIR, sld)
+ player.loadSldStyle(mFilePath)
+
+ sld_stroke_width_px = 1.26
+
+ sl = player.renderer().symbol().symbolLayers()[0]
+ stroke_width = sl.width()
+ unit = sl.outputUnit()
+ self.assertTrue(isinstance(sl, QgsSimpleLineSymbolLayer))
+ self.assertEqual(unit, QgsUnitTypes.RenderPixels)
+ self.assertEqual(stroke_width, sld_stroke_width_px)
+
+ # test size for QgsMarkerLineSymbolLayer
+ sld = 'symbol_layer/QgsMarkerLineSymbolLayer.sld'
+ mFilePath = os.path.join(TEST_DATA_DIR, sld)
+ player.loadSldStyle(mFilePath)
+
+ sld_interval_px = 3.3
+ sld_offset_px = 6.6
+
+ sl = player.renderer().symbol().symbolLayers()[0]
+ interval = sl.interval()
+ offset = sl.offset()
+ unit = sl.outputUnit()
+ self.assertTrue(isinstance(sl, QgsMarkerLineSymbolLayer))
+ self.assertEqual(unit, QgsUnitTypes.RenderPixels)
+ self.assertEqual(interval, sld_interval_px)
+ self.assertEqual(offset, sld_offset_px)
+
+ # test size for QgsSimpleMarkerSymbolLayer
+ sld = 'symbol_layer/QgsSimpleMarkerSymbolLayer.sld'
+ mFilePath = os.path.join(TEST_DATA_DIR, sld)
+ layer.loadSldStyle(mFilePath)
+
+ sld_size_px = 6
+ sld_displacement_x_px = 3.3
+ sld_displacement_y_px = 6.6
+
+ sl = layer.renderer().symbol().symbolLayers()[0]
+ size = sl.size()
+ offset = sl.offset()
+ unit = sl.outputUnit()
+ self.assertTrue(isinstance(sl, QgsSimpleMarkerSymbolLayer))
+ self.assertEqual(unit, QgsUnitTypes.RenderPixels)
+ self.assertEqual(size, sld_size_px)
+ self.assertEqual(offset.x(), sld_displacement_x_px)
+ self.assertEqual(offset.y(), sld_displacement_y_px)
+
+ # test size for QgsSVGMarkerSymbolLayer
+ sld = 'symbol_layer/QgsSvgMarkerSymbolLayer.sld'
+ mFilePath = os.path.join(TEST_DATA_DIR, sld)
+ layer.loadSldStyle(mFilePath)
+
+ sld_size_px = 12
+
+ sl = layer.renderer().symbol().symbolLayers()[0]
+ size = sl.size()
+ self.assertTrue(isinstance(sl, QgsSvgMarkerSymbolLayer))
+ self.assertEqual(unit, QgsUnitTypes.RenderPixels)
+ self.assertEqual(size, sld_size_px)
+
+ # test size for QgsFontMarkerSymbolLayer
+ sld = 'symbol_layer/QgsFontMarkerSymbolLayer.sld'
+ mFilePath = os.path.join(TEST_DATA_DIR, sld)
+ layer.loadSldStyle(mFilePath)
+
+ sld_size_px = 6.23
+
+ sl = layer.renderer().symbol().symbolLayers()[0]
+ size = sl.size()
+ self.assertTrue(isinstance(sl, QgsFontMarkerSymbolLayer))
+ self.assertEqual(unit, QgsUnitTypes.RenderPixels)
+ self.assertEqual(size, sld_size_px)
+
+ def testSymbolSizeAfterReload(self):
+ # create a layer
+ layer = createLayerWithOnePoint()
+
+ # load a sld with marker size
+ sld = 'symbol_layer/QgsSvgMarkerSymbolLayer.sld'
+ mFilePath = os.path.join(TEST_DATA_DIR, sld)
+ layer.loadSldStyle(mFilePath)
+
+ # get the size and unit of the symbol
+ sl = layer.renderer().symbol().symbolLayers()[0]
+ first_size = sl.size()
+ first_unit = sl.outputUnit() # in pixels
+
+ # export sld into a qdomdocument with namespace processing activated
+ doc = QDomDocument()
+ msg = ""
+ layer.exportSldStyle(doc, msg)
+ doc.setContent(doc.toString(), True)
+ self.assertTrue(msg == "")
+
+ # reload the same sld
+ root = doc.firstChildElement("StyledLayerDescriptor")
+ el = root.firstChildElement("NamedLayer")
+ layer.readSld(el, msg)
+
+ # extract the size and unit of symbol
+ sl = layer.renderer().symbol().symbolLayers()[0]
+ second_size = sl.size()
+ second_unit = sl.outputUnit()
+
+ # size and unit should be the same after export and reload the same
+ # sld description
+ self.assertEqual(first_size, second_size)
+ self.assertEqual(first_unit, second_unit)
+
if __name__ == '__main__':
unittest.main()
diff --git a/tests/testdata/symbol_layer/QgsMarkerLineSymbolLayer.sld b/tests/testdata/symbol_layer/QgsMarkerLineSymbolLayer.sld
index f06603d19dd0..d313a173318a 100644
--- a/tests/testdata/symbol_layer/QgsMarkerLineSymbolLayer.sld
+++ b/tests/testdata/symbol_layer/QgsMarkerLineSymbolLayer.sld
@@ -11,6 +11,8 @@
centralPoint
+ 3.3
+ 6.6
circle
diff --git a/tests/testdata/symbol_layer/QgsSimpleMarkerSymbolLayer.sld b/tests/testdata/symbol_layer/QgsSimpleMarkerSymbolLayer.sld
index 3079773c1667..add169b0bd6d 100644
--- a/tests/testdata/symbol_layer/QgsSimpleMarkerSymbolLayer.sld
+++ b/tests/testdata/symbol_layer/QgsSimpleMarkerSymbolLayer.sld
@@ -9,6 +9,10 @@
Single symbol
+
+ 3.3
+ 6.6
+
pentagon
diff --git a/tests/testdata/symbol_layer/QgsSvgMarkerSymbolLayerUomFoot.sld b/tests/testdata/symbol_layer/QgsSvgMarkerSymbolLayerUomFoot.sld
new file mode 100644
index 000000000000..0c47fe1b3269
--- /dev/null
+++ b/tests/testdata/symbol_layer/QgsSvgMarkerSymbolLayerUomFoot.sld
@@ -0,0 +1,26 @@
+
+
+
+ 022cs000
+
+ 022cs000
+
+
+ Single symbol
+
+
+
+
+ image/svg+xml
+
+ 12
+
+ 45
+
+
+
+
+
+
+
+
diff --git a/tests/testdata/symbol_layer/QgsSvgMarkerSymbolLayerUomMetre.sld b/tests/testdata/symbol_layer/QgsSvgMarkerSymbolLayerUomMetre.sld
new file mode 100644
index 000000000000..15b3b57345c5
--- /dev/null
+++ b/tests/testdata/symbol_layer/QgsSvgMarkerSymbolLayerUomMetre.sld
@@ -0,0 +1,26 @@
+
+
+
+ 022cs000
+
+ 022cs000
+
+
+ Single symbol
+
+
+
+
+ image/svg+xml
+
+ 12
+
+ 45
+
+
+
+
+
+
+
+
diff --git a/tests/testdata/symbol_layer/QgsSvgMarkerSymbolLayerUomPixel.sld b/tests/testdata/symbol_layer/QgsSvgMarkerSymbolLayerUomPixel.sld
new file mode 100644
index 000000000000..1160acca2044
--- /dev/null
+++ b/tests/testdata/symbol_layer/QgsSvgMarkerSymbolLayerUomPixel.sld
@@ -0,0 +1,26 @@
+
+
+
+ 022cs000
+
+ 022cs000
+
+
+ Single symbol
+
+
+
+
+ image/svg+xml
+
+ 12
+
+ 45
+
+
+
+
+
+
+
+