Skip to content

Commit 5b38262

Browse files
committed
WMS server: advertise additional layer styles in GetCapabilities
1 parent 95b4ebc commit 5b38262

File tree

2 files changed

+121
-90
lines changed

2 files changed

+121
-90
lines changed

src/server/qgswmsprojectparser.cpp

+117-90
Original file line numberDiff line numberDiff line change
@@ -898,6 +898,92 @@ void QgsWMSProjectParser::addDrawingOrder( QDomElement elem, bool useDrawingOrde
898898
}
899899
}
900900

901+
902+
void QgsWMSProjectParser::addLayerStyles( QgsMapLayer* currentLayer, QDomDocument& doc, QDomElement& layerElem, const QString& version ) const
903+
{
904+
foreach ( const QString& styleName, currentLayer->styleManager()->styles() )
905+
{
906+
if ( styleName.isEmpty() )
907+
continue; // do not explicitly list the default style with no name
908+
909+
QDomElement styleElem = doc.createElement( "Style" );
910+
QDomElement styleNameElem = doc.createElement( "Name" );
911+
QDomText styleNameText = doc.createTextNode( styleName );
912+
styleNameElem.appendChild( styleNameText );
913+
QDomElement styleTitleElem = doc.createElement( "Title" );
914+
QDomText styleTitleText = doc.createTextNode( styleName );
915+
styleTitleElem.appendChild( styleTitleText );
916+
styleElem.appendChild( styleNameElem );
917+
styleElem.appendChild( styleTitleElem );
918+
919+
// QString LegendURL for explicit layerbased GetLegendGraphic request
920+
QDomElement getLayerLegendGraphicElem = doc.createElement( "LegendURL" );
921+
QString hrefString = currentLayer->legendUrl();
922+
bool customHrefString;
923+
if ( !hrefString.isEmpty() )
924+
{
925+
customHrefString = true;
926+
}
927+
else
928+
{
929+
customHrefString = false;
930+
hrefString = serviceUrl();
931+
}
932+
if ( hrefString.isEmpty() )
933+
{
934+
hrefString = getCapaServiceUrl( doc );
935+
}
936+
if ( !hrefString.isEmpty() )
937+
{
938+
QStringList getLayerLegendGraphicFormats;
939+
if ( !customHrefString )
940+
{
941+
getLayerLegendGraphicFormats << "image/png"; // << "jpeg" << "image/jpeg"
942+
943+
}
944+
else
945+
{
946+
getLayerLegendGraphicFormats << currentLayer->legendUrlFormat();
947+
}
948+
949+
for ( int i = 0; i < getLayerLegendGraphicFormats.size(); ++i )
950+
{
951+
QDomElement getLayerLegendGraphicFormatElem = doc.createElement( "Format" );
952+
QString getLayerLegendGraphicFormat = getLayerLegendGraphicFormats[i];
953+
QDomText getLayerLegendGraphicFormatText = doc.createTextNode( getLayerLegendGraphicFormat );
954+
getLayerLegendGraphicFormatElem.appendChild( getLayerLegendGraphicFormatText );
955+
getLayerLegendGraphicElem.appendChild( getLayerLegendGraphicFormatElem );
956+
}
957+
958+
// no parameters on custom hrefUrl, because should link directly to graphic
959+
if ( !customHrefString )
960+
{
961+
QUrl mapUrl( hrefString );
962+
mapUrl.addQueryItem( "SERVICE", "WMS" );
963+
mapUrl.addQueryItem( "VERSION", version );
964+
mapUrl.addQueryItem( "REQUEST", "GetLegendGraphic" );
965+
mapUrl.addQueryItem( "LAYER", mProjectParser->useLayerIDs() ? currentLayer->id() : currentLayer->name() );
966+
mapUrl.addQueryItem( "FORMAT", "image/png" );
967+
mapUrl.addQueryItem( "STYLE", styleNameText.data() );
968+
if ( version == "1.3.0" )
969+
{
970+
mapUrl.addQueryItem( "SLD_VERSION", "1.1.0" );
971+
}
972+
hrefString = mapUrl.toString();
973+
}
974+
975+
QDomElement getLayerLegendGraphicORElem = doc.createElement( "OnlineResource" );
976+
getLayerLegendGraphicORElem.setAttribute( "xmlns:xlink", "http://www.w3.org/1999/xlink" );
977+
getLayerLegendGraphicORElem.setAttribute( "xlink:type", "simple" );
978+
getLayerLegendGraphicORElem.setAttribute( "xlink:href", hrefString );
979+
getLayerLegendGraphicElem.appendChild( getLayerLegendGraphicORElem );
980+
styleElem.appendChild( getLayerLegendGraphicElem );
981+
}
982+
layerElem.appendChild( styleElem );
983+
}
984+
}
985+
986+
901987
void QgsWMSProjectParser::addLayers( QDomDocument &doc,
902988
QDomElement &parentLayer,
903989
const QDomElement &legendElem,
@@ -1079,81 +1165,8 @@ void QgsWMSProjectParser::addLayers( QDomDocument &doc,
10791165
QgsConfigParserUtils::appendLayerBoundingBoxes( layerElem, doc, currentLayer->extent(), currentLayer->crs() );
10801166
}
10811167

1082-
//only one default style in project file mode
1083-
QDomElement styleElem = doc.createElement( "Style" );
1084-
QDomElement styleNameElem = doc.createElement( "Name" );
1085-
QDomText styleNameText = doc.createTextNode( "default" );
1086-
styleNameElem.appendChild( styleNameText );
1087-
QDomElement styleTitleElem = doc.createElement( "Title" );
1088-
QDomText styleTitleText = doc.createTextNode( "default" );
1089-
styleTitleElem.appendChild( styleTitleText );
1090-
styleElem.appendChild( styleNameElem );
1091-
styleElem.appendChild( styleTitleElem );
1092-
1093-
// QString LegendURL for explicit layerbased GetLegendGraphic request
1094-
QDomElement getLayerLegendGraphicElem = doc.createElement( "LegendURL" );
1095-
QString hrefString = currentLayer->legendUrl();
1096-
bool customHrefString;
1097-
if ( !hrefString.isEmpty() )
1098-
{
1099-
customHrefString = true;
1100-
}
1101-
else
1102-
{
1103-
customHrefString = false;
1104-
hrefString = serviceUrl();
1105-
}
1106-
if ( hrefString.isEmpty() )
1107-
{
1108-
hrefString = getCapaServiceUrl( doc );
1109-
}
1110-
if ( !hrefString.isEmpty() )
1111-
{
1112-
QStringList getLayerLegendGraphicFormats;
1113-
if ( !customHrefString )
1114-
{
1115-
getLayerLegendGraphicFormats << "image/png"; // << "jpeg" << "image/jpeg"
1116-
1117-
}
1118-
else
1119-
{
1120-
getLayerLegendGraphicFormats << currentLayer->legendUrlFormat();
1121-
}
1122-
1123-
for ( int i = 0; i < getLayerLegendGraphicFormats.size(); ++i )
1124-
{
1125-
QDomElement getLayerLegendGraphicFormatElem = doc.createElement( "Format" );
1126-
QString getLayerLegendGraphicFormat = getLayerLegendGraphicFormats[i];
1127-
QDomText getLayerLegendGraphicFormatText = doc.createTextNode( getLayerLegendGraphicFormat );
1128-
getLayerLegendGraphicFormatElem.appendChild( getLayerLegendGraphicFormatText );
1129-
getLayerLegendGraphicElem.appendChild( getLayerLegendGraphicFormatElem );
1130-
}
1131-
1132-
// no parameters on custom hrefUrl, because should link directly to graphic
1133-
if ( !customHrefString )
1134-
{
1135-
QUrl mapUrl( hrefString );
1136-
mapUrl.addQueryItem( "SERVICE", "WMS" );
1137-
mapUrl.addQueryItem( "VERSION", version );
1138-
mapUrl.addQueryItem( "REQUEST", "GetLegendGraphic" );
1139-
mapUrl.addQueryItem( "LAYER", mProjectParser->useLayerIDs() ? currentLayer->id() : currentLayer->name() );
1140-
mapUrl.addQueryItem( "FORMAT", "image/png" );
1141-
mapUrl.addQueryItem( "STYLE", styleNameText.data() );
1142-
if ( version == "1.3.0" )
1143-
{
1144-
mapUrl.addQueryItem( "SLD_VERSION", "1.1.0" );
1145-
}
1146-
hrefString = mapUrl.toString();
1147-
}
1148-
1149-
QDomElement getLayerLegendGraphicORElem = doc.createElement( "OnlineResource" );
1150-
getLayerLegendGraphicORElem.setAttribute( "xmlns:xlink", "http://www.w3.org/1999/xlink" );
1151-
getLayerLegendGraphicORElem.setAttribute( "xlink:type", "simple" );
1152-
getLayerLegendGraphicORElem.setAttribute( "xlink:href", hrefString );
1153-
getLayerLegendGraphicElem.appendChild( getLayerLegendGraphicORElem );
1154-
styleElem.appendChild( getLayerLegendGraphicElem );
1155-
}
1156-
layerElem.appendChild( styleElem );
1168+
// add details about supported styles of the layer
1169+
addLayerStyles( currentLayer, doc, layerElem, version );
11571170

11581171
//min/max scale denominatormScaleBasedVisibility
11591172
if ( currentLayer->hasScaleBasedVisibility() )
@@ -1276,6 +1289,33 @@ void QgsWMSProjectParser::addLayers( QDomDocument &doc,
12761289
}
12771290
}
12781291

1292+
1293+
void QgsWMSProjectParser::addOWSLayerStyles( QgsMapLayer* currentLayer, QDomDocument& doc, QDomElement& layerElem ) const
1294+
{
1295+
foreach ( const QString& styleName, currentLayer->styleManager()->styles() )
1296+
{
1297+
if ( styleName.isEmpty() )
1298+
continue; // do not explicitly list the default style with no name
1299+
1300+
QDomElement styleListElem = doc.createElement( "StyleList" );
1301+
//only one default style in project file mode
1302+
QDomElement styleElem = doc.createElement( "Style" );
1303+
styleElem.setAttribute( "current", "true" );
1304+
QDomElement styleNameElem = doc.createElement( "Name" );
1305+
QDomText styleNameText = doc.createTextNode( styleName );
1306+
styleNameElem.appendChild( styleNameText );
1307+
QDomElement styleTitleElem = doc.createElement( "Title" );
1308+
QDomText styleTitleText = doc.createTextNode( styleName );
1309+
styleTitleElem.appendChild( styleTitleText );
1310+
styleElem.appendChild( styleNameElem );
1311+
styleElem.appendChild( styleTitleElem );
1312+
styleListElem.appendChild( styleElem );
1313+
layerElem.appendChild( styleListElem );
1314+
}
1315+
}
1316+
1317+
1318+
12791319
void QgsWMSProjectParser::addOWSLayers( QDomDocument &doc,
12801320
QDomElement &parentElem,
12811321
const QDomElement &legendElem,
@@ -1475,20 +1515,7 @@ void QgsWMSProjectParser::addOWSLayers( QDomDocument &doc,
14751515
combinedBBox.combineExtentWith( &BBox );
14761516
}
14771517

1478-
QDomElement styleListElem = doc.createElement( "StyleList" );
1479-
//only one default style in project file mode
1480-
QDomElement styleElem = doc.createElement( "Style" );
1481-
styleElem.setAttribute( "current", "true" );
1482-
QDomElement styleNameElem = doc.createElement( "Name" );
1483-
QDomText styleNameText = doc.createTextNode( "default" );
1484-
styleNameElem.appendChild( styleNameText );
1485-
QDomElement styleTitleElem = doc.createElement( "Title" );
1486-
QDomText styleTitleText = doc.createTextNode( "default" );
1487-
styleTitleElem.appendChild( styleTitleText );
1488-
styleElem.appendChild( styleNameElem );
1489-
styleElem.appendChild( styleTitleElem );
1490-
styleListElem.appendChild( styleElem );
1491-
layerElem.appendChild( styleListElem );
1518+
addOWSLayerStyles( currentLayer, doc, layerElem );
14921519

14931520
//keyword list
14941521
if ( !currentLayer->keywordList().isEmpty() )
@@ -1568,7 +1595,7 @@ int QgsWMSProjectParser::layersAndStyles( QStringList& layers, QStringList& styl
15681595
if ( !currentLayerName.isNull() )
15691596
{
15701597
layers << currentLayerName;
1571-
styles << "default";
1598+
styles << QString();
15721599
}
15731600
}
15741601
return 0;

src/server/qgswmsprojectparser.h

+4
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ class QgsWMSProjectParser : public QgsWMSConfigParser
132132
/**Adds drawing order info from embedded layer element or embedded group element (recursive)*/
133133
void addDrawingOrderEmbeddedGroup( QDomElement groupElem, bool useDrawingOrder, QMap<int, QString>& orderedLayerList ) const;
134134

135+
void addLayerStyles(QgsMapLayer* currentLayer, QDomDocument& doc, QDomElement& layerElem, const QString& version ) const;
136+
135137
void addLayers( QDomDocument &doc,
136138
QDomElement &parentLayer,
137139
const QDomElement &legendElem,
@@ -140,6 +142,8 @@ class QgsWMSProjectParser : public QgsWMSConfigParser
140142
QString version, //1.1.1 or 1.3.0
141143
bool fullProjectSettings = false ) const;
142144

145+
void addOWSLayerStyles( QgsMapLayer* currentLayer, QDomDocument& doc, QDomElement& layerElem ) const;
146+
143147
void addOWSLayers( QDomDocument &doc, QDomElement &parentElem, const QDomElement &legendElem,
144148
const QMap<QString, QgsMapLayer *> &layerMap, const QStringList &nonIdentifiableLayers,
145149
const QString& strHref, QgsRectangle& combinedBBox, QString strGroup ) const;

0 commit comments

Comments
 (0)