@@ -3595,9 +3595,9 @@ QPixmap QgsRasterLayer::getDetailedLegendQPixmap(int theLabelCountInt=3)
3595
3595
3596
3596
// Useful for Provider mode
3597
3597
3598
- QStringList QgsRasterLayer::subLayers ()
3598
+ QStringList QgsRasterLayer::subLayers () const
3599
3599
{
3600
-
3600
+
3601
3601
if (dataProvider)
3602
3602
{
3603
3603
return dataProvider->subLayers ();
@@ -4482,13 +4482,71 @@ Raster layer project file XML of form:
4482
4482
bool QgsRasterLayer::readXML_ ( QDomNode & layer_node )
4483
4483
{
4484
4484
// ! @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 ())
4488
4490
{
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 ();
4491
4497
}
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
+
4492
4550
QDomNode mnl = layer_node.namedItem (" rasterproperties" );
4493
4551
4494
4552
QDomNode snode = mnl.namedItem (" showDebugOverlayFlag" );
@@ -4552,10 +4610,64 @@ bool QgsRasterLayer::readXML_( QDomNode & layer_node )
4552
4610
4553
4611
mapLayerNode.setAttribute ( " type" , " raster" );
4554
4612
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
+
4555
4620
// <rasterproperties>
4556
4621
QDomElement rasterPropertiesElement = document.createElement ( " rasterproperties" );
4557
4622
mapLayerNode.appendChild ( rasterPropertiesElement );
4558
4623
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
+
4559
4671
// <showDebugOverlayFlag>
4560
4672
QDomElement showDebugOverlayFlagElement = document.createElement ( " showDebugOverlayFlag" );
4561
4673
0 commit comments