49 if ( !parameters.contains( u
"SLD_VERSION"_s ) )
51 throw QgsServiceException( u
"MissingParameterValue"_s, u
"SLD_VERSION is mandatory for DescribeLayer operation"_s, 400 );
53 if ( parameters[u
"SLD_VERSION"_s] !=
"1.1.0"_L1 )
55 throw QgsServiceException( u
"InvalidParameterValue"_s, u
"SLD_VERSION = %1 is not supported"_s.arg( parameters[u
"SLD_VERSION"_s] ), 400 );
58 if ( !parameters.contains( u
"LAYERS"_s ) && !parameters.contains( u
"LAYER"_s ) )
60 throw QgsServiceException( u
"MissingParameterValue"_s, u
"LAYERS or LAYER is mandatory for DescribeLayer operation"_s, 400 );
63 QStringList layersList;
65 if ( parameters.contains( u
"LAYERS"_s ) )
67 layersList = parameters[u
"LAYERS"_s].split(
',', Qt::SkipEmptyParts );
71 layersList = parameters[u
"LAYER"_s].split(
',', Qt::SkipEmptyParts );
73 if ( layersList.isEmpty() )
79 QHash<const QgsMapLayer *, QStringList> acceptableLayersAndRequestNames;
81 auto firstFoundInacceptableLayer = std::find_if( layersList.cbegin(), layersList.cend(), [&](
const QString &layerName ) {
83 return !std::any_of( acceptableLayersAndRequestNames.cbegin(), acceptableLayersAndRequestNames.cend(), [&]( const QStringList &requestedNames ) { return requestedNames.contains( layerName ); } );
85 if ( firstFoundInacceptableLayer != layersList.cend() )
88 param.mValue = *firstFoundInacceptableLayer;
92 QDomDocument myDocument = QDomDocument();
94 const QDomNode header = myDocument.createProcessingInstruction( u
"xml"_s, u
"version=\"1.0\" encoding=\"UTF-8\""_s );
95 myDocument.appendChild( header );
98 QDomElement root = myDocument.createElementNS( u
"http://www.opengis.net/sld"_s, u
"DescribeLayerResponse"_s );
99 root.setAttribute( u
"xsi:schemaLocation"_s, u
"http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/DescribeLayer.xsd"_s );
100 root.setAttribute( u
"xmlns:ows"_s, u
"http://www.opengis.net/ows"_s );
101 root.setAttribute( u
"xmlns:se"_s, u
"http://www.opengis.net/se"_s );
102 root.setAttribute( u
"xmlns:xlink"_s, u
"http://www.w3.org/1999/xlink"_s );
103 root.setAttribute( u
"xmlns:xsi"_s, u
"http://www.w3.org/2001/XMLSchema-instance"_s );
104 myDocument.appendChild( root );
107 QDomElement versionNode = myDocument.createElement( u
"Version"_s );
108 versionNode.appendChild( myDocument.createTextNode( u
"1.1.0"_s ) );
109 root.appendChild( versionNode );
113 const QString wmsHrefString =
serviceUrl( request, project, *serverIface->serverSettings() ).toString();
118 if ( wfsHrefString.isEmpty() )
120 wfsHrefString = wmsHrefString;
126 if ( wcsHrefString.isEmpty() )
128 wcsHrefString = wmsHrefString;
132#ifdef HAVE_SERVER_PYTHON_PLUGINS
133 QgsAccessControl *accessControl = serverIface->accessControls();
135 ( void ) serverIface;
147 for ( QgsMapLayer *layer : project->mapLayers() )
149 QString name = layer->name();
152 else if ( !layer->serverProperties()->shortName().isEmpty() )
153 name = layer->serverProperties()->shortName();
155 if ( !layersList.contains( name ) )
161 if ( restrictedLayers.contains( layer->name() ) )
166#ifdef HAVE_SERVER_PYTHON_PLUGINS
174 QDomElement layerNode = myDocument.createElement( u
"LayerDescription"_s );
175 root.appendChild( layerNode );
178 QDomElement typeNode = myDocument.createElement( u
"owsType"_s );
180 QDomElement oResNode = myDocument.createElement( u
"se:OnlineResource"_s );
181 oResNode.setAttribute( u
"xlink:type"_s, u
"simple"_s );
183 QDomElement nameNode = myDocument.createElement( u
"TypeName"_s );
184 switch ( layer->type() )
188 typeNode.appendChild( myDocument.createTextNode( u
"wfs"_s ) );
190 if ( wfsLayerIds.indexOf( layer->id() ) != -1 )
192 oResNode.setAttribute( u
"xlink:href"_s, wfsHrefString );
196 QDomElement typeNameNode = myDocument.createElement( u
"se:FeatureTypeName"_s );
197 typeNameNode.appendChild( myDocument.createTextNode( name ) );
198 nameNode.appendChild( typeNameNode );
203 typeNode.appendChild( myDocument.createTextNode( u
"wcs"_s ) );
205 if ( wcsLayerIds.indexOf( layer->id() ) != -1 )
207 oResNode.setAttribute( u
"xlink:href"_s, wcsHrefString );
211 QDomElement typeNameNode = myDocument.createElement( u
"se:CoverageTypeName"_s );
212 typeNameNode.appendChild( myDocument.createTextNode( name ) );
213 nameNode.appendChild( typeNameNode );
226 layerNode.appendChild( typeNode );
227 layerNode.appendChild( oResNode );
228 layerNode.appendChild( nameNode );