Skip to content

Commit e276f17

Browse files
committed
[Feature][QGIS Server] Add WMS INSPIRE Capabilities
In the project properties the user can: * activate INSPIRE capabilities * select language of the service, 24 EU official languages + 5 regionals * choose the scenario for service metadata and specify them The WMS 1.3.0 capabilities reflects the INSPIRE configuration.
1 parent bb5f0ff commit e276f17

19 files changed

+1180
-121
lines changed

images/flags/cy.png

652 Bytes
Loading

images/flags/en_GB.png

599 Bytes
Loading

images/flags/ga.png

481 Bytes
Loading

images/flags/gd.png

649 Bytes
Loading

images/flags/mt.png

420 Bytes
Loading

images/images.qrc

+5
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@
44
<file>flags/af.png</file>
55
<file>flags/ar.png</file>
66
<file>flags/bg.png</file>
7+
<file>flags/cy.png</file>
78
<file>flags/de.png</file>
9+
<file>flags/en_GB.png</file>
810
<file>flags/en_US.png</file>
911
<file>flags/es.png</file>
1012
<file>flags/fa.png</file>
1113
<file>flags/fi.png</file>
1214
<file>flags/fr.png</file>
15+
<file>flags/ga.png</file>
16+
<file>flags/gd.png</file>
1317
<file>flags/he.png</file>
1418
<file>flags/hu.png</file>
1519
<file>flags/id.png</file>
@@ -21,6 +25,7 @@
2125
<file>flags/lt.png</file>
2226
<file>flags/lv.png</file>
2327
<file>flags/mn.png</file>
28+
<file>flags/mt.png</file>
2429
<file>flags/nl.png</file>
2530
<file>flags/pt_BR.png</file>
2631
<file>flags/pt_PT.png</file>

src/app/qgsprojectproperties.cpp

+117-8
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *pa
294294
{
295295
mWMSContactPositionCb->setCurrentIndex( contactPositionIndex );
296296
}
297-
else if ( contactPositionText != "" )
297+
else if ( !contactPositionText.isEmpty() )
298298
{
299299
mWMSContactPositionCb->setEditText( contactPositionText );
300300
}
@@ -308,7 +308,7 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *pa
308308
{
309309
mWMSFeesCb->setCurrentIndex( feesIndex );
310310
}
311-
else if ( feesText != "" )
311+
else if ( !feesText.isEmpty() )
312312
{
313313
mWMSFeesCb->setEditText( feesText );
314314
}
@@ -329,11 +329,82 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *pa
329329
{
330330
mWMSAccessConstraintsCb->setCurrentIndex( accessConstraintsIndex );
331331
}
332-
else if ( accessConstraintsText != "" )
332+
else if ( !accessConstraintsText.isEmpty() )
333333
{
334334
mWMSAccessConstraintsCb->setEditText( accessConstraintsText );
335335
}
336336

337+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "bg" ) ), QLocale( "bg" ).nativeLanguageName(), "bul" );
338+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "cs" ) ), QLocale( "cs" ).nativeLanguageName(), "cze" );
339+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "da" ) ), QLocale( "da" ).nativeLanguageName(), "dan" );
340+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "nl" ) ), QLocale( "nl" ).nativeLanguageName(), "dut" );
341+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "en_GB" ) ), QLocale( "en_GB" ).nativeLanguageName(), "eng" );
342+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "et" ) ), QLocale( "et" ).nativeLanguageName(), "est" );
343+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "fi" ) ), QLocale( "fi" ).nativeLanguageName(), "fin" );
344+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "fr" ) ), QLocale( "fr" ).nativeLanguageName(), "fre" );
345+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "de" ) ), QLocale( "de" ).nativeLanguageName(), "ger" );
346+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "ga" ) ), QLocale( "ga" ).nativeLanguageName(), "gle" );
347+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "el" ) ), QLocale( "el" ).nativeLanguageName(), "gre" );
348+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "hu" ) ), QLocale( "hu" ).nativeLanguageName(), "hun" );
349+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "it" ) ), QLocale( "it" ).nativeLanguageName(), "ita" );
350+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "lv" ) ), QLocale( "lv" ).nativeLanguageName(), "lav" );
351+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "lt" ) ), QLocale( "lt" ).nativeLanguageName(), "lit" );
352+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "mt" ) ), QLocale( "mt" ).nativeLanguageName(), "mlt" );
353+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "pl" ) ), QLocale( "pl" ).nativeLanguageName(), "pol" );
354+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "pt_PT" ) ), QLocale( "pt_PT" ).nativeLanguageName(), "por" );
355+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "ro" ) ), QLocale( "ro" ).nativeLanguageName(), "rum" );
356+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "sk" ) ), QLocale( "sk" ).nativeLanguageName(), "slo" );
357+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "sl" ) ), QLocale( "sl" ).nativeLanguageName(), "slv" );
358+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "es" ) ), QLocale( "es" ).nativeLanguageName(), "spa" );
359+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "sv" ) ), QLocale( "sv" ).nativeLanguageName(), "swe" );
360+
361+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "eu" ) ), QLocale( "eu" ).nativeLanguageName(), "eus" );
362+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "ca" ) ), QLocale( "ca" ).nativeLanguageName(), "cat" );
363+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "gl" ) ), QLocale( "gl" ).nativeLanguageName(), "gal" );
364+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "gd" ) ), QLocale( "gd" ).nativeLanguageName(), "gla" );
365+
mWMSInspireLanguage->addItem( QIcon( QString( ":/images/flags/%1.png" ).arg( "cy" ) ), QLocale( "cy" ).nativeLanguageName(), "cym" );
366+
mWMSInspireLanguage->setCurrentIndex(
367+
mWMSInspireLanguage->findText(
368+
QLocale::system().nativeLanguageName()
369+
)
370+
);
371+
372+
bool addWMSInspire = QgsProject::instance()->readBoolEntry( "WMSInspire", "/activated" );
373+
if ( addWMSInspire )
374+
{
375+
mWMSInspire->setChecked( addWMSInspire );
376+
QString inspireLanguage = QgsProject::instance()->readEntry( "WMSInspire", "/language", "" );
377+
int inspireLanguageIndex = mWMSInspireLanguage->findData( inspireLanguage );
378+
mWMSInspireLanguage->setCurrentIndex( inspireLanguageIndex );
379+
380+
QString inspireMetadataUrl = QgsProject::instance()->readEntry( "WMSInspire", "/metadataUrl", "" );
381+
if ( !inspireMetadataUrl.isEmpty() )
382+
{
383+
mWMSInspireScenario1->setChecked( true );
384+
mWMSInspireMetadataUrl->setText( inspireMetadataUrl );
385+
mWMSInspireMetadataUrlType->setCurrentIndex(
386+
mWMSInspireMetadataUrlType->findText(
387+
QgsProject::instance()->readEntry( "WMSInspire", "/metadataUrlType", "" )
388+
)
389+
);
390+
}
391+
else
392+
{
393+
QString inspireTemporalReference = QgsProject::instance()->readEntry( "WMSInspire", "/temporalReference", "" );
394+
if ( !inspireTemporalReference.isEmpty() )
395+
{
396+
mWMSInspireScenario2->setChecked( true );
397+
mWMSInspireTemporalReference->setDate( QDate::fromString( inspireTemporalReference, "yyyy-MM-dd" ) );
398+
}
399+
QString inspireMetadataDate = QgsProject::instance()->readEntry( "WMSInspire", "/metadataDate", "" );
400+
if ( !inspireMetadataDate.isEmpty() )
401+
{
402+
mWMSInspireScenario2->setChecked( true );
403+
mWMSInspireMetadataDate->setDate( QDate::fromString( inspireMetadataDate, "yyyy-MM-dd" ) );
404+
}
405+
}
406+
}
407+
337408
// WMS GetFeatureInfo precision
338409
int WMSprecision = QgsProject::instance()->readNumEntry( "WMSPrecision", "/", -1 );
339410
if ( WMSprecision != -1 )
@@ -790,7 +861,10 @@ void QgsProjectProperties::apply()
790861

791862
QgsProject::instance()->writeEntry( "WMSServiceCapabilities", "/", grpOWSServiceCapabilities->isChecked() );
792863
QgsProject::instance()->writeEntry( "WMSServiceTitle", "/", mWMSTitle->text() );
793-
QgsProject::instance()->writeEntry( "WMSRootName", "/", mWMSName->text() );
864+
865+
if ( !mWMSName->text().isEmpty() )
866+
QgsProject::instance()->writeEntry( "WMSRootName", "/", mWMSName->text() );
867+
794868
QgsProject::instance()->writeEntry( "WMSContactOrganization", "/", mWMSContactOrganization->text() );
795869
QgsProject::instance()->writeEntry( "WMSContactPerson", "/", mWMSContactPerson->text() );
796870
QgsProject::instance()->writeEntry( "WMSContactMail", "/", mWMSContactMail->text() );
@@ -802,7 +876,7 @@ void QgsProjectProperties::apply()
802876
// WMS Contact Position
803877
int contactPositionIndex = mWMSContactPositionCb->currentIndex();
804878
QString contactPositionText = mWMSContactPositionCb->currentText();
805-
if ( contactPositionText != "" && contactPositionText == mWMSContactPositionCb->itemText( contactPositionIndex ) )
879+
if ( !contactPositionText.isEmpty() && contactPositionText == mWMSContactPositionCb->itemText( contactPositionIndex ) )
806880
{
807881
QgsProject::instance()->writeEntry( "WMSContactPosition", "/", mWMSContactPositionCb->itemData( contactPositionIndex ).toString() );
808882
}
@@ -814,7 +888,7 @@ void QgsProjectProperties::apply()
814888
// WMS Fees
815889
int feesIndex = mWMSFeesCb->currentIndex();
816890
QString feesText = mWMSFeesCb->currentText();
817-
if ( feesText != "" && feesText == mWMSFeesCb->itemText( feesIndex ) )
891+
if ( !feesText.isEmpty() && feesText == mWMSFeesCb->itemText( feesIndex ) )
818892
{
819893
QgsProject::instance()->writeEntry( "WMSFees", "/", mWMSFeesCb->itemData( feesIndex ).toString() );
820894
}
@@ -826,7 +900,7 @@ void QgsProjectProperties::apply()
826900
// WMS Access Constraints
827901
int accessConstraintsIndex = mWMSAccessConstraintsCb->currentIndex();
828902
QString accessConstraintsText = mWMSAccessConstraintsCb->currentText();
829-
if ( accessConstraintsText != "" && accessConstraintsText == mWMSAccessConstraintsCb->itemText( accessConstraintsIndex ) )
903+
if ( !accessConstraintsText.isEmpty() && accessConstraintsText == mWMSAccessConstraintsCb->itemText( accessConstraintsIndex ) )
830904
{
831905
QgsProject::instance()->writeEntry( "WMSAccessConstraints", "/", mWMSAccessConstraintsCb->itemData( accessConstraintsIndex ).toString() );
832906
}
@@ -847,6 +921,27 @@ void QgsProjectProperties::apply()
847921
QgsProject::instance()->removeEntry( "WMSKeywordList", "/" );
848922
}
849923

924+
// WMS INSPIRE configuration
925+
QgsProject::instance()->removeEntry( "WMSInspire", "/" );
926+
if ( mWMSInspire->isChecked() )
927+
{
928+
QgsProject::instance()->writeEntry( "WMSInspire", "/activated", mWMSInspire->isChecked() );
929+
930+
int inspireLanguageIndex = mWMSInspireLanguage->currentIndex();
931+
QgsProject::instance()->writeEntry( "WMSInspire", "/language", mWMSInspireLanguage->itemData( inspireLanguageIndex ).toString() );
932+
933+
if ( mWMSInspireScenario1->isChecked() )
934+
{
935+
QgsProject::instance()->writeEntry( "WMSInspire", "/metadataUrl", mWMSInspireMetadataUrl->text() );
936+
QgsProject::instance()->writeEntry( "WMSInspire", "/metadataUrlType", mWMSInspireMetadataUrlType->currentText() );
937+
}
938+
else if ( mWMSInspireScenario2->isChecked() )
939+
{
940+
QgsProject::instance()->writeEntry( "WMSInspire", "/temporalReference", mWMSInspireTemporalReference->date().toString( "yyyy-MM-dd" ) );
941+
QgsProject::instance()->writeEntry( "WMSInspire", "/metadataDate", mWMSInspireMetadataDate->date().toString( "yyyy-MM-dd" ) );
942+
}
943+
}
944+
850945
// WMS GetFeatureInfo geometry precision (decimal places)
851946
QgsProject::instance()->writeEntry( "WMSPrecision", "/", mWMSPrecisionSpinBox->text() );
852947

@@ -1326,6 +1421,20 @@ void QgsProjectProperties::on_pbnWFSLayersSelectAll_clicked()
13261421
}
13271422
}
13281423

1424+
void QgsProjectProperties::on_mWMSInspireScenario1_toggled( bool on )
1425+
{
1426+
mWMSInspireScenario2->blockSignals( true );
1427+
mWMSInspireScenario2->setChecked( !on );
1428+
mWMSInspireScenario2->blockSignals( false );
1429+
}
1430+
1431+
void QgsProjectProperties::on_mWMSInspireScenario2_toggled( bool on )
1432+
{
1433+
mWMSInspireScenario1->blockSignals( true );
1434+
mWMSInspireScenario1->setChecked( !on );
1435+
mWMSInspireScenario1->blockSignals( false );
1436+
}
1437+
13291438
void QgsProjectProperties::on_pbnWFSLayersUnselectAll_clicked()
13301439
{
13311440
for ( int i = 0; i < twWFSLayers->rowCount(); i++ )
@@ -1551,7 +1660,7 @@ void QgsProjectProperties::on_mTransparencySpinBox_valueChanged( int value )
15511660
void QgsProjectProperties::editSymbol( QComboBox* cbo )
15521661
{
15531662
QString symbolName = cbo->currentText();
1554-
if ( symbolName == "" )
1663+
if ( symbolName.isEmpty() )
15551664
{
15561665
QMessageBox::information( this, "", tr( "Select a valid symbol" ) );
15571666
return;

src/app/qgsprojectproperties.h

+2
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ class APP_EXPORT QgsProjectProperties : public QgsOptionsDialogBase, private Ui:
104104
void on_mRemoveWMSComposerButton_clicked();
105105
void on_mAddLayerRestrictionButton_clicked();
106106
void on_mRemoveLayerRestrictionButton_clicked();
107+
void on_mWMSInspireScenario1_toggled( bool on );
108+
void on_mWMSInspireScenario2_toggled( bool on );
107109

108110
/*!
109111
* Slots to select/unselect all the WFS layers

src/server/qgsserverprojectparser.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ QgsServerProjectParser::QgsServerProjectParser( QDomDocument* xmlDoc, const QStr
7575
}
7676
// Setting the QgsProject instance fileName
7777
// to help converting relative pathes to absolute
78-
if ( mProjectPath != "" )
78+
if ( !mProjectPath.isEmpty() )
7979
{
8080
QgsProject::instance()->setFileName( mProjectPath );
8181
}
@@ -563,7 +563,7 @@ void QgsServerProjectParser::serviceCapabilities( QDomElement& parentElement, QD
563563
QDomElement feesElem = propertiesElement.firstChildElement( "WMSFees" );
564564
QDomElement wmsFeesElem = doc.createElement( "Fees" );
565565
QDomText wmsFeesText = doc.createTextNode( "conditions unknown" ); // default value if access conditions are unknown
566-
if ( !feesElem.isNull() && feesElem.text() != "" )
566+
if ( !feesElem.isNull() && !feesElem.text().isEmpty() )
567567
{
568568
wmsFeesText = doc.createTextNode( feesElem.text() );
569569
}
@@ -574,7 +574,7 @@ void QgsServerProjectParser::serviceCapabilities( QDomElement& parentElement, QD
574574
QDomElement accessConstraintsElem = propertiesElement.firstChildElement( "WMSAccessConstraints" );
575575
QDomElement wmsAccessConstraintsElem = doc.createElement( "AccessConstraints" );
576576
QDomText wmsAccessConstraintsText = doc.createTextNode( "None" ); // default value if access constraints are unknown
577-
if ( !accessConstraintsElem.isNull() && accessConstraintsElem.text() != "" )
577+
if ( !accessConstraintsElem.isNull() && !accessConstraintsElem.text().isEmpty() )
578578
{
579579
wmsAccessConstraintsText = doc.createTextNode( accessConstraintsElem.text() );
580580
}

src/server/qgssldconfigparser.cpp

+17
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,15 @@ int QgsSLDConfigParser::WMSPrecision() const
708708
return -1;
709709
}
710710

711+
bool QgsSLDConfigParser::WMSInspireActivated() const
712+
{
713+
if ( mFallbackParser )
714+
{
715+
return mFallbackParser->WMSInspireActivated();
716+
}
717+
return false;
718+
}
719+
711720
QgsComposition* QgsSLDConfigParser::createPrintComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, const QMap< QString, QString >& parameterMap ) const
712721
{
713722
if ( mFallbackParser )
@@ -734,6 +743,14 @@ void QgsSLDConfigParser::printCapabilities( QDomElement& parentElement, QDomDocu
734743
}
735744
}
736745

746+
void QgsSLDConfigParser::inspireCapabilities( QDomElement& parentElement, QDomDocument& doc ) const
747+
{
748+
if ( mFallbackParser )
749+
{
750+
mFallbackParser->inspireCapabilities( parentElement, doc );
751+
}
752+
}
753+
737754
void QgsSLDConfigParser::setScaleDenominator( double )
738755
{
739756
//soon...

src/server/qgssldconfigparser.h

+5
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,11 @@ class QgsSLDConfigParser : public QgsWMSConfigParser
104104
double imageQuality() const override;
105105
int WMSPrecision() const override;
106106

107+
// WMS inspire capabilities
108+
bool WMSInspireActivated() const override;
109+
/** Adds inspire capabilities to xml document. ParentElem usually is the <Capabilities> element*/
110+
void inspireCapabilities( QDomElement& parentElement, QDomDocument& doc ) const override;
111+
107112
//printing
108113

109114
/** Creates a print composition, usually for a GetPrint request. Replaces map and label parameters*/

src/server/qgswmsconfigparser.h

+5
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ class SERVER_EXPORT QgsWMSConfigParser
105105
// WMS GetFeatureInfo precision (decimal places)
106106
virtual int WMSPrecision() const = 0;
107107

108+
// WMS inspire capabilities
109+
virtual bool WMSInspireActivated() const = 0;
110+
/** Adds inspire capabilities to xml document. ParentElem usually is the <Capabilities> element*/
111+
virtual void inspireCapabilities( QDomElement& parentElement, QDomDocument& doc ) const = 0;
112+
108113
//printing
109114

110115
/** Creates a print composition, usually for a GetPrint request. Replaces map and label parameters*/

0 commit comments

Comments
 (0)