mirror of
https://github.com/qgis/QGIS.git
synced 2025-10-10 00:04:23 -04:00
Merge pull request #4049 from boundlessgeo/master-SldRotationFix
Tests and fix to read sld:Rotation when does not have ogc sub tags
This commit is contained in:
commit
f46b25b9f3
@ -1603,6 +1603,16 @@ QgsExpression* QgsOgcUtils::expressionFromOgcFilter( const QDomElement& element
|
|||||||
|
|
||||||
QgsExpression *expr = new QgsExpression();
|
QgsExpression *expr = new QgsExpression();
|
||||||
|
|
||||||
|
// check if it is a single string value not having DOM elements
|
||||||
|
// that express OGC operators
|
||||||
|
if ( element.firstChild().nodeType() == QDomNode::TextNode )
|
||||||
|
{
|
||||||
|
expr->setExpression( element.firstChild().nodeValue() );
|
||||||
|
return expr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// then check OGC DOM elements that contain OGC tags specifying
|
||||||
|
// OGC operators.
|
||||||
QDomElement childElem = element.firstChildElement();
|
QDomElement childElem = element.firstChildElement();
|
||||||
while ( !childElem.isNull() )
|
while ( !childElem.isNull() )
|
||||||
{
|
{
|
||||||
|
@ -2499,6 +2499,7 @@ bool QgsSymbolLayerUtils::createFunctionElement( QDomDocument &doc, QDomElement
|
|||||||
|
|
||||||
bool QgsSymbolLayerUtils::functionFromSldElement( QDomElement &element, QString &function )
|
bool QgsSymbolLayerUtils::functionFromSldElement( QDomElement &element, QString &function )
|
||||||
{
|
{
|
||||||
|
// check if ogc:Filter or containe ogc:Filters
|
||||||
QDomElement elem = element;
|
QDomElement elem = element;
|
||||||
if ( element.tagName() != QLatin1String( "Filter" ) )
|
if ( element.tagName() != QLatin1String( "Filter" ) )
|
||||||
{
|
{
|
||||||
@ -2514,7 +2515,7 @@ bool QgsSymbolLayerUtils::functionFromSldElement( QDomElement &element, QString
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parse ogc:Filter
|
||||||
QgsExpression *expr = QgsOgcUtils::expressionFromOgcFilter( elem );
|
QgsExpression *expr = QgsOgcUtils::expressionFromOgcFilter( elem );
|
||||||
if ( !expr )
|
if ( !expr )
|
||||||
return false;
|
return false;
|
||||||
|
@ -87,5 +87,31 @@ class TestQgsSymbolLayerReadSld(unittest.TestCase):
|
|||||||
testLineWidth()
|
testLineWidth()
|
||||||
testLineOpacity()
|
testLineOpacity()
|
||||||
|
|
||||||
|
def testSimpleMarkerRotation(self):
|
||||||
|
"""
|
||||||
|
Test if pointMarker property sld:Rotation value can be read if format is:
|
||||||
|
<sld:Rotation>50.0</sld:Rotation>
|
||||||
|
or
|
||||||
|
<se:Rotation><ogc:Literal>50</ogc:Literal></se:Rotation>
|
||||||
|
"""
|
||||||
|
# technically it's not necessary to use a real shape, but a empty memory
|
||||||
|
# layer. In case these tests will upgrate to a rendering where to
|
||||||
|
# compare also rendering not only properties
|
||||||
|
#myShpFile = os.path.join(unitTestDataPath(), 'points.shp')
|
||||||
|
#layer = QgsVectorLayer(myShpFile, 'points', 'ogr')
|
||||||
|
layer = QgsVectorLayer("Point", "addfeat", "memory")
|
||||||
|
assert(layer.isValid())
|
||||||
|
# test if able to read <sld:Rotation>50.0</sld:Rotation>
|
||||||
|
mFilePath = os.path.join(unitTestDataPath(), 'symbol_layer/external_sld/testSimpleMarkerRotation-directValue.sld')
|
||||||
|
layer.loadSldStyle(mFilePath)
|
||||||
|
props = layer.renderer().symbol().symbolLayers()[0].properties()
|
||||||
|
self.assertEqual(props['angle'], '50')
|
||||||
|
# test if able to read <se:Rotation><ogc:Literal>50</ogc:Literal></se:Rotation>
|
||||||
|
mFilePath = os.path.join(unitTestDataPath(), 'symbol_layer/external_sld/testSimpleMarkerRotation-ogcLiteral.sld')
|
||||||
|
layer.loadSldStyle(mFilePath)
|
||||||
|
props = layer.renderer().symbol().symbolLayers()[0].properties()
|
||||||
|
self.assertEqual(props['angle'], '50')
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
30
tests/testdata/symbol_layer/external_sld/testSimpleMarkerRotation-directValue.sld
vendored
Normal file
30
tests/testdata/symbol_layer/external_sld/testSimpleMarkerRotation-directValue.sld
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<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">
|
||||||
|
<sld:NamedLayer>
|
||||||
|
<sld:Name>testSimpleMarkerRotation</sld:Name>
|
||||||
|
<sld:UserStyle>
|
||||||
|
<sld:Name>testSimpleMarkerRotation</sld:Name>
|
||||||
|
<sld:FeatureTypeStyle>
|
||||||
|
<sld:Name>name</sld:Name>
|
||||||
|
<sld:Rule>
|
||||||
|
<sld:Name>Single symbol</sld:Name>
|
||||||
|
<sld:PointSymbolizer>
|
||||||
|
<sld:Graphic>
|
||||||
|
<sld:Mark>
|
||||||
|
<sld:WellKnownName>star</sld:WellKnownName>
|
||||||
|
<sld:Fill>
|
||||||
|
<sld:CssParameter name="fill">#ff0000</sld:CssParameter>
|
||||||
|
</sld:Fill>
|
||||||
|
<sld:Stroke>
|
||||||
|
<sld:CssParameter name="stroke">#00ff00</sld:CssParameter>
|
||||||
|
</sld:Stroke>
|
||||||
|
</sld:Mark>
|
||||||
|
<sld:Size>36</sld:Size>
|
||||||
|
<sld:Rotation>50.0</sld:Rotation>
|
||||||
|
</sld:Graphic>
|
||||||
|
</sld:PointSymbolizer>
|
||||||
|
</sld:Rule>
|
||||||
|
</sld:FeatureTypeStyle>
|
||||||
|
</sld:UserStyle>
|
||||||
|
</sld:NamedLayer>
|
||||||
|
</sld:StyledLayerDescriptor>
|
31
tests/testdata/symbol_layer/external_sld/testSimpleMarkerRotation-ogcLiteral.sld
vendored
Normal file
31
tests/testdata/symbol_layer/external_sld/testSimpleMarkerRotation-ogcLiteral.sld
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<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">
|
||||||
|
<NamedLayer>
|
||||||
|
<se:Name>points</se:Name>
|
||||||
|
<UserStyle>
|
||||||
|
<se:Name>points</se:Name>
|
||||||
|
<se:FeatureTypeStyle>
|
||||||
|
<se:Rule>
|
||||||
|
<se:Name>Single symbol</se:Name>
|
||||||
|
<se:PointSymbolizer>
|
||||||
|
<se:Graphic>
|
||||||
|
<se:Mark>
|
||||||
|
<se:WellKnownName>regular_star</se:WellKnownName>
|
||||||
|
<se:Fill>
|
||||||
|
<se:SvgParameter name="fill">#ff0000</se:SvgParameter>
|
||||||
|
</se:Fill>
|
||||||
|
<se:Stroke>
|
||||||
|
<se:SvgParameter name="stroke">#00ff00</se:SvgParameter>
|
||||||
|
</se:Stroke>
|
||||||
|
</se:Mark>
|
||||||
|
<se:Size>10</se:Size>
|
||||||
|
<se:Rotation>
|
||||||
|
<ogc:Literal>50</ogc:Literal>
|
||||||
|
</se:Rotation>
|
||||||
|
</se:Graphic>
|
||||||
|
</se:PointSymbolizer>
|
||||||
|
</se:Rule>
|
||||||
|
</se:FeatureTypeStyle>
|
||||||
|
</UserStyle>
|
||||||
|
</NamedLayer>
|
||||||
|
</StyledLayerDescriptor>
|
Loading…
x
Reference in New Issue
Block a user