Skip to content

Commit db91e40

Browse files
authored
Merge pull request #4050 from boundlessgeo/release-2_18-SldRotationFix
Tests and fix to read sld:Rotation when does not have ogc sub tags
2 parents 02c4688 + e4d3da2 commit db91e40

File tree

5 files changed

+103
-1
lines changed

5 files changed

+103
-1
lines changed

src/core/qgsogcutils.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -1599,6 +1599,16 @@ QgsExpression* QgsOgcUtils::expressionFromOgcFilter( const QDomElement& element
15991599
if ( element.isNull() || !element.hasChildNodes() )
16001600
return nullptr;
16011601

1602+
// check if it is a single string value => no DomElement
1603+
if ( element.firstChild().nodeType() == QDomNode::TextNode )
1604+
{
1605+
QgsExpression *expr = new QgsExpression( element.firstChild().nodeValue() );
1606+
expr->d->mParserErrorString = QString();
1607+
return expr;
1608+
}
1609+
1610+
// now parse OGC operators. OGC operator does not have a only text value
1611+
// but only sub element operators
16021612
QgsExpression *expr = new QgsExpression();
16031613

16041614
QDomElement childElem = element.firstChildElement();

src/core/symbology-ng/qgssymbollayerv2utils.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -2577,6 +2577,7 @@ bool QgsSymbolLayerV2Utils::createFunctionElement( QDomDocument &doc, QDomElemen
25772577

25782578
bool QgsSymbolLayerV2Utils::functionFromSldElement( QDomElement &element, QString &function )
25792579
{
2580+
// check if ogc:Filter or containe ogc:Filters
25802581
QDomElement elem = element;
25812582
if ( element.tagName() != "Filter" )
25822583
{
@@ -2592,7 +2593,7 @@ bool QgsSymbolLayerV2Utils::functionFromSldElement( QDomElement &element, QStrin
25922593
return false;
25932594
}
25942595

2595-
2596+
// parse ogc:Filter
25962597
QgsExpression *expr = QgsOgcUtils::expressionFromOgcFilter( elem );
25972598
if ( !expr )
25982599
return false;

tests/src/python/test_qgssymbollayerv2_readsld.py

+30
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
"""
44
***************************************************************************
5+
<<<<<<< 1746b32a08acfdaba35068127b25955ba7bd4b3b
56
test_qgssymbollayer_readsld.py
7+
=======
8+
test_qgssymbollayerv2_readsld.py
9+
>>>>>>> Tests and fix to read sld:Rotation when does not have ogc sub tags
610
---------------------
711
Date : January 2017
812
Copyright : (C) 2017, Jorge Gustavo Rocha
@@ -87,5 +91,31 @@ def testLineOpacity():
8791
testLineWidth()
8892
testLineOpacity()
8993

94+
def testSimpleMarkerRotation(self):
95+
"""
96+
Test if pointMarker property sld:Rotation value can be read if format is:
97+
<sld:Rotation>50.0</sld:Rotation>
98+
or
99+
<se:Rotation><ogc:Literal>50</ogc:Literal></se:Rotation>
100+
"""
101+
# technically it's not necessary to use a real shape, but a empty memory
102+
# layer. In case these tests will upgrate to a rendering where to
103+
# compare also rendering not only properties
104+
#myShpFile = os.path.join(unitTestDataPath(), 'points.shp')
105+
#layer = QgsVectorLayer(myShpFile, 'points', 'ogr')
106+
layer = QgsVectorLayer("Point", "addfeat", "memory")
107+
assert(layer.isValid())
108+
# test if able to read <sld:Rotation>50.0</sld:Rotation>
109+
mFilePath = os.path.join(unitTestDataPath(), 'symbol_layer/external_sld/testSimpleMarkerRotation-directValue.sld')
110+
layer.loadSldStyle(mFilePath)
111+
props = layer.rendererV2().symbol().symbolLayers()[0].properties()
112+
self.assertEqual(props['angle'], '50')
113+
# test if able to read <se:Rotation><ogc:Literal>50</ogc:Literal></se:Rotation>
114+
mFilePath = os.path.join(unitTestDataPath(), 'symbol_layer/external_sld/testSimpleMarkerRotation-ogcLiteral.sld')
115+
layer.loadSldStyle(mFilePath)
116+
props = layer.rendererV2().symbol().symbolLayers()[0].properties()
117+
self.assertEqual(props['angle'], '50')
118+
119+
90120
if __name__ == '__main__':
91121
unittest.main()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?xml version="1.0" ?>
2+
<sld:StyledLayerDescriptor version="1.0.0" xmlns="http://www.opengis.net/sld" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:sld="http://www.opengis.net/sld">
3+
<sld:NamedLayer>
4+
<sld:Name>testSimpleMarkerRotation</sld:Name>
5+
<sld:UserStyle>
6+
<sld:Name>testSimpleMarkerRotation</sld:Name>
7+
<sld:FeatureTypeStyle>
8+
<sld:Name>name</sld:Name>
9+
<sld:Rule>
10+
<sld:Name>Single symbol</sld:Name>
11+
<sld:PointSymbolizer>
12+
<sld:Graphic>
13+
<sld:Mark>
14+
<sld:WellKnownName>star</sld:WellKnownName>
15+
<sld:Fill>
16+
<sld:CssParameter name="fill">#ff0000</sld:CssParameter>
17+
</sld:Fill>
18+
<sld:Stroke>
19+
<sld:CssParameter name="stroke">#00ff00</sld:CssParameter>
20+
</sld:Stroke>
21+
</sld:Mark>
22+
<sld:Size>36</sld:Size>
23+
<sld:Rotation>50.0</sld:Rotation>
24+
</sld:Graphic>
25+
</sld:PointSymbolizer>
26+
</sld:Rule>
27+
</sld:FeatureTypeStyle>
28+
</sld:UserStyle>
29+
</sld:NamedLayer>
30+
</sld:StyledLayerDescriptor>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" xmlns:se="http://www.opengis.net/se">
3+
<NamedLayer>
4+
<se:Name>points</se:Name>
5+
<UserStyle>
6+
<se:Name>points</se:Name>
7+
<se:FeatureTypeStyle>
8+
<se:Rule>
9+
<se:Name>Single symbol</se:Name>
10+
<se:PointSymbolizer>
11+
<se:Graphic>
12+
<se:Mark>
13+
<se:WellKnownName>regular_star</se:WellKnownName>
14+
<se:Fill>
15+
<se:SvgParameter name="fill">#ff0000</se:SvgParameter>
16+
</se:Fill>
17+
<se:Stroke>
18+
<se:SvgParameter name="stroke">#00ff00</se:SvgParameter>
19+
</se:Stroke>
20+
</se:Mark>
21+
<se:Size>10</se:Size>
22+
<se:Rotation>
23+
<ogc:Literal>50</ogc:Literal>
24+
</se:Rotation>
25+
</se:Graphic>
26+
</se:PointSymbolizer>
27+
</se:Rule>
28+
</se:FeatureTypeStyle>
29+
</UserStyle>
30+
</NamedLayer>
31+
</StyledLayerDescriptor>

0 commit comments

Comments
 (0)