Skip to content

Commit 1d702d2

Browse files
authored
Merge pull request #5144 from boundlessgeo/Backport_Fix_uom_reading
[bugfix] backport from 3.0 Fix unit of sizes when reading a SLD file (fixes #8978)
2 parents b3a8d6f + 439477a commit 1d702d2

13 files changed

+466
-5
lines changed

python/core/symbology-ng/qgssymbollayerv2utils.sip

+8
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@ class QgsSymbolLayerV2Utils
5757
static QString encodeSldUom( QgsSymbolV2::OutputUnit unit, double *scaleFactor );
5858
static QgsSymbolV2::OutputUnit decodeSldUom( const QString& str, double *scaleFactor );
5959

60+
/** Returns the size scaled in pixels according to the uom attribute.
61+
* \param uom The uom attribute from SLD 1.1 version
62+
* \param size The original size
63+
* \returns the size in pixels
64+
* \since QGIS 3.0
65+
*/
66+
static double sizeInPixelsFromSldUom( const QString &uom, double size );
67+
6068
static QString encodeScaleMethod( QgsSymbolV2::ScaleMethod scaleMethod );
6169
static QgsSymbolV2::ScaleMethod decodeScaleMethod( const QString& str );
6270

src/core/symbology-ng/qgsellipsesymbollayerv2.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,10 @@ QgsSymbolLayerV2* QgsEllipseSymbolLayerV2::createFromSld( QDomElement &element )
490490
if ( !QgsSymbolLayerV2Utils::wellKnownMarkerFromSld( graphicElem, name, fillColor, borderColor, borderStyle, borderWidth, size ) )
491491
return nullptr;
492492

493+
const QString uom = element.attribute( QString( "uom" ), "" );
494+
size = QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, size );
495+
borderWidth = QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, borderWidth );
496+
493497
double angle = 0.0;
494498
QString angleFunc;
495499
if ( QgsSymbolLayerV2Utils::rotationFromSldElement( graphicElem, angleFunc ) )
@@ -501,6 +505,7 @@ QgsSymbolLayerV2* QgsEllipseSymbolLayerV2::createFromSld( QDomElement &element )
501505
}
502506

503507
QgsEllipseSymbolLayerV2 *m = new QgsEllipseSymbolLayerV2();
508+
m->setOutputUnit( QgsSymbolV2::Pixel );
504509
m->setSymbolName( name );
505510
m->setFillColor( fillColor );
506511
m->setOutlineColor( borderColor );

src/core/symbology-ng/qgsfillsymbollayerv2.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,13 @@ QgsSymbolLayerV2* QgsSimpleFillSymbolLayerV2::createFromSld( QDomElement &elemen
390390
QPointF offset;
391391
QgsSymbolLayerV2Utils::displacementFromSldElement( element, offset );
392392

393+
QString uom = element.attribute( QString( "uom" ), "" );
394+
offset.setX( QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, offset.x() ) );
395+
offset.setY( QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, offset.y() ) );
396+
borderWidth = QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, borderWidth );
397+
393398
QgsSimpleFillSymbolLayerV2* sl = new QgsSimpleFillSymbolLayerV2( color, fillStyle, borderColor, borderStyle, borderWidth );
399+
sl->setOutputUnit( QgsSymbolV2::Pixel );
394400
sl->setOffset( offset );
395401
return sl;
396402
}
@@ -2159,6 +2165,10 @@ QgsSymbolLayerV2* QgsSVGFillSymbolLayer::createFromSld( QDomElement &element )
21592165

21602166
QgsSymbolLayerV2Utils::lineFromSld( graphicElem, penStyle, borderColor, borderWidth );
21612167

2168+
QString uom = element.attribute( QString( "uom" ), "" );
2169+
size = QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, size );
2170+
borderWidth = QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, borderWidth );
2171+
21622172
double angle = 0.0;
21632173
QString angleFunc;
21642174
if ( QgsSymbolLayerV2Utils::rotationFromSldElement( graphicElem, angleFunc ) )
@@ -2170,6 +2180,7 @@ QgsSymbolLayerV2* QgsSVGFillSymbolLayer::createFromSld( QDomElement &element )
21702180
}
21712181

21722182
QgsSVGFillSymbolLayer* sl = new QgsSVGFillSymbolLayer( path, size, angle );
2183+
sl->setOutputUnit( QgsSymbolV2::Pixel );
21732184
sl->setSvgFillColor( fillColor );
21742185
sl->setSvgOutlineColor( borderColor );
21752186
sl->setSvgOutlineWidth( borderWidth );
@@ -3018,7 +3029,12 @@ QgsSymbolLayerV2* QgsLinePatternFillSymbolLayer::createFromSld( QDomElement &ele
30183029
offset = sqrt( pow( vectOffset.x(), 2 ) + pow( vectOffset.y(), 2 ) );
30193030
}
30203031

3032+
QString uom = element.attribute( QString( "uom" ), "" );
3033+
size = QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, size );
3034+
lineWidth = QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, lineWidth );
3035+
30213036
QgsLinePatternFillSymbolLayer* sl = new QgsLinePatternFillSymbolLayer();
3037+
sl->setOutputUnit( QgsSymbolV2::Pixel );
30223038
sl->setColor( lineColor );
30233039
sl->setLineWidth( lineWidth );
30243040
sl->setLineAngle( angle );

src/core/symbology-ng/qgslinesymbollayerv2.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,12 @@ QgsSymbolLayerV2* QgsSimpleLineSymbolLayerV2::createFromSld( QDomElement &elemen
471471
offset = d;
472472
}
473473

474+
QString uom = element.attribute( QString( "uom" ), "" );
475+
width = QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, width );
476+
offset = QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, offset );
477+
474478
QgsSimpleLineSymbolLayerV2* l = new QgsSimpleLineSymbolLayerV2( color, width, penStyle );
479+
l->setOutputUnit( QgsSymbolV2::Pixel );
475480
l->setOffset( offset );
476481
l->setPenJoinStyle( penJoinStyle );
477482
l->setPenCapStyle( penCapStyle );
@@ -1551,7 +1556,12 @@ QgsSymbolLayerV2* QgsMarkerLineSymbolLayerV2::createFromSld( QDomElement &elemen
15511556
offset = d;
15521557
}
15531558

1559+
QString uom = element.attribute( QString( "uom" ), "" );
1560+
interval = QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, interval );
1561+
offset = QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, offset );
1562+
15541563
QgsMarkerLineSymbolLayerV2* x = new QgsMarkerLineSymbolLayerV2( rotateMarker );
1564+
x->setOutputUnit( QgsSymbolV2::Pixel );
15551565
x->setPlacement( placement );
15561566
x->setInterval( interval );
15571567
x->setSubSymbol( marker );

src/core/symbology-ng/qgsmarkersymbollayerv2.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -1239,7 +1239,13 @@ QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2::createFromSld( QDomElement &elem
12391239

12401240
Shape shape = decodeShape( name );
12411241

1242+
QString uom = element.attribute( QString( "uom" ), "" );
1243+
size = QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, size );
1244+
offset.setX( QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, offset.x() ) );
1245+
offset.setY( QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, offset.y() ) );
1246+
12421247
QgsSimpleMarkerSymbolLayerV2 *m = new QgsSimpleMarkerSymbolLayerV2( shape, size );
1248+
m->setOutputUnit( QgsSymbolV2::Pixel );
12431249
m->setColor( color );
12441250
m->setBorderColor( borderColor );
12451251
m->setAngle( angle );
@@ -2266,6 +2272,9 @@ QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2::createFromSld( QDomElement &element
22662272
if ( !QgsSymbolLayerV2Utils::externalGraphicFromSld( graphicElem, path, mimeType, fillColor, size ) )
22672273
return nullptr;
22682274

2275+
QString uom = element.attribute( QString( "uom" ), "" );
2276+
size = QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, size );
2277+
22692278
if ( mimeType != "image/svg+xml" )
22702279
return nullptr;
22712280

@@ -2283,6 +2292,7 @@ QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2::createFromSld( QDomElement &element
22832292
QgsSymbolLayerV2Utils::displacementFromSldElement( graphicElem, offset );
22842293

22852294
QgsSvgMarkerSymbolLayerV2* m = new QgsSvgMarkerSymbolLayerV2( path, size );
2295+
m->setOutputUnit( QgsSymbolV2::Pixel );
22862296
m->setFillColor( fillColor );
22872297
//m->setOutlineColor( outlineColor );
22882298
//m->setOutlineWidth( outlineWidth );
@@ -2945,7 +2955,13 @@ QgsSymbolLayerV2* QgsFontMarkerSymbolLayerV2::createFromSld( QDomElement &elemen
29452955
QPointF offset;
29462956
QgsSymbolLayerV2Utils::displacementFromSldElement( graphicElem, offset );
29472957

2958+
QString uom = element.attribute( QString( "uom" ), "" );
2959+
offset.setX( QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, offset.x() ) );
2960+
offset.setY( QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, offset.y() ) );
2961+
size = QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( uom, size );
2962+
29482963
QgsMarkerSymbolLayerV2 *m = new QgsFontMarkerSymbolLayerV2( fontFamily, chr, size, color );
2964+
m->setOutputUnit( QgsSymbolV2::Pixel );
29492965
m->setAngle( angle );
29502966
m->setOffset( offset );
29512967
return m;

src/core/symbology-ng/qgssymbollayerv2utils.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -4231,3 +4231,23 @@ void QgsSymbolLayerV2Utils::mergeScaleDependencies( int mScaleMinDenom, int mSca
42314231
props[ "scaleMaxDenom" ] = QString::number( qMin( parentScaleMaxDenom, mScaleMaxDenom ) );
42324232
}
42334233
}
4234+
4235+
double QgsSymbolLayerV2Utils::sizeInPixelsFromSldUom( const QString &uom, double size )
4236+
{
4237+
double scale = 1.0;
4238+
4239+
if ( uom == QLatin1String( "http://www.opengeospatial.org/se/units/metre" ) )
4240+
{
4241+
scale = 1.0 / 0.00028; // from meters to pixels
4242+
}
4243+
else if ( uom == QLatin1String( "http://www.opengeospatial.org/se/units/foot" ) )
4244+
{
4245+
scale = 304.8 / 0.28; // from feet to pixels
4246+
}
4247+
else
4248+
{
4249+
scale = 1.0; // from pixels to pixels (default unit)
4250+
}
4251+
4252+
return size * scale;
4253+
}

src/core/symbology-ng/qgssymbollayerv2utils.h

+8
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,14 @@ class CORE_EXPORT QgsSymbolLayerV2Utils
103103
static QString encodeScaleMethod( QgsSymbolV2::ScaleMethod scaleMethod );
104104
static QgsSymbolV2::ScaleMethod decodeScaleMethod( const QString& str );
105105

106+
/** Returns the size scaled in pixels according to the uom attribute.
107+
* @param uom The uom attribute from SLD 1.1 version
108+
* @param size The original size
109+
* @returns the size in pixels
110+
* @note added in QGIS 2.18 and 3.0
111+
*/
112+
static double sizeInPixelsFromSldUom( const QString &uom, double size );
113+
106114
static QPainter::CompositionMode decodeBlendMode( const QString& s );
107115

108116
static QIcon symbolPreviewIcon( QgsSymbolV2* symbol, QSize size );

0 commit comments

Comments
 (0)