Skip to content

Commit 2fcd2da

Browse files
committed
Add FeatureListURL in QGIS WMS Server GetCapabilities Request
When a layer is published as a WFS FeatureType, WMS GetCapabilities Answer containing a FeatureListURL. The FeatureListURL contains an OnlineResource element with the URL to the layer in GML.
1 parent 8a932d2 commit 2fcd2da

File tree

1 file changed

+74
-39
lines changed

1 file changed

+74
-39
lines changed

src/mapserver/qgsprojectparser.cpp

+74-39
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,52 @@ void QgsProjectParser::addLayers( QDomDocument &doc,
572572
layerElem.appendChild( keywordListElem );
573573
}
574574

575+
//CRS
576+
QStringList crsList = createCRSListForLayer( currentLayer );
577+
appendCRSElementsToLayer( layerElem, doc, crsList );
578+
579+
//Ex_GeographicBoundingBox
580+
appendLayerBoundingBoxes( layerElem, doc, currentLayer->extent(), currentLayer->crs() );
581+
582+
//only one default style in project file mode
583+
QDomElement styleElem = doc.createElement( "Style" );
584+
QDomElement styleNameElem = doc.createElement( "Name" );
585+
QDomText styleNameText = doc.createTextNode( "default" );
586+
styleNameElem.appendChild( styleNameText );
587+
QDomElement styleTitleElem = doc.createElement( "Title" );
588+
QDomText styleTitleText = doc.createTextNode( "default" );
589+
styleTitleElem.appendChild( styleTitleText );
590+
styleElem.appendChild( styleNameElem );
591+
styleElem.appendChild( styleTitleElem );
592+
layerElem.appendChild( styleElem );
593+
594+
//min/max scale denominatormScaleBasedVisibility
595+
if ( currentLayer->hasScaleBasedVisibility() )
596+
{
597+
QString minScaleString = QString::number( currentLayer->minimumScale() );
598+
QString maxScaleString = QString::number( currentLayer->maximumScale() );
599+
600+
if ( version == "1.1.1" )
601+
{
602+
QDomElement scaleHintElem = doc.createElement( "ScaleHint" );
603+
scaleHintElem.setAttribute( "min", minScaleString );
604+
scaleHintElem.setAttribute( "max", maxScaleString );
605+
layerElem.appendChild( scaleHintElem );
606+
}
607+
else
608+
{
609+
QDomElement minScaleElem = doc.createElement( "MinScaleDenominator" );
610+
QDomText minScaleText = doc.createTextNode( minScaleString );
611+
minScaleElem.appendChild( minScaleText );
612+
layerElem.appendChild( minScaleElem );
613+
QDomElement maxScaleElem = doc.createElement( "MaxScaleDenominator" );
614+
QDomText maxScaleText = doc.createTextNode( maxScaleString );
615+
maxScaleElem.appendChild( maxScaleText );
616+
layerElem.appendChild( maxScaleElem );
617+
}
618+
}
619+
620+
// layer attribution
575621
QString attribution = currentLayer->attribution();
576622
if ( !attribution.isEmpty() )
577623
{
@@ -592,6 +638,7 @@ void QgsProjectParser::addLayers( QDomDocument &doc,
592638
layerElem.appendChild( attribElem );
593639
}
594640

641+
// layer metadata URL
595642
QString metadataUrl = currentLayer->metadataUrl();
596643
if ( !metadataUrl.isEmpty() )
597644
{
@@ -617,49 +664,37 @@ void QgsProjectParser::addLayers( QDomDocument &doc,
617664
layerElem.appendChild( metaUrlElem );
618665
}
619666

620-
//CRS
621-
QStringList crsList = createCRSListForLayer( currentLayer );
622-
appendCRSElementsToLayer( layerElem, doc, crsList );
623-
624-
//Ex_GeographicBoundingBox
625-
appendLayerBoundingBoxes( layerElem, doc, currentLayer->extent(), currentLayer->crs() );
626-
627-
//only one default style in project file mode
628-
QDomElement styleElem = doc.createElement( "Style" );
629-
QDomElement styleNameElem = doc.createElement( "Name" );
630-
QDomText styleNameText = doc.createTextNode( "default" );
631-
styleNameElem.appendChild( styleNameText );
632-
QDomElement styleTitleElem = doc.createElement( "Title" );
633-
QDomText styleTitleText = doc.createTextNode( "default" );
634-
styleTitleElem.appendChild( styleTitleText );
635-
styleElem.appendChild( styleNameElem );
636-
styleElem.appendChild( styleTitleElem );
637-
layerElem.appendChild( styleElem );
638-
639-
//min/max scale denominatormScaleBasedVisibility
640-
if ( currentLayer->hasScaleBasedVisibility() )
667+
// if the layer is published in WFS
668+
// add a FeatureListURL element
669+
// with an URL to the GML
670+
QStringList wfsLayersId = wfsLayers();
671+
if ( wfsLayersId.contains( currentLayer->id() ) )
641672
{
642-
QString minScaleString = QString::number( currentLayer->minimumScale() );
643-
QString maxScaleString = QString::number( currentLayer->maximumScale() );
673+
QDomElement featListUrlElem = doc.createElement( "FeatureListURL" );
644674

645-
if ( version == "1.1.1" )
646-
{
647-
QDomElement scaleHintElem = doc.createElement( "ScaleHint" );
648-
scaleHintElem.setAttribute( "min", minScaleString );
649-
scaleHintElem.setAttribute( "max", maxScaleString );
650-
layerElem.appendChild( scaleHintElem );
651-
}
652-
else
675+
QDomElement featListUrlFormatElem = doc.createElement( "Format" );
676+
QDomText featListUrlFormatText = doc.createTextNode( "text/xml" );
677+
featListUrlFormatElem.appendChild( featListUrlFormatText );
678+
featListUrlElem.appendChild( featListUrlFormatElem );
679+
680+
QDomNodeList getCapNodeList = doc.elementsByTagName( "GetCapabilities" );
681+
if ( getCapNodeList.count() > 0 )
653682
{
654-
QDomElement minScaleElem = doc.createElement( "MinScaleDenominator" );
655-
QDomText minScaleText = doc.createTextNode( minScaleString );
656-
minScaleElem.appendChild( minScaleText );
657-
layerElem.appendChild( minScaleElem );
658-
QDomElement maxScaleElem = doc.createElement( "MaxScaleDenominator" );
659-
QDomText maxScaleText = doc.createTextNode( maxScaleString );
660-
maxScaleElem.appendChild( maxScaleText );
661-
layerElem.appendChild( maxScaleElem );
683+
QDomElement getCapElem = getCapNodeList.at( 0 ).toElement();
684+
QDomNodeList getCapORNodeList = getCapElem.elementsByTagName( "OnlineResource" );
685+
if ( getCapORNodeList.count() > 0 )
686+
{
687+
QString getCapUrl = getCapORNodeList.at( 0 ).toElement().attribute( "xlink:href", "" );
688+
QString featListUrl = getCapUrl + "SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=" + currentLayer->name() + "&OUPUTFORMAT=GML2";
689+
QDomElement featListUrlORElem = doc.createElement( "OnlineResource" );
690+
featListUrlORElem.setAttribute( "xmlns:xlink", "http://www.w3.org/1999/xlink" );
691+
featListUrlORElem.setAttribute( "xlink:type", "simple" );
692+
featListUrlORElem.setAttribute( "xlink:href", featListUrl );
693+
featListUrlElem.appendChild( featListUrlORElem );
694+
}
662695
}
696+
697+
layerElem.appendChild( featListUrlElem );
663698
}
664699

665700
if ( fullProjectSettings )

0 commit comments

Comments
 (0)