Skip to content

Commit acc9482

Browse files
author
morb_au
committed
Another WMS improvement:
* The Identify map tool is now disabled if none of the layers from the WMS server are "queryable". This saves the WMS server the bother of returning an error if we tried to Identify anyway. Coding: * The QgsRasterDataProvider now has the concept of "capabilities" like the QgsVectorDataProvider (not to be confused with Capabilities in the WMS Standard). The only capability dealt with at this time is the ability to Identify. git-svn-id: http://svn.osgeo.org/qgis/trunk@5080 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 75709b9 commit acc9482

7 files changed

+158
-32
lines changed

src/core/qgsrasterdataprovider.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,24 @@ QgsRasterDataProvider::QgsRasterDataProvider( QString const & uri )
3030
}
3131

3232

33+
QString QgsRasterDataProvider::capabilitiesString() const
34+
{
35+
QStringList abilitiesList;
36+
37+
int abilities = capabilities();
38+
39+
if (abilities & QgsRasterDataProvider::Identify)
40+
{
41+
abilitiesList += "Identify";
42+
#ifdef QGISDEBUG
43+
std::cerr << "QgsRasterDataProvider::capabilitiesString "
44+
<< "Identify" << std::endl;
45+
#endif
46+
47+
}
48+
49+
return abilitiesList.join(", ");
50+
}
51+
52+
53+
// ENDS

src/core/qgsrasterdataprovider.h

+24-4
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,17 @@ class QgsRasterDataProvider : public QgsDataProvider
4343
{
4444

4545
Q_OBJECT
46-
46+
4747
public:
4848

49+
//! If you add to this, please also add to capabilitiesString()
50+
enum Capability
51+
{
52+
NoCapabilities = 0,
53+
Identify = 1
54+
// Capability2 = 1 << 1, , etc
55+
};
56+
4957

5058
QgsRasterDataProvider();
5159

@@ -78,9 +86,21 @@ class QgsRasterDataProvider : public QgsDataProvider
7886
*/
7987
virtual QImage* draw(QgsRect const & viewExtent, int pixelWidth, int pixelHeight) = 0;
8088

81-
82-
83-
89+
/** Returns a bitmask containing the supported capabilities
90+
Note, some capabilities may change depending on whether
91+
a spatial filter is active on this provider, so it may
92+
be prudent to check this value per intended operation.
93+
*/
94+
virtual int capabilities() const
95+
{
96+
return QgsRasterDataProvider::NoCapabilities;
97+
}
98+
99+
/**
100+
* Returns the above in friendly format.
101+
*/
102+
QString capabilitiesString() const;
103+
84104

85105
// TODO: Get the supported formats by this provider
86106

src/gui/qgisapp.cpp

+17
Original file line numberDiff line numberDiff line change
@@ -4863,6 +4863,8 @@ void QgisApp::activateDeactivateLayerRelatedActions(const QgsMapLayer* layer)
48634863
{
48644864
mActionSelect->setEnabled(true);
48654865
mActionOpenTable->setEnabled(true);
4866+
mActionIdentify->setEnabled(true);
4867+
48664868
const QgsVectorLayer* vlayer = dynamic_cast<const QgsVectorLayer*>(layer);
48674869
const QgsVectorDataProvider* dprovider = vlayer->getDataProvider();
48684870
if(vlayer)
@@ -4950,6 +4952,21 @@ void QgisApp::activateDeactivateLayerRelatedActions(const QgsMapLayer* layer)
49504952
mActionAddVertex->setEnabled(false);
49514953
mActionDeleteVertex->setEnabled(false);
49524954
mActionMoveVertex->setEnabled(false);
4955+
4956+
const QgsRasterLayer* vlayer = dynamic_cast<const QgsRasterLayer*> (layer);
4957+
const QgsRasterDataProvider* dprovider = vlayer->getDataProvider();
4958+
if (vlayer)
4959+
{
4960+
// does provider allow the identify map tool?
4961+
if (dprovider->capabilities() & QgsRasterDataProvider::Identify)
4962+
{
4963+
mActionIdentify->setEnabled(TRUE);
4964+
}
4965+
else
4966+
{
4967+
mActionIdentify->setEnabled(FALSE);
4968+
}
4969+
}
49534970
}
49544971
}
49554972

src/providers/wms/qgswmsprovider.cpp

+57-25
Original file line numberDiff line numberDiff line change
@@ -675,7 +675,7 @@ bool QgsWmsProvider::retrieveServerCapabilities(bool forceRefresh)
675675
#endif
676676

677677
bool domOK;
678-
domOK = parseCapabilitiesDOM(httpcapabilitiesresponse, capabilities);
678+
domOK = parseCapabilitiesDOM(httpcapabilitiesresponse, mCapabilities);
679679

680680
if (!domOK)
681681
{
@@ -1592,6 +1592,8 @@ void QgsWmsProvider::parseLayer(QDomElement const & e, QgsWmsLayerProperty& laye
15921592
// We have all the information we need to properly evaluate a layer definition
15931593
// TODO: Save this somewhere
15941594

1595+
// Store if the layer is queryable
1596+
mQueryableForLayer[ layerProperty.name ] = layerProperty.queryable;
15951597

15961598
// Store the available Coordinate Reference Systems for the layer so that it
15971599
// can be combined with others later in supportedCrsForLayers()
@@ -1832,7 +1834,7 @@ QString QgsWmsProvider::wmsVersion()
18321834

18331835
QStringList QgsWmsProvider::supportedImageEncodings()
18341836
{
1835-
return capabilities.capability.request.getMap.format;
1837+
return mCapabilities.capability.request.getMap.format;
18361838
}
18371839

18381840

@@ -1842,18 +1844,6 @@ QStringList QgsWmsProvider::subLayers()
18421844
}
18431845

18441846

1845-
/*
1846-
int QgsWmsProvider::capabilities() const
1847-
{
1848-
return ( QgsVectorDataProvider::AddFeatures |
1849-
QgsVectorDataProvider::DeleteFeatures |
1850-
QgsVectorDataProvider::ChangeAttributeValues |
1851-
QgsVectorDataProvider::AddAttributes |
1852-
QgsVectorDataProvider::DeleteAttributes );
1853-
}
1854-
*/
1855-
1856-
18571847
void QgsWmsProvider::showStatusMessage(QString const & theMessage)
18581848
{
18591849
// Pass-through
@@ -1929,6 +1919,48 @@ bool QgsWmsProvider::calculateExtent()
19291919

19301920
}
19311921

1922+
1923+
int QgsWmsProvider::capabilities() const
1924+
{
1925+
int capability = 0;
1926+
bool canIdentify = FALSE;
1927+
1928+
#ifdef QGISDEBUG
1929+
std::cout << "QgsWmsProvider::capabilities: entering." << std::endl;
1930+
#endif
1931+
1932+
// Test for the ability to use the Identify map tool
1933+
for ( QStringList::const_iterator it = activeSubLayers.begin();
1934+
it != activeSubLayers.end();
1935+
++it )
1936+
{
1937+
// Is sublayer visible?
1938+
if (TRUE == activeSubLayerVisibility.find( *it )->second)
1939+
{
1940+
// Is sublayer queryable?
1941+
if (TRUE == mQueryableForLayer.find( *it )->second)
1942+
{
1943+
#ifdef QGISDEBUG
1944+
std::cout << "QgsWmsProvider::capabilities: '" << (*it).toLocal8Bit().data() << "' is queryable." << std::endl;
1945+
#endif
1946+
canIdentify = TRUE;
1947+
}
1948+
}
1949+
}
1950+
1951+
// Collect all the test results into one bitmask
1952+
if (canIdentify)
1953+
{
1954+
capability = (capability | QgsRasterDataProvider::Identify);
1955+
}
1956+
1957+
#ifdef QGISDEBUG
1958+
std::cout << "QgsWmsProvider::capabilities: exiting with '" << capability << "'." << std::endl;
1959+
#endif
1960+
return capability;
1961+
}
1962+
1963+
19321964
QString QgsWmsProvider::getMetadata()
19331965
{
19341966

@@ -1956,31 +1988,31 @@ QString QgsWmsProvider::getMetadata()
19561988
myMetadataQString += tr("WMS Version");
19571989
myMetadataQString += "</td>";
19581990
myMetadataQString += "<td bgcolor=\"gray\">";
1959-
myMetadataQString += capabilities.version;
1991+
myMetadataQString += mCapabilities.version;
19601992
myMetadataQString += "</td></tr>";
19611993

19621994
// Service Title
19631995
myMetadataQString += "<tr><td bgcolor=\"gray\">";
19641996
myMetadataQString += tr("Title");
19651997
myMetadataQString += "</td>";
19661998
myMetadataQString += "<td bgcolor=\"gray\">";
1967-
myMetadataQString += capabilities.service.title;
1999+
myMetadataQString += mCapabilities.service.title;
19682000
myMetadataQString += "</td></tr>";
19692001

19702002
// Service Abstract
19712003
myMetadataQString += "<tr><td bgcolor=\"gray\">";
19722004
myMetadataQString += tr("Abstract");
19732005
myMetadataQString += "</td>";
19742006
myMetadataQString += "<td bgcolor=\"gray\">";
1975-
myMetadataQString += capabilities.service.abstract;
2007+
myMetadataQString += mCapabilities.service.abstract;
19762008
myMetadataQString += "</td></tr>";
19772009

19782010
// Service Keywords
19792011
myMetadataQString += "<tr><td bgcolor=\"gray\">";
19802012
myMetadataQString += tr("Keywords");
19812013
myMetadataQString += "</td>";
19822014
myMetadataQString += "<td bgcolor=\"gray\">";
1983-
myMetadataQString += capabilities.service.keywordList.join("<br />");
2015+
myMetadataQString += mCapabilities.service.keywordList.join("<br />");
19842016
myMetadataQString += "</td></tr>";
19852017

19862018
// Service Online Resource
@@ -1996,43 +2028,43 @@ QString QgsWmsProvider::getMetadata()
19962028
myMetadataQString += tr("Contact Person");
19972029
myMetadataQString += "</td>";
19982030
myMetadataQString += "<td bgcolor=\"gray\">";
1999-
myMetadataQString += capabilities.service.contactInformation.contactPersonPrimary.contactPerson;
2031+
myMetadataQString += mCapabilities.service.contactInformation.contactPersonPrimary.contactPerson;
20002032
myMetadataQString += "<br />";
2001-
myMetadataQString += capabilities.service.contactInformation.contactPosition;
2033+
myMetadataQString += mCapabilities.service.contactInformation.contactPosition;
20022034
myMetadataQString += "<br />";
2003-
myMetadataQString += capabilities.service.contactInformation.contactPersonPrimary.contactOrganization;
2035+
myMetadataQString += mCapabilities.service.contactInformation.contactPersonPrimary.contactOrganization;
20042036
myMetadataQString += "</td></tr>";
20052037

20062038
// Service Fees
20072039
myMetadataQString += "<tr><td bgcolor=\"gray\">";
20082040
myMetadataQString += tr("Fees");
20092041
myMetadataQString += "</td>";
20102042
myMetadataQString += "<td bgcolor=\"gray\">";
2011-
myMetadataQString += capabilities.service.fees;
2043+
myMetadataQString += mCapabilities.service.fees;
20122044
myMetadataQString += "</td></tr>";
20132045

20142046
// Service Access Constraints
20152047
myMetadataQString += "<tr><td bgcolor=\"gray\">";
20162048
myMetadataQString += tr("Access Constraints");
20172049
myMetadataQString += "</td>";
20182050
myMetadataQString += "<td bgcolor=\"gray\">";
2019-
myMetadataQString += capabilities.service.accessConstraints;
2051+
myMetadataQString += mCapabilities.service.accessConstraints;
20202052
myMetadataQString += "</td></tr>";
20212053

20222054
// GetMap Request Formats
20232055
myMetadataQString += "<tr><td bgcolor=\"gray\">";
20242056
myMetadataQString += tr("Image Formats");
20252057
myMetadataQString += "</td>";
20262058
myMetadataQString += "<td bgcolor=\"gray\">";
2027-
myMetadataQString += capabilities.capability.request.getMap.format.join("<br />");
2059+
myMetadataQString += mCapabilities.capability.request.getMap.format.join("<br />");
20282060
myMetadataQString += "</td></tr>";
20292061

20302062
// GetFeatureInfo Request Formats
20312063
myMetadataQString += "<tr><td bgcolor=\"gray\">";
20322064
myMetadataQString += tr("Identify Formats");
20332065
myMetadataQString += "</td>";
20342066
myMetadataQString += "<td bgcolor=\"gray\">";
2035-
myMetadataQString += capabilities.capability.request.getFeatureInfo.format.join("<br />");
2067+
myMetadataQString += mCapabilities.capability.request.getFeatureInfo.format.join("<br />");
20362068
myMetadataQString += "</td></tr>";
20372069

20382070
// Layer Count (as managed by this provider)

src/providers/wms/qgswmsprovider.h

+14-3
Original file line numberDiff line numberDiff line change
@@ -486,15 +486,20 @@ class QgsWmsProvider : public QgsRasterDataProvider
486486

487487
// TODO: Get the table name associated with this provider instance
488488

489-
/**Returns a bitmask containing the supported capabilities*/
490-
// int capabilities() const;
489+
/** Returns a bitmask containing the supported capabilities
490+
Note, some capabilities may change depending on which
491+
sublayers are visible on this provider, so it may
492+
be prudent to check this value per intended operation.
493+
*/
494+
int capabilities() const;
491495

492496
/**
493497
* Get metadata in a format suitable for feeding directly
494498
* into a subset of the GUI raster properties "Metadata" tab.
495499
*/
496500
QString getMetadata();
497501

502+
498503
/**
499504
* \brief Identify details from a WMS Server from the last screen update
500505
*
@@ -732,7 +737,7 @@ public slots:
732737
/**
733738
* Parsed capabilities of the WMS Server
734739
*/
735-
QgsWmsCapabilitiesProperty capabilities;
740+
QgsWmsCapabilitiesProperty mCapabilities;
736741

737742
/**
738743
* layers hosted by the WMS Server
@@ -749,6 +754,12 @@ public slots:
749754
*/
750755
std::map<QString, std::vector<QString> > crsForLayer;
751756

757+
/**
758+
* WMS "queryable" per layer
759+
* Used in determining if the Identify map tool can be useful on the rendered WMS map layer.
760+
*/
761+
std::map<QString, bool> mQueryableForLayer;
762+
752763
/**
753764
* Active sublayers managed by this provider in a draw function, in order from bottom to top
754765
* (some may not be visible in a draw function, cf. activeSubLayerVisibility)

src/raster/qgsrasterlayer.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -5239,4 +5239,16 @@ QString QgsRasterLayer::errorString()
52395239
}
52405240

52415241

5242+
QgsRasterDataProvider* QgsRasterLayer::getDataProvider()
5243+
{
5244+
return dataProvider;
5245+
}
5246+
5247+
const QgsRasterDataProvider* QgsRasterLayer::getDataProvider() const
5248+
{
5249+
return dataProvider;
5250+
}
5251+
5252+
5253+
52425254
// ENDS

src/raster/qgsrasterlayer.h

+13
Original file line numberDiff line numberDiff line change
@@ -783,6 +783,19 @@ class QgsRasterLayer : public QgsMapLayer
783783
*/
784784
QString errorString();
785785

786+
/** Returns the data provider
787+
*
788+
* \retval 0 if not using the data provider model (i.e. directly using GDAL)
789+
*/
790+
QgsRasterDataProvider* getDataProvider();
791+
792+
/** Returns the data provider in a const-correct manner
793+
*
794+
* \retval 0 if not using the data provider model (i.e. directly using GDAL)
795+
*/
796+
const QgsRasterDataProvider* getDataProvider() const;
797+
798+
786799

787800
public slots:
788801
/** \brief Mutator for transparency level. Should be between 0 and 255 */

0 commit comments

Comments
 (0)