Skip to content

Commit 8773638

Browse files
committedMay 16, 2017
[bugfix] Fix unit of sizes when reading a SLD file (fixes #8978)
1 parent 11475c6 commit 8773638

File tree

6 files changed

+75
-0
lines changed

6 files changed

+75
-0
lines changed
 

‎src/core/symbology-ng/qgsellipsesymbollayer.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,10 @@ QgsSymbolLayer *QgsEllipseSymbolLayer::createFromSld( QDomElement &element )
451451
if ( !QgsSymbolLayerUtils::wellKnownMarkerFromSld( graphicElem, name, fillColor, strokeColor, strokeStyle, strokeWidth, size ) )
452452
return nullptr;
453453

454+
QString uom = element.attribute( QStringLiteral( "uom" ), "" );
455+
size = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, size );
456+
strokeWidth = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, strokeWidth );
457+
454458
double angle = 0.0;
455459
QString angleFunc;
456460
if ( QgsSymbolLayerUtils::rotationFromSldElement( graphicElem, angleFunc ) )
@@ -462,6 +466,7 @@ QgsSymbolLayer *QgsEllipseSymbolLayer::createFromSld( QDomElement &element )
462466
}
463467

464468
QgsEllipseSymbolLayer *m = new QgsEllipseSymbolLayer();
469+
m->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
465470
m->setSymbolName( name );
466471
m->setFillColor( fillColor );
467472
m->setStrokeColor( strokeColor );

‎src/core/symbology-ng/qgsfillsymbollayer.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,13 @@ QgsSymbolLayer *QgsSimpleFillSymbolLayer::createFromSld( QDomElement &element )
381381
QPointF offset;
382382
QgsSymbolLayerUtils::displacementFromSldElement( element, offset );
383383

384+
QString uom = element.attribute( QStringLiteral( "uom" ), "" );
385+
offset.setX( QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, offset.x() ) );
386+
offset.setY( QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, offset.y() ) );
387+
strokeWidth = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, strokeWidth );
388+
384389
QgsSimpleFillSymbolLayer *sl = new QgsSimpleFillSymbolLayer( color, fillStyle, strokeColor, strokeStyle, strokeWidth );
390+
sl->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
385391
sl->setOffset( offset );
386392
return sl;
387393
}
@@ -2134,6 +2140,10 @@ QgsSymbolLayer *QgsSVGFillSymbolLayer::createFromSld( QDomElement &element )
21342140

21352141
QgsSymbolLayerUtils::lineFromSld( graphicElem, penStyle, strokeColor, strokeWidth );
21362142

2143+
QString uom = element.attribute( QStringLiteral( "uom" ), "" );
2144+
size = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, size );
2145+
strokeWidth = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, strokeWidth );
2146+
21372147
double angle = 0.0;
21382148
QString angleFunc;
21392149
if ( QgsSymbolLayerUtils::rotationFromSldElement( graphicElem, angleFunc ) )
@@ -2145,6 +2155,7 @@ QgsSymbolLayer *QgsSVGFillSymbolLayer::createFromSld( QDomElement &element )
21452155
}
21462156

21472157
QgsSVGFillSymbolLayer *sl = new QgsSVGFillSymbolLayer( path, size, angle );
2158+
sl->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
21482159
sl->setSvgFillColor( fillColor );
21492160
sl->setSvgStrokeColor( strokeColor );
21502161
sl->setSvgStrokeWidth( strokeWidth );
@@ -2950,7 +2961,12 @@ QgsSymbolLayer *QgsLinePatternFillSymbolLayer::createFromSld( QDomElement &eleme
29502961
offset = sqrt( pow( vectOffset.x(), 2 ) + pow( vectOffset.y(), 2 ) );
29512962
}
29522963

2964+
QString uom = element.attribute( QStringLiteral( "uom" ), "" );
2965+
size = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, size );
2966+
lineWidth = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, lineWidth );
2967+
29532968
QgsLinePatternFillSymbolLayer *sl = new QgsLinePatternFillSymbolLayer();
2969+
sl->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
29542970
sl->setColor( lineColor );
29552971
sl->setLineWidth( lineWidth );
29562972
sl->setLineAngle( angle );

‎src/core/symbology-ng/qgslinesymbollayer.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,12 @@ QgsSymbolLayer *QgsSimpleLineSymbolLayer::createFromSld( QDomElement &element )
462462
offset = d;
463463
}
464464

465+
QString uom = element.attribute( QStringLiteral( "uom" ), "" );
466+
width = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, width );
467+
offset = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, offset );
468+
465469
QgsSimpleLineSymbolLayer *l = new QgsSimpleLineSymbolLayer( color, width, penStyle );
470+
l->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
466471
l->setOffset( offset );
467472
l->setPenJoinStyle( penJoinStyle );
468473
l->setPenCapStyle( penCapStyle );
@@ -1518,7 +1523,12 @@ QgsSymbolLayer *QgsMarkerLineSymbolLayer::createFromSld( QDomElement &element )
15181523
offset = d;
15191524
}
15201525

1526+
QString uom = element.attribute( QStringLiteral( "uom" ), "" );
1527+
interval = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, interval );
1528+
offset = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, offset );
1529+
15211530
QgsMarkerLineSymbolLayer *x = new QgsMarkerLineSymbolLayer( rotateMarker );
1531+
x->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
15221532
x->setPlacement( placement );
15231533
x->setInterval( interval );
15241534
x->setSubSymbol( marker.release() );

‎src/core/symbology-ng/qgsmarkersymbollayer.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1194,7 +1194,13 @@ QgsSymbolLayer *QgsSimpleMarkerSymbolLayer::createFromSld( QDomElement &element
11941194

11951195
Shape shape = decodeShape( name );
11961196

1197+
QString uom = element.attribute( QStringLiteral( "uom" ), "" );
1198+
size = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, size );
1199+
offset.setX( QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, offset.x() ) );
1200+
offset.setY( QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, offset.y() ) );
1201+
11971202
QgsSimpleMarkerSymbolLayer *m = new QgsSimpleMarkerSymbolLayer( shape, size );
1203+
m->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
11981204
m->setColor( color );
11991205
m->setStrokeColor( strokeColor );
12001206
m->setAngle( angle );
@@ -2217,6 +2223,9 @@ QgsSymbolLayer *QgsSvgMarkerSymbolLayer::createFromSld( QDomElement &element )
22172223
if ( !QgsSymbolLayerUtils::externalGraphicFromSld( graphicElem, path, mimeType, fillColor, size ) )
22182224
return nullptr;
22192225

2226+
QString uom = element.attribute( QStringLiteral( "uom" ), "" );
2227+
size = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, size );
2228+
22202229
if ( mimeType != QLatin1String( "image/svg+xml" ) )
22212230
return nullptr;
22222231

@@ -2234,6 +2243,7 @@ QgsSymbolLayer *QgsSvgMarkerSymbolLayer::createFromSld( QDomElement &element )
22342243
QgsSymbolLayerUtils::displacementFromSldElement( graphicElem, offset );
22352244

22362245
QgsSvgMarkerSymbolLayer *m = new QgsSvgMarkerSymbolLayer( path, size );
2246+
m->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
22372247
m->setFillColor( fillColor );
22382248
//m->setStrokeColor( strokeColor );
22392249
//m->setStrokeWidth( strokeWidth );
@@ -2874,7 +2884,13 @@ QgsSymbolLayer *QgsFontMarkerSymbolLayer::createFromSld( QDomElement &element )
28742884
QPointF offset;
28752885
QgsSymbolLayerUtils::displacementFromSldElement( graphicElem, offset );
28762886

2887+
QString uom = element.attribute( QStringLiteral( "uom" ), "" );
2888+
offset.setX( QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, offset.x() ) );
2889+
offset.setY( QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, offset.y() ) );
2890+
size = QgsSymbolLayerUtils::sizeInPixelsFromSldUom( uom, size );
2891+
28772892
QgsMarkerSymbolLayer *m = new QgsFontMarkerSymbolLayer( fontFamily, chr, size, color );
2893+
m->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
28782894
m->setAngle( angle );
28792895
m->setOffset( offset );
28802896
return m;

‎src/core/symbology-ng/qgssymbollayerutils.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4036,3 +4036,23 @@ void QgsSymbolLayerUtils::mergeScaleDependencies( int mScaleMinDenom, int mScale
40364036
props[ QStringLiteral( "scaleMaxDenom" )] = QString::number( qMin( parentScaleMaxDenom, mScaleMaxDenom ) );
40374037
}
40384038
}
4039+
4040+
double QgsSymbolLayerUtils::sizeInPixelsFromSldUom( const QString &uom, double size )
4041+
{
4042+
double scale = 1.0;
4043+
4044+
if ( uom == QLatin1String( "http://www.opengeospatial.org/se/units/metre" ) )
4045+
{
4046+
scale = 1.0 / 0.00028; // from meters to pixels
4047+
}
4048+
else if ( uom == QLatin1String( "http://www.opengeospatial.org/se/units/foot" ) )
4049+
{
4050+
scale = 304.8 / 0.28; // from feet to pixels
4051+
}
4052+
else
4053+
{
4054+
scale = 1.0; // from pixels to pixels (default unit)
4055+
}
4056+
4057+
return size * scale;
4058+
}

‎src/core/symbology-ng/qgssymbollayerutils.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,14 @@ class CORE_EXPORT QgsSymbolLayerUtils
137137
*/
138138
static QgsUnitTypes::RenderUnit decodeSldUom( const QString &str, double *scaleFactor );
139139

140+
/** Returns the size scaled in pixels according to the uom attribute.
141+
* \param uom The uom attribute from SLD 1.1 version
142+
* \param size The original size
143+
* \returns the size in pixels
144+
* \since QGIS 3.0
145+
*/
146+
static double sizeInPixelsFromSldUom( const QString &uom, double size );
147+
140148
static QString encodeScaleMethod( QgsSymbol::ScaleMethod scaleMethod );
141149
static QgsSymbol::ScaleMethod decodeScaleMethod( const QString &str );
142150

0 commit comments

Comments
 (0)
Please sign in to comment.