Skip to content

Commit c1ef3f5

Browse files
author
morb_au
committed
Partial fix for #38 (Saved WMS layers do not reload).
Now, the fact the WMS raster provider was used, the layer names, layer styles and image formatting is stored in the project file (and restores OK). However upon initial testing the extent doesn't appear to be restored. I will need to address that later. git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@5603 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 87b0f55 commit c1ef3f5

6 files changed

+165
-17
lines changed

src/core/qgsdataprovider.h

+15-4
Original file line numberDiff line numberDiff line change
@@ -199,19 +199,30 @@ class QgsDataProvider : public QObject
199199
{
200200
return QString::null;
201201
}
202-
202+
203203
/**
204204
* Sub-layers handled by this provider, in order from bottom to top
205205
*
206206
* Sub-layers are used when the provider's source can combine layers
207207
* it knows about in some way before it hands them off to the provider.
208208
*/
209-
virtual QStringList subLayers()
209+
virtual QStringList subLayers() const
210210
{
211211
return QStringList(); // Empty
212212
}
213-
214-
213+
214+
/**
215+
* Sub-layer styles for each sub-layer handled by this provider,
216+
* in order from bottom to top
217+
*
218+
* Sub-layer styles are used to abstract the way the provider's source can symbolise
219+
* layers in some way at the server, before it serves them to the provider.
220+
*/
221+
virtual QStringList subLayerStyles() const
222+
{
223+
return QStringList(); // Empty
224+
}
225+
215226
/** return the number of layers for the current data source
216227
217228
@note

src/core/qgsrasterdataprovider.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,16 @@ class QgsRasterDataProvider : public QgsDataProvider
7070
//! get raster image encodings supported by (e.g.) the WMS Server, expressed as MIME types
7171
virtual QStringList supportedImageEncodings() = 0;
7272

73+
/**
74+
* Get the image encoding (as a MIME type) used in the transfer from (e.g.) the WMS server
75+
*/
76+
virtual QString imageEncoding() const = 0;
77+
7378
/**
7479
* Set the image encoding (as a MIME type) used in the transfer from (e.g.) the WMS server
7580
*/
7681
virtual void setImageEncoding(QString const & mimeType) = 0;
77-
82+
7883
/**
7984
* Set the image projection (in WMS CRS format) used in the transfer from (e.g.) the WMS server
8085
*/

src/providers/wms/qgswmsprovider.cpp

+14-2
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,12 @@ void QgsWmsProvider::setSubLayerVisibility(QString const & name, bool vis)
319319
}
320320

321321

322+
QString QgsWmsProvider::imageEncoding() const
323+
{
324+
return imageMimeType;
325+
}
326+
327+
322328
void QgsWmsProvider::setImageEncoding(QString const & mimeType)
323329
{
324330
#ifdef QGISDEBUG
@@ -1882,13 +1888,19 @@ QStringList QgsWmsProvider::supportedImageEncodings()
18821888
return mCapabilities.capability.request.getMap.format;
18831889
}
18841890

1885-
1886-
QStringList QgsWmsProvider::subLayers()
1891+
1892+
QStringList QgsWmsProvider::subLayers() const
18871893
{
18881894
return activeSubLayers;
18891895
}
18901896

18911897

1898+
QStringList QgsWmsProvider::subLayerStyles() const
1899+
{
1900+
return activeSubStyles;
1901+
}
1902+
1903+
18921904
void QgsWmsProvider::showStatusMessage(QString const & theMessage)
18931905
{
18941906
// Pass-through

src/providers/wms/qgswmsprovider.h

+9-1
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,11 @@ class QgsWmsProvider : public QgsRasterDataProvider
404404
*/
405405
void setSubLayerVisibility(QString const & name, bool vis);
406406

407+
/**
408+
* Get the image encoding (as a MIME type) used in the transfer from the WMS server
409+
*/
410+
QString imageEncoding() const;
411+
407412
/**
408413
* Set the image encoding (as a MIME type) used in the transfer from the WMS server
409414
*/
@@ -478,7 +483,10 @@ class QgsWmsProvider : public QgsRasterDataProvider
478483
* layers in some way at the server, before it serves them to this
479484
* WMS client.
480485
*/
481-
QStringList subLayers();
486+
QStringList subLayers() const;
487+
488+
QStringList subLayerStyles() const;
489+
482490

483491
// TODO: Get the WMS connection
484492

src/raster/qgsrasterlayer.cpp

+119-7
Original file line numberDiff line numberDiff line change
@@ -3595,9 +3595,9 @@ QPixmap QgsRasterLayer::getDetailedLegendQPixmap(int theLabelCountInt=3)
35953595

35963596
// Useful for Provider mode
35973597

3598-
QStringList QgsRasterLayer::subLayers()
3598+
QStringList QgsRasterLayer::subLayers() const
35993599
{
3600-
3600+
36013601
if (dataProvider)
36023602
{
36033603
return dataProvider->subLayers();
@@ -4482,13 +4482,71 @@ Raster layer project file XML of form:
44824482
bool QgsRasterLayer::readXML_( QDomNode & layer_node )
44834483
{
44844484
//! @NOTE Make sure to read the file first so stats etc are initialised properly!
4485-
4486-
if ( ! readFile( source() ) ) // Data source name set in
4487-
// QgsMapLayer::readXML()
4485+
4486+
//process provider key
4487+
QDomNode pkeyNode = layer_node.namedItem("provider");
4488+
4489+
if (pkeyNode.isNull())
44884490
{
4489-
QgsLogger::warning(QString(__FILE__) + ":" + QString(__LINE__) + " unable to read from raster file " + source());
4490-
return false;
4491+
mProviderKey = "";
4492+
}
4493+
else
4494+
{
4495+
QDomElement pkeyElt = pkeyNode.toElement();
4496+
mProviderKey = pkeyElt.text();
44914497
}
4498+
4499+
// Open the raster source based on provider and datasource
4500+
4501+
if (!mProviderKey.isEmpty())
4502+
{
4503+
// Go down the raster-data-provider paradigm
4504+
4505+
// Collect provider-specific information
4506+
4507+
QDomNode rpNode = layer_node.namedItem("rasterproperties");
4508+
4509+
// Collect sublayer names and styles
4510+
QStringList layers;
4511+
QStringList styles;
4512+
QDomElement layerElement = rpNode.firstChildElement("wmsSublayer");
4513+
while (!layerElement.isNull())
4514+
{
4515+
// TODO: sublayer visibility - post-0.8 release timeframe
4516+
4517+
// collect name for the sublayer
4518+
layers += layerElement.namedItem("name").toElement().text();
4519+
4520+
// collect style for the sublayer
4521+
styles += layerElement.namedItem("style").toElement().text();
4522+
4523+
layerElement = layerElement.nextSiblingElement("wmsSublayer");
4524+
}
4525+
4526+
// Collect format
4527+
QString format = rpNode.namedItem("wmsFormat").toElement().text();
4528+
4529+
// Convert CRS from the coordinate transformation node
4530+
// which was collected earlier in QgsMapLayer::readXML()
4531+
QString crs = QString("EPSG:%1")
4532+
.arg(mCoordinateTransform->sourceSRS().epsg());
4533+
4534+
setDataProvider( mProviderKey, layers, styles, format, crs );
4535+
}
4536+
else
4537+
{
4538+
// Go down the monolithic-gdal-provider paradigm
4539+
4540+
if (!readFile(source())) // Data source name set in
4541+
// QgsMapLayer::readXML()
4542+
{
4543+
QgsLogger::warning(QString(__FILE__) + ":" + QString(__LINE__) +
4544+
" unable to read from raster file " + source());
4545+
return false;
4546+
}
4547+
4548+
}
4549+
44924550
QDomNode mnl = layer_node.namedItem("rasterproperties");
44934551

44944552
QDomNode snode = mnl.namedItem("showDebugOverlayFlag");
@@ -4552,10 +4610,64 @@ bool QgsRasterLayer::readXML_( QDomNode & layer_node )
45524610

45534611
mapLayerNode.setAttribute( "type", "raster" );
45544612

4613+
// add provider node
4614+
4615+
QDomElement provider = document.createElement( "provider" );
4616+
QDomText providerText = document.createTextNode( mProviderKey );
4617+
provider.appendChild( providerText );
4618+
layer_node.appendChild( provider );
4619+
45554620
// <rasterproperties>
45564621
QDomElement rasterPropertiesElement = document.createElement( "rasterproperties" );
45574622
mapLayerNode.appendChild( rasterPropertiesElement );
45584623

4624+
if (!mProviderKey.isEmpty())
4625+
{
4626+
QStringList sl = subLayers();
4627+
QStringList sls = dataProvider->subLayerStyles();
4628+
4629+
QStringList::const_iterator layerStyle = sls.begin();
4630+
4631+
// <rasterproperties><wmsSublayer>
4632+
for ( QStringList::const_iterator layerName = sl.begin();
4633+
layerName != sl.end();
4634+
++layerName )
4635+
{
4636+
4637+
#ifdef QGISDEBUG
4638+
std::cout << "<rasterproperties><wmsSublayer> " << layerName->toLocal8Bit().data() << std::endl;
4639+
#endif
4640+
4641+
QDomElement sublayerElement = document.createElement("wmsSublayer");
4642+
4643+
// TODO: sublayer visibility - post-0.8 release timeframe
4644+
4645+
// <rasterproperties><wmsSublayer><name>
4646+
QDomElement sublayerNameElement = document.createElement("name");
4647+
QDomText sublayerNameText = document.createTextNode(*layerName);
4648+
sublayerNameElement.appendChild(sublayerNameText);
4649+
sublayerElement.appendChild(sublayerNameElement);
4650+
4651+
// <rasterproperties><wmsSublayer><style>
4652+
QDomElement sublayerStyleElement = document.createElement("style");
4653+
QDomText sublayerStyleText = document.createTextNode(*layerStyle);
4654+
sublayerStyleElement.appendChild(sublayerStyleText);
4655+
sublayerElement.appendChild(sublayerStyleElement);
4656+
4657+
rasterPropertiesElement.appendChild(sublayerElement);
4658+
4659+
// This assumes there are exactly the same number of "layerName"s as there are "layerStyle"s
4660+
++layerStyle;
4661+
}
4662+
4663+
// <rasterproperties><wmsFormat>
4664+
QDomElement formatElement = document.createElement("wmsFormat");
4665+
QDomText formatText =
4666+
document.createTextNode(dataProvider->imageEncoding());
4667+
formatElement.appendChild(formatText);
4668+
rasterPropertiesElement.appendChild(formatElement);
4669+
}
4670+
45594671
// <showDebugOverlayFlag>
45604672
QDomElement showDebugOverlayFlagElement = document.createElement( "showDebugOverlayFlag" );
45614673

src/raster/qgsrasterlayer.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -704,7 +704,7 @@ class QgsRasterLayer : public QgsMapLayer
704704
* (Useful for providers that manage their own layers, such as WMS)
705705
*
706706
*/
707-
QStringList subLayers();
707+
QStringList subLayers() const;
708708

709709
/**
710710
* Reorders the *previously selected* sublayers of this layer from bottom to top
@@ -1078,7 +1078,7 @@ public slots:
10781078
//! pointer for loading the provider library
10791079
QLibrary *myLib;
10801080

1081-
//! Pointer to data provider derived from the abastract base class QgsDataProvider
1081+
//! Pointer to data provider derived from the abstract base class QgsDataProvider
10821082
QgsRasterDataProvider *dataProvider;
10831083

10841084
/**Flag indicating wheter the layer is in editing mode or not*/

0 commit comments

Comments
 (0)