Fix skipping empty highlight label settings in GetPrint and GetMap

This commit is contained in:
Marco Hugentobler 2025-01-17 09:15:55 +01:00
parent 9059f200a0
commit 323f0bc6f8
7 changed files with 103 additions and 63 deletions

View File

@ -70,42 +70,46 @@ Converts the parameter into a list of strings
:return: A list of strings
%End
QList<int> toIntList( bool &ok, char delimiter = ',' ) const;
QList<int> toIntList( bool &ok, char delimiter = ',', bool skipEmptyParts = true ) const;
%Docstring
Converts the parameter into a list of integers.
:param ok: ``True`` if there's no error during the conversion, ``False`` otherwise
:param delimiter: The character used for delimiting
:param skipEmptyParts: for splitting
:return: A list of integers
%End
QList<double> toDoubleList( bool &ok, char delimiter = ',' ) const;
QList<double> toDoubleList( bool &ok, char delimiter = ',', bool skipEmptyParts = true ) const;
%Docstring
Converts the parameter into a list of doubles.
:param ok: ``True`` if there's no error during the conversion, ``False`` otherwise
:param delimiter: The character used for delimiting
:param skipEmptyParts: for splitting
:return: A list of doubles
%End
QList<QColor> toColorList( bool &ok, char delimiter = ',' ) const;
QList<QColor> toColorList( bool &ok, char delimiter = ',', bool skipEmptyParts = true ) const;
%Docstring
Converts the parameter into a list of colors.
:param ok: ``True`` if there's no error during the conversion, ``False`` otherwise
:param delimiter: The character used for delimiting
:param skipEmptyParts: for splitting
:return: A list of colors
%End
QList<QgsGeometry> toGeomList( bool &ok, char delimiter = ',' ) const;
QList<QgsGeometry> toGeomList( bool &ok, char delimiter = ',', bool skipEmptyParts = true ) const;
%Docstring
Converts the parameter into a list of geometries.
:param ok: ``True`` if there's no error during the conversion, ``False`` otherwise
:param delimiter: The character used for delimiting
:param skipEmptyParts: for splitting
:return: A list of geometries
%End

View File

@ -70,42 +70,46 @@ Converts the parameter into a list of strings
:return: A list of strings
%End
QList<int> toIntList( bool &ok, char delimiter = ',' ) const;
QList<int> toIntList( bool &ok, char delimiter = ',', bool skipEmptyParts = true ) const;
%Docstring
Converts the parameter into a list of integers.
:param ok: ``True`` if there's no error during the conversion, ``False`` otherwise
:param delimiter: The character used for delimiting
:param skipEmptyParts: for splitting
:return: A list of integers
%End
QList<double> toDoubleList( bool &ok, char delimiter = ',' ) const;
QList<double> toDoubleList( bool &ok, char delimiter = ',', bool skipEmptyParts = true ) const;
%Docstring
Converts the parameter into a list of doubles.
:param ok: ``True`` if there's no error during the conversion, ``False`` otherwise
:param delimiter: The character used for delimiting
:param skipEmptyParts: for splitting
:return: A list of doubles
%End
QList<QColor> toColorList( bool &ok, char delimiter = ',' ) const;
QList<QColor> toColorList( bool &ok, char delimiter = ',', bool skipEmptyParts = true ) const;
%Docstring
Converts the parameter into a list of colors.
:param ok: ``True`` if there's no error during the conversion, ``False`` otherwise
:param delimiter: The character used for delimiting
:param skipEmptyParts: for splitting
:return: A list of colors
%End
QList<QgsGeometry> toGeomList( bool &ok, char delimiter = ',' ) const;
QList<QgsGeometry> toGeomList( bool &ok, char delimiter = ',', bool skipEmptyParts = true ) const;
%Docstring
Converts the parameter into a list of geometries.
:param ok: ``True`` if there's no error during the conversion, ``False`` otherwise
:param delimiter: The character used for delimiting
:param skipEmptyParts: for splitting
:return: A list of geometries
%End

View File

@ -95,12 +95,12 @@ QStringList QgsServerParameterDefinition::toStringList( const char delimiter, co
}
}
QList<QgsGeometry> QgsServerParameterDefinition::toGeomList( bool &ok, const char delimiter ) const
QList<QgsGeometry> QgsServerParameterDefinition::toGeomList( bool &ok, const char delimiter, const bool skipEmptyParts ) const
{
ok = true;
QList<QgsGeometry> geoms;
const auto constStringList( toStringList( delimiter ) );
const auto constStringList( toStringList( delimiter, skipEmptyParts ) );
for ( const auto &wkt : constStringList )
{
const QgsGeometry g( QgsGeometry::fromWkt( wkt ) );
@ -202,12 +202,12 @@ QStringList QgsServerParameterDefinition::toExpressionList() const
return filters;
}
QList<QColor> QgsServerParameterDefinition::toColorList( bool &ok, const char delimiter ) const
QList<QColor> QgsServerParameterDefinition::toColorList( bool &ok, const char delimiter, bool skipEmptyParts ) const
{
ok = true;
QList<QColor> colors;
const auto constStringList( toStringList( delimiter ) );
const auto constStringList( toStringList( delimiter, skipEmptyParts ) );
for ( const auto &part : constStringList )
{
QString cStr( part );
@ -234,12 +234,12 @@ QList<QColor> QgsServerParameterDefinition::toColorList( bool &ok, const char de
return colors;
}
QList<int> QgsServerParameterDefinition::toIntList( bool &ok, const char delimiter ) const
QList<int> QgsServerParameterDefinition::toIntList( bool &ok, const char delimiter, bool skipEmptyParts ) const
{
ok = true;
QList<int> ints;
const auto constStringList( toStringList( delimiter ) );
const auto constStringList( toStringList( delimiter, skipEmptyParts ) );
for ( const auto &part : constStringList )
{
const int val = part.toInt( &ok );
@ -255,12 +255,12 @@ QList<int> QgsServerParameterDefinition::toIntList( bool &ok, const char delimit
return ints;
}
QList<double> QgsServerParameterDefinition::toDoubleList( bool &ok, const char delimiter ) const
QList<double> QgsServerParameterDefinition::toDoubleList( bool &ok, const char delimiter, bool skipEmptyParts ) const
{
ok = true;
QList<double> vals;
const auto constStringList( toStringList( delimiter ) );
const auto constStringList( toStringList( delimiter, skipEmptyParts ) );
for ( const auto &part : constStringList )
{
const double val = part.toDouble( &ok );

View File

@ -80,33 +80,37 @@ class SERVER_EXPORT QgsServerParameterDefinition
* Converts the parameter into a list of integers.
* \param ok TRUE if there's no error during the conversion, FALSE otherwise
* \param delimiter The character used for delimiting
* \param skipEmptyParts for splitting
* \returns A list of integers
*/
QList<int> toIntList( bool &ok, char delimiter = ',' ) const;
QList<int> toIntList( bool &ok, char delimiter = ',', bool skipEmptyParts = true ) const;
/**
* Converts the parameter into a list of doubles.
* \param ok TRUE if there's no error during the conversion, FALSE otherwise
* \param delimiter The character used for delimiting
* \param skipEmptyParts for splitting
* \returns A list of doubles
*/
QList<double> toDoubleList( bool &ok, char delimiter = ',' ) const;
QList<double> toDoubleList( bool &ok, char delimiter = ',', bool skipEmptyParts = true ) const;
/**
* Converts the parameter into a list of colors.
* \param ok TRUE if there's no error during the conversion, FALSE otherwise
* \param delimiter The character used for delimiting
* \param skipEmptyParts for splitting
* \returns A list of colors
*/
QList<QColor> toColorList( bool &ok, char delimiter = ',' ) const;
QList<QColor> toColorList( bool &ok, char delimiter = ',', bool skipEmptyParts = true ) const;
/**
* Converts the parameter into a list of geometries.
* \param ok TRUE if there's no error during the conversion, FALSE otherwise
* \param delimiter The character used for delimiting
* \param skipEmptyParts for splitting
* \returns A list of geometries
*/
QList<QgsGeometry> toGeomList( bool &ok, char delimiter = ',' ) const;
QList<QgsGeometry> toGeomList( bool &ok, char delimiter = ',', bool skipEmptyParts = true ) const;
/**
* Converts the parameter into a list of OGC filters.

View File

@ -49,15 +49,15 @@ namespace QgsWms
QgsServerParameterDefinition::raiseError( msg );
}
QStringList QgsWmsParameter::toStyleList( const char delimiter ) const
QStringList QgsWmsParameter::toStyleList( const char delimiter, bool skipEmptyParts ) const
{
return QgsServerParameterDefinition::toStringList( delimiter, false );
return QgsServerParameterDefinition::toStringList( delimiter, skipEmptyParts );
}
QList<QgsGeometry> QgsWmsParameter::toGeomList( const char delimiter ) const
QList<QgsGeometry> QgsWmsParameter::toGeomList( const char delimiter, bool skipEmptyParts ) const
{
bool ok = true;
const QList<QgsGeometry> geoms = QgsServerParameterDefinition::toGeomList( ok, delimiter );
const QList<QgsGeometry> geoms = QgsServerParameterDefinition::toGeomList( ok, delimiter, skipEmptyParts );
if ( !ok )
{
@ -138,10 +138,10 @@ namespace QgsWms
return col;
}
QList<QColor> QgsWmsParameter::toColorList( const char delimiter ) const
QList<QColor> QgsWmsParameter::toColorList( const char delimiter, bool skipEmptyParts ) const
{
bool ok = false;
const QList<QColor> vals = QgsServerParameterDefinition::toColorList( ok, delimiter );
const QList<QColor> vals = QgsServerParameterDefinition::toColorList( ok, delimiter, skipEmptyParts );
if ( !ok )
{
@ -152,10 +152,10 @@ namespace QgsWms
return vals;
}
QList<int> QgsWmsParameter::toIntList( const char delimiter ) const
QList<int> QgsWmsParameter::toIntList( const char delimiter, bool skipEmptyParts ) const
{
bool ok = false;
const QList<int> vals = QgsServerParameterDefinition::toIntList( ok, delimiter );
const QList<int> vals = QgsServerParameterDefinition::toIntList( ok, delimiter, skipEmptyParts );
if ( !ok )
{
@ -166,10 +166,10 @@ namespace QgsWms
return vals;
}
QList<double> QgsWmsParameter::toDoubleList( const char delimiter ) const
QList<double> QgsWmsParameter::toDoubleList( const char delimiter, bool skipEmptyParts ) const
{
bool ok = false;
const QList<double> vals = QgsServerParameterDefinition::toDoubleList( ok, delimiter );
const QList<double> vals = QgsServerParameterDefinition::toDoubleList( ok, delimiter, skipEmptyParts );
if ( !ok )
{
@ -1271,77 +1271,77 @@ namespace QgsWms
QStringList QgsWmsParameters::highlightLabelSize() const
{
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELSIZE ).toStringList( ';' );
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELSIZE ).toStringList( ';', false );
}
QList<int> QgsWmsParameters::highlightLabelSizeAsInt() const
{
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELSIZE ).toIntList( ';' );
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELSIZE ).toIntList( ';', false );
}
QStringList QgsWmsParameters::highlightLabelColor() const
{
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELCOLOR ).toStringList( ';' );
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELCOLOR ).toStringList( ';', false );
}
QList<QColor> QgsWmsParameters::highlightLabelColorAsColor() const
{
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELCOLOR ).toColorList( ';' );
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELCOLOR ).toColorList( ';', false );
}
QStringList QgsWmsParameters::highlightLabelWeight() const
{
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELWEIGHT ).toStringList( ';' );
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELWEIGHT ).toStringList( ';', false );
}
QList<int> QgsWmsParameters::highlightLabelWeightAsInt() const
{
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELWEIGHT ).toIntList( ';' );
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELWEIGHT ).toIntList( ';', false );
}
QStringList QgsWmsParameters::highlightLabelFont() const
{
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELFONT ).toStringList( ';' );
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELFONT ).toStringList( ';', false );
}
QStringList QgsWmsParameters::highlightLabelBufferColor() const
{
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELBUFFERCOLOR ).toStringList( ';' );
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELBUFFERCOLOR ).toStringList( ';', false );
}
QList<QColor> QgsWmsParameters::highlightLabelBufferColorAsColor() const
{
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELBUFFERCOLOR ).toColorList( ';' );
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELBUFFERCOLOR ).toColorList( ';', false );
}
QStringList QgsWmsParameters::highlightLabelBufferSize() const
{
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELBUFFERSIZE ).toStringList( ';' );
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELBUFFERSIZE ).toStringList( ';', false );
}
QList<double> QgsWmsParameters::highlightLabelBufferSizeAsFloat() const
{
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELBUFFERSIZE ).toDoubleList( ';' );
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABELBUFFERSIZE ).toDoubleList( ';', false );
}
QList<double> QgsWmsParameters::highlightLabelRotation() const
{
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABEL_ROTATION ).toDoubleList( ';' );
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABEL_ROTATION ).toDoubleList( ';', false );
}
QList<double> QgsWmsParameters::highlightLabelDistance() const
{
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABEL_DISTANCE ).toDoubleList( ';' );
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABEL_DISTANCE ).toDoubleList( ';', false );
}
QStringList QgsWmsParameters::highlightLabelHorizontalAlignment() const
{
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABEL_HORIZONTAL_ALIGNMENT ).toStringList( ';' );
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABEL_HORIZONTAL_ALIGNMENT ).toStringList( ';', false );
}
QStringList QgsWmsParameters::highlightLabelVerticalAlignment() const
{
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABEL_VERTICAL_ALIGNMENT ).toStringList( ';' );
return mWmsParameters.value( QgsWmsParameter::HIGHLIGHT_LABEL_VERTICAL_ALIGNMENT ).toStringList( ';', false );
}
QString QgsWmsParameters::wmsPrecision() const
@ -1806,91 +1806,91 @@ namespace QgsWms
wmsParam = idParameter( QgsWmsParameter::HIGHLIGHT_GEOM, mapId );
if ( wmsParam.isValid() )
{
geoms = wmsParam.toGeomList( ';' );
geoms = wmsParam.toGeomList( ';', false );
}
QStringList slds;
wmsParam = idParameter( QgsWmsParameter::HIGHLIGHT_SYMBOL, mapId );
if ( wmsParam.isValid() )
{
slds = wmsParam.toStringList( ';' );
slds = wmsParam.toStringList( ';', false );
}
QStringList labels;
wmsParam = idParameter( QgsWmsParameter::HIGHLIGHT_LABELSTRING, mapId );
if ( wmsParam.isValid() )
{
labels = wmsParam.toStringList( ';' );
labels = wmsParam.toStringList( ';', false );
}
QStringList fonts;
wmsParam = idParameter( QgsWmsParameter::HIGHLIGHT_LABELFONT, mapId );
if ( wmsParam.isValid() )
{
fonts = wmsParam.toStringList( ';' );
fonts = wmsParam.toStringList( ';', false );
}
QList<QColor> colors;
wmsParam = idParameter( QgsWmsParameter::HIGHLIGHT_LABELCOLOR, mapId );
if ( wmsParam.isValid() )
{
colors = wmsParam.toColorList( ';' );
colors = wmsParam.toColorList( ';', false );
}
QList<int> sizes;
wmsParam = idParameter( QgsWmsParameter::HIGHLIGHT_LABELSIZE, mapId );
if ( wmsParam.isValid() )
{
sizes = wmsParam.toIntList( ';' );
sizes = wmsParam.toIntList( ';', false );
}
QList<int> weights;
wmsParam = idParameter( QgsWmsParameter::HIGHLIGHT_LABELWEIGHT, mapId );
if ( wmsParam.isValid() )
{
weights = wmsParam.toIntList( ';' );
weights = wmsParam.toIntList( ';', false );
}
QList<QColor> bufferColors;
wmsParam = idParameter( QgsWmsParameter::HIGHLIGHT_LABELBUFFERCOLOR, mapId );
if ( wmsParam.isValid() )
{
bufferColors = wmsParam.toColorList( ';' );
bufferColors = wmsParam.toColorList( ';', false );
}
QList<double> bufferSizes;
wmsParam = idParameter( QgsWmsParameter::HIGHLIGHT_LABELBUFFERSIZE, mapId );
if ( wmsParam.isValid() )
{
bufferSizes = wmsParam.toDoubleList( ';' );
bufferSizes = wmsParam.toDoubleList( ';', false );
}
QList<double> rotations;
wmsParam = idParameter( QgsWmsParameter::HIGHLIGHT_LABEL_ROTATION, mapId );
if ( wmsParam.isValid() )
{
rotations = wmsParam.toDoubleList( ';' );
rotations = wmsParam.toDoubleList( ';', false );
}
QList<double> distances;
wmsParam = idParameter( QgsWmsParameter::HIGHLIGHT_LABEL_DISTANCE, mapId );
if ( wmsParam.isValid() )
{
distances = wmsParam.toDoubleList( ';' );
distances = wmsParam.toDoubleList( ';', false );
}
QStringList halis;
wmsParam = idParameter( QgsWmsParameter::HIGHLIGHT_LABEL_HORIZONTAL_ALIGNMENT, mapId );
if ( wmsParam.isValid() )
{
halis = wmsParam.toStringList();
halis = wmsParam.toStringList( ';', false );
}
QStringList valis;
wmsParam = idParameter( QgsWmsParameter::HIGHLIGHT_LABEL_VERTICAL_ALIGNMENT, mapId );
if ( wmsParam.isValid() )
{
valis = wmsParam.toStringList();
valis = wmsParam.toStringList( ';', false );
}
int nHLayers = std::min( geoms.size(), slds.size() );

View File

@ -214,42 +214,47 @@ namespace QgsWms
* Converts the parameter into a list of strings and keeps empty parts
* Default style value is an empty string
* \param delimiter The character used for delimiting
* \param skipEmptyParts for splitting
* \returns A list of strings
* \since QGIS 3.8
*/
QStringList toStyleList( const char delimiter = ',' ) const;
QStringList toStyleList( const char delimiter = ',', bool skipEmptyParts = true ) const;
/**
* Converts the parameter into a list of geometries.
* \param delimiter The character delimiting string geometries
* \param skipEmptyParts for splitting
* \returns A list of geometries
* \throws QgsBadRequestException Invalid parameter exception
*/
QList<QgsGeometry> toGeomList( const char delimiter = ',' ) const;
QList<QgsGeometry> toGeomList( const char delimiter = ',', bool skipEmptyParts = true ) const;
/**
* Converts the parameter into a list of integers.
* \param delimiter The character delimiting string integers
* \param skipEmptyParts for splitting
* \returns A list of integers
* \throws QgsBadRequestException Invalid parameter exception
*/
QList<int> toIntList( const char delimiter = ',' ) const;
QList<int> toIntList( const char delimiter = ',', bool skipEmptyParts = true ) const;
/**
* Converts the parameter into a list of doubles.
* \param delimiter The character delimiting string doubles
* \param skipEmptyParts for splitting
* \returns A list of doubles
* \throws QgsBadRequestException Invalid parameter exception
*/
QList<double> toDoubleList( const char delimiter = ',' ) const;
QList<double> toDoubleList( const char delimiter = ',', bool skipEmptyParts = true ) const;
/**
* Converts the parameter into a list of colors.
* \param delimiter The character delimiting string colors
* \param skipEmptyParts for splitting
* \returns A list of colors
* \throws QgsBadRequestException Invalid parameter exception
*/
QList<QColor> toColorList( const char delimiter = ',' ) const;
QList<QColor> toColorList( const char delimiter = ',', bool skipEmptyParts = true ) const;
/**
* Converts the parameter into a rectangle.

View File

@ -526,6 +526,29 @@ class TestQgsServerWMSGetPrint(QgsServerTestBase):
r, h = self._result(self._execute_request(qs))
self._img_diff_error(r, h, "WMS_GetPrint_External")
def test_wms_getprint_highlight_empty_labels(self):
# Checks if the empty label for Eurasia is correctly handled. Otherwise the highlight point for Eurasia would be labeled as Africa
qs = "?" + "&".join(["%s=%s" % i for i in list({
"MAP": urllib.parse.quote(self.projectPath),
"SERVICE": "WMS",
"VERSION": "1.1.1",
"REQUEST": "GetMap",
"LAYERS": "Country",
"map0:HIGHLIGHT_GEOM": "POINT(-4000000 12215266);POINT(3271207 6832268);POINT(2360238 1035192)",
"map0:HIGHLIGHT_LABELSTRING": "Arctic;;Africa",
"map0HIGHLIGHT_SYMBOL": "<?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\"><UserStyle><se:FeatureTypeStyle><se:Rule><se:PointSymbolizer><se:Graphic><se:Mark><se:WellKnownName>circle</se:WellKnownName><se:Stroke><se:SvgParameter name=\"stroke\">%23ff0000</se:SvgParameter><se:SvgParameter name=\"stroke-opacity\">1</se:SvgParameter><se:SvgParameter name=\"stroke-width\">7.5</se:SvgParameter></se:Stroke><se:Fill><se:SvgParameter name=\"fill\">%237bdcb5</se:SvgParameter><se:SvgParameter name=\"fill-opacity\">1</se:SvgParameter></se:Fill></se:Mark><se:Size>28.4</se:Size></se:Graphic></se:PointSymbolizer></se:Rule></se:FeatureTypeStyle></UserStyle></StyledLayerDescriptor>;<?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\"><UserStyle><se:FeatureTypeStyle><se:Rule><se:PointSymbolizer><se:Graphic><se:Mark><se:WellKnownName>circle</se:WellKnownName><se:Stroke><se:SvgParameter name=\"stroke\">%23ff0000</se:SvgParameter><se:SvgParameter name=\"stroke-opacity\">1</se:SvgParameter><se:SvgParameter name=\"stroke-width\">7.5</se:SvgParameter></se:Stroke><se:Fill><se:SvgParameter name=\"fill\">%237bdcb5</se:SvgParameter><se:SvgParameter name=\"fill-opacity\">1</se:SvgParameter></se:Fill></se:Mark><se:Size>28.4</se:Size></se:Graphic></se:PointSymbolizer></se:Rule></se:FeatureTypeStyle></UserStyle></StyledLayerDescriptor>;<?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\"><UserStyle><se:FeatureTypeStyle><se:Rule><se:PointSymbolizer><se:Graphic><se:Mark><se:WellKnownName>circle</se:WellKnownName><se:Stroke><se:SvgParameter name=\"stroke\">%23ff0000</se:SvgParameter><se:SvgParameter name=\"stroke-opacity\">1</se:SvgParameter><se:SvgParameter name=\"stroke-width\">7.5</se:SvgParameter></se:Stroke><se:Fill><se:SvgParameter name=\"fill\">%237bdcb5</se:SvgParameter><se:SvgParameter name=\"fill-opacity\">1</se:SvgParameter></se:Fill></se:Mark><se:Size>28.4</se:Size></se:Graphic></se:PointSymbolizer></se:Rule></se:FeatureTypeStyle></UserStyle></StyledLayerDescriptor>",
"map0:HIGHLIGHT_LABELSIZE": "16;16;16",
"map0:HIGHLIGHT_LABELCOLOR": "red;red;red",
"map0:HIGHLIGHT_LABELBUFFERCOLOR": "white;white;white",
"map0:HIGHLIGHT_LABELBUFFERSIZE": "1;1;1",
"map0:STYLES": "",
"FORMAT": "image/png",
"map0:EXTENT": "-16817707,-4710778,5696513,14587125",
"CRS": "EPSG:3857"
}.items())])
r, h = self._result(self._execute_request(qs))
self._img_diff_error(r, h, "WMS_GetPrint_Highlight_Empty_Labels")
if __name__ == "__main__":
unittest.main()