Skip to content

Commit 67d541c

Browse files
committedNov 2, 2015
[QGIS-Server] More ISO compatibility for WxS capabilities
* Add ISO keyword for the service * Default Fees is conditions unknown * Default AccessConstraints is None * Calculate boundingBox for all CRSes
1 parent 584c86d commit 67d541c

File tree

5 files changed

+107
-26
lines changed

5 files changed

+107
-26
lines changed
 

‎src/server/qgsconfigparserutils.cpp

Lines changed: 73 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ void QgsConfigParserUtils::appendCRSElementToLayer( QDomElement& layerElement, c
7878
}
7979

8080
void QgsConfigParserUtils::appendLayerBoundingBoxes( QDomElement& layerElem, QDomDocument& doc, const QgsRectangle& layerExtent,
81-
const QgsCoordinateReferenceSystem& layerCRS )
81+
const QgsCoordinateReferenceSystem& layerCRS, const QStringList &crsList, const QStringList& constrainedCrsList )
8282
{
8383
if ( layerElem.isNull() )
8484
{
@@ -123,7 +123,7 @@ void QgsConfigParserUtils::appendLayerBoundingBoxes( QDomElement& layerElem, QDo
123123
ExGeoBBoxElement.appendChild( nBoundLatitudeElement );
124124
}
125125

126-
126+
/*
127127
//BoundingBox element
128128
QDomElement bBoxElement = doc.createElement( "BoundingBox" );
129129
if ( layerCRS.isValid() )
@@ -141,17 +141,86 @@ void QgsConfigParserUtils::appendLayerBoundingBoxes( QDomElement& layerElem, QDo
141141
bBoxElement.setAttribute( "miny", QString::number( r.yMinimum() ) );
142142
bBoxElement.setAttribute( "maxx", QString::number( r.xMaximum() ) );
143143
bBoxElement.setAttribute( "maxy", QString::number( r.yMaximum() ) );
144+
*/
144145

145146
QDomElement lastCRSElem = layerElem.lastChildElement( version == "1.1.1" ? "SRS" : "CRS" );
146147
if ( !lastCRSElem.isNull() )
147148
{
148149
layerElem.insertAfter( ExGeoBBoxElement, lastCRSElem );
149-
layerElem.insertAfter( bBoxElement, ExGeoBBoxElement );
150+
//layerElem.insertAfter( bBoxElement, ExGeoBBoxElement );
150151
}
151152
else
152153
{
153154
layerElem.appendChild( ExGeoBBoxElement );
154-
layerElem.appendChild( bBoxElement );
155+
//layerElem.appendChild( bBoxElement );
156+
}
157+
158+
//In case the number of advertised CRS is constrained
159+
if ( constrainedCrsList.size() > 0 )
160+
{
161+
for ( int i = constrainedCrsList.size() - 1; i >= 0; --i )
162+
{
163+
appendLayerBoundingBox( layerElem, doc, layerExtent, layerCRS, constrainedCrsList.at( i ) );
164+
}
165+
}
166+
else //no crs constraint
167+
{
168+
Q_FOREACH ( const QString& crs, crsList )
169+
{
170+
appendLayerBoundingBox( layerElem, doc, layerExtent, layerCRS, crs );
171+
}
172+
}
173+
}
174+
175+
void QgsConfigParserUtils::appendLayerBoundingBox( QDomElement& layerElem, QDomDocument& doc, const QgsRectangle& layerExtent,
176+
const QgsCoordinateReferenceSystem& layerCRS, const QString& crsText )
177+
{
178+
if ( layerElem.isNull() )
179+
{
180+
return;
181+
}
182+
183+
QString version = doc.documentElement().attribute( "version" );
184+
185+
const QgsCoordinateReferenceSystem& crs = QgsCRSCache::instance()->crsByAuthId( crsText );
186+
187+
//transform the layers native CRS into CRS
188+
QgsCoordinateTransform crsTransform( layerCRS, crs );
189+
QgsRectangle crsExtent = crsTransform.transformBoundingBox( layerExtent );
190+
191+
//BoundingBox element
192+
QDomElement bBoxElement = doc.createElement( "BoundingBox" );
193+
if ( crs.isValid() )
194+
{
195+
bBoxElement.setAttribute( version == "1.1.1" ? "SRS" : "CRS", crs.authid() );
196+
}
197+
198+
if ( version != "1.1.1" && crs.axisInverted() )
199+
{
200+
crsExtent.invert();
201+
}
202+
203+
bBoxElement.setAttribute( "minx", QString::number( crsExtent.xMinimum() ) );
204+
bBoxElement.setAttribute( "miny", QString::number( crsExtent.yMinimum() ) );
205+
bBoxElement.setAttribute( "maxx", QString::number( crsExtent.xMaximum() ) );
206+
bBoxElement.setAttribute( "maxy", QString::number( crsExtent.yMaximum() ) );
207+
208+
QDomElement lastBBoxElem = layerElem.lastChildElement( "BoundingBox" );
209+
if ( !lastBBoxElem.isNull() )
210+
{
211+
layerElem.insertAfter( bBoxElement, lastBBoxElem );
212+
}
213+
else
214+
{
215+
lastBBoxElem = layerElem.lastChildElement( version == "1.1.1" ? "LatLonBoundingBox" : "EX_GeographicBoundingBox" );
216+
if ( !lastBBoxElem.isNull() )
217+
{
218+
layerElem.insertAfter( bBoxElement, lastBBoxElem );
219+
}
220+
else
221+
{
222+
layerElem.appendChild( bBoxElement );
223+
}
155224
}
156225
}
157226

‎src/server/qgsconfigparserutils.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ class QgsConfigParserUtils
3535
static void appendCRSElementToLayer( QDomElement& layerElement, const QDomElement& precedingElement,
3636
const QString& crsText, QDomDocument& doc );
3737
static void appendLayerBoundingBoxes( QDomElement& layerElem, QDomDocument& doc, const QgsRectangle& layerExtent,
38-
const QgsCoordinateReferenceSystem& layerCRS );
38+
const QgsCoordinateReferenceSystem& layerCRS, const QStringList &crsList,
39+
const QStringList& constrainedCrsList );
40+
static void appendLayerBoundingBox( QDomElement& layerElem, QDomDocument& doc, const QgsRectangle& layerExtent,
41+
const QgsCoordinateReferenceSystem& layerCRS, const QString& crsText );
3942
/** Returns a list of supported EPSG coordinate system numbers from a layer*/
4043
static QStringList createCRSListForLayer( QgsMapLayer* theMapLayer );
4144

‎src/server/qgsserverprojectparser.cpp

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -418,26 +418,33 @@ void QgsServerProjectParser::serviceCapabilities( QDomElement& parentElement, QD
418418

419419
//keyword list
420420
QDomElement keywordListElem = propertiesElement.firstChildElement( "WMSKeywordList" );
421+
QDomElement wmsKeywordElem = doc.createElement( "KeywordList" );
422+
//add default keyword
423+
QDomElement keywordElem = doc.createElement( "Keyword" );
424+
keywordElem.setAttribute( "vocabulary", "ISO" );
425+
QDomText keywordText = doc.createTextNode( "infoMapAccessService" );
426+
if ( service.compare( "WFS", Qt::CaseInsensitive ) == 0 )
427+
keywordText = doc.createTextNode( "infoFeatureAccessService" );
428+
else if ( service.compare( "WCS", Qt::CaseInsensitive ) == 0 )
429+
keywordText = doc.createTextNode( "infoCoverageAccessService" );
430+
keywordElem.appendChild( keywordText );
431+
wmsKeywordElem.appendChild( keywordElem );
432+
serviceElem.appendChild( wmsKeywordElem );
433+
//add config keywords
421434
if ( !keywordListElem.isNull() && !keywordListElem.text().isEmpty() )
422435
{
423-
QDomElement wmsKeywordElem = doc.createElement( "KeywordList" );
424436
QDomNodeList keywordList = keywordListElem.elementsByTagName( "value" );
425437
for ( int i = 0; i < keywordList.size(); ++i )
426438
{
427-
QDomElement keywordElem = doc.createElement( "Keyword" );
428-
QDomText keywordText = doc.createTextNode( keywordList.at( i ).toElement().text() );
439+
keywordElem = doc.createElement( "Keyword" );
440+
keywordText = doc.createTextNode( keywordList.at( i ).toElement().text() );
429441
keywordElem.appendChild( keywordText );
430442
if ( sia2045 )
431443
{
432444
keywordElem.setAttribute( "vocabulary", "SIA_Geo405" );
433445
}
434446
wmsKeywordElem.appendChild( keywordElem );
435447
}
436-
437-
if ( keywordList.size() > 0 )
438-
{
439-
serviceElem.appendChild( wmsKeywordElem );
440-
}
441448
}
442449

443450
//OnlineResource element is mandatory according to the WMS specification
@@ -511,23 +518,25 @@ void QgsServerProjectParser::serviceCapabilities( QDomElement& parentElement, QD
511518

512519
//Fees
513520
QDomElement feesElem = propertiesElement.firstChildElement( "WMSFees" );
514-
if ( !feesElem.isNull() )
521+
QDomElement wmsFeesElem = doc.createElement( "Fees" );
522+
QDomText wmsFeesText = doc.createTextNode( "conditions unknown" ); // default value if access conditions are unknown
523+
if ( !feesElem.isNull() && feesElem.text() != "" )
515524
{
516-
QDomElement wmsFeesElem = doc.createElement( "Fees" );
517-
QDomText wmsFeesText = doc.createTextNode( feesElem.text() );
518-
wmsFeesElem.appendChild( wmsFeesText );
519-
serviceElem.appendChild( wmsFeesElem );
525+
wmsFeesText = doc.createTextNode( feesElem.text() );
520526
}
527+
wmsFeesElem.appendChild( wmsFeesText );
528+
serviceElem.appendChild( wmsFeesElem );
521529

522530
//AccessConstraints
523531
QDomElement accessConstraintsElem = propertiesElement.firstChildElement( "WMSAccessConstraints" );
524-
if ( !accessConstraintsElem.isNull() )
532+
QDomElement wmsAccessConstraintsElem = doc.createElement( "AccessConstraints" );
533+
QDomText wmsAccessConstraintsText = doc.createTextNode( "None" ); // default value if access constraints are unknown
534+
if ( !accessConstraintsElem.isNull() && accessConstraintsElem.text() != "" )
525535
{
526-
QDomElement wmsAccessConstraintsElem = doc.createElement( "AccessConstraints" );
527-
QDomText wmsAccessConstraintsText = doc.createTextNode( accessConstraintsElem.text() );
528-
wmsAccessConstraintsElem.appendChild( wmsAccessConstraintsText );
529-
serviceElem.appendChild( wmsAccessConstraintsElem );
536+
wmsAccessConstraintsText = doc.createTextNode( accessConstraintsElem.text() );
530537
}
538+
wmsAccessConstraintsElem.appendChild( wmsAccessConstraintsText );
539+
serviceElem.appendChild( wmsAccessConstraintsElem );
531540

532541
//max width, max height for WMS
533542
if ( service.compare( "WMS", Qt::CaseInsensitive ) == 0 )
@@ -692,7 +701,7 @@ void QgsServerProjectParser::combineExtentAndCrsOfGroupChildren( QDomElement& gr
692701
combinedBBox = mapRect;
693702
}
694703
}
695-
QgsConfigParserUtils::appendLayerBoundingBoxes( groupElem, doc, combinedBBox, groupCRS );
704+
QgsConfigParserUtils::appendLayerBoundingBoxes( groupElem, doc, combinedBBox, groupCRS, combinedCRSSet.toList(), supportedOutputCrsList() );
696705
}
697706

698707
void QgsServerProjectParser::addLayerProjectSettings( QDomElement& layerElem, QDomDocument& doc, QgsMapLayer* currentLayer ) const

‎src/server/qgssldconfigparser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ void QgsSLDConfigParser::layersAndStylesCapabilities( QDomElement& parentElement
166166
QStringList crsNumbers = QgsConfigParserUtils::createCRSListForLayer( theMapLayer );
167167
QStringList crsRestriction; //no crs restrictions in SLD parser
168168
QgsConfigParserUtils::appendCRSElementsToLayer( layerElement, doc, crsNumbers, crsRestriction );
169-
QgsConfigParserUtils::appendLayerBoundingBoxes( layerElement, doc, theMapLayer->extent(), theMapLayer->crs() );
169+
QgsConfigParserUtils::appendLayerBoundingBoxes( layerElement, doc, theMapLayer->extent(), theMapLayer->crs(), crsNumbers, crsRestriction );
170170

171171
//iterate over all <UserStyle> nodes within a user layer
172172
QDomNodeList userStyleList = layerNodeList.item( i ).toElement().elementsByTagName( "UserStyle" );

‎src/server/qgswmsprojectparser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1082,7 +1082,7 @@ void QgsWMSProjectParser::addLayers( QDomDocument &doc,
10821082
QgsConfigParserUtils::appendCRSElementsToLayer( layerElem, doc, crsList, mProjectParser->supportedOutputCrsList() );
10831083

10841084
//Ex_GeographicBoundingBox
1085-
QgsConfigParserUtils::appendLayerBoundingBoxes( layerElem, doc, currentLayer->extent(), currentLayer->crs() );
1085+
QgsConfigParserUtils::appendLayerBoundingBoxes( layerElem, doc, currentLayer->extent(), currentLayer->crs(), crsList, mProjectParser->supportedOutputCrsList() );
10861086
}
10871087

10881088
// add details about supported styles of the layer

0 commit comments

Comments
 (0)
Failed to load comments.