26 #include <QTextStream> 27 #include <QDomDocument> 40 QgsProjectFileTransform::TransformItem QgsProjectFileTransform::sTransformers[] =
42 {
PFV( 0, 8, 0 ),
PFV( 0, 8, 1 ), &QgsProjectFileTransform::transformNull},
43 {
PFV( 0, 8, 1 ),
PFV( 0, 9, 0 ), &QgsProjectFileTransform::transform081to090},
44 {
PFV( 0, 9, 0 ),
PFV( 0, 9, 1 ), &QgsProjectFileTransform::transformNull},
45 {
PFV( 0, 9, 1 ),
PFV( 0, 10, 0 ), &QgsProjectFileTransform::transform091to0100},
48 {
PFV( 0, 9, 2 ),
PFV( 0, 11, 0 ), &QgsProjectFileTransform::transformNull},
49 {
PFV( 0, 10, 0 ),
PFV( 0, 11, 0 ), &QgsProjectFileTransform::transform0100to0110},
50 {
PFV( 0, 11, 0 ),
PFV( 1, 0, 0 ), &QgsProjectFileTransform::transform0110to1000},
51 {
PFV( 1, 0, 0 ),
PFV( 1, 1, 0 ), &QgsProjectFileTransform::transformNull},
52 {
PFV( 1, 0, 2 ),
PFV( 1, 1, 0 ), &QgsProjectFileTransform::transformNull},
53 {
PFV( 1, 1, 0 ),
PFV( 1, 2, 0 ), &QgsProjectFileTransform::transform1100to1200},
54 {
PFV( 1, 2, 0 ),
PFV( 1, 3, 0 ), &QgsProjectFileTransform::transformNull},
55 {
PFV( 1, 3, 0 ),
PFV( 1, 4, 0 ), &QgsProjectFileTransform::transformNull},
56 {
PFV( 1, 4, 0 ),
PFV( 1, 5, 0 ), &QgsProjectFileTransform::transform1400to1500},
57 {
PFV( 1, 5, 0 ),
PFV( 1, 6, 0 ), &QgsProjectFileTransform::transformNull},
58 {
PFV( 1, 6, 0 ),
PFV( 1, 7, 0 ), &QgsProjectFileTransform::transformNull},
59 {
PFV( 1, 7, 0 ),
PFV( 1, 8, 0 ), &QgsProjectFileTransform::transformNull},
60 {
PFV( 1, 8, 0 ),
PFV( 1, 9, 0 ), &QgsProjectFileTransform::transform1800to1900},
61 {
PFV( 1, 9, 0 ),
PFV( 2, 0, 0 ), &QgsProjectFileTransform::transformNull},
62 {
PFV( 2, 0, 0 ),
PFV( 2, 1, 0 ), &QgsProjectFileTransform::transformNull},
63 {
PFV( 2, 1, 0 ),
PFV( 2, 2, 0 ), &QgsProjectFileTransform::transformNull},
64 {
PFV( 2, 2, 0 ),
PFV( 2, 3, 0 ), &QgsProjectFileTransform::transform2200to2300},
68 {
PFV(),
PFV( 2, 99, 0 ), &QgsProjectFileTransform::transform2990},
73 Q_UNUSED( newVersion );
74 bool returnValue =
false;
78 for ( std::size_t i = 0; i <
sizeof( sTransformers ) /
sizeof( TransformItem ); i++ )
80 const TransformItem &transformer = sTransformers[i];
81 if ( transformer.from == mCurrentVersion || transformer.from.
isNull() )
84 ( this->*( transformer.transformFunc ) )();
85 mCurrentVersion = transformer.to;
95 QgsDebugMsg( QString(
"Current project file version is %1.%2.%3" )
101 std::cout << mDom.toString( 2 ).toLatin1().constData();
109 void QgsProjectFileTransform::transform081to090()
112 if ( ! mDom.isNull() )
116 QDomElement mapCanvas;
119 QDomNode qgis = mDom.firstChildElement( QStringLiteral(
"qgis" ) );
120 if ( ! qgis.isNull() )
125 mapCanvas = mDom.createElement( QStringLiteral(
"mapcanvas" ) );
127 qgis.appendChild( mapCanvas );
129 mapCanvas.appendChild( qgis.namedItem( QStringLiteral(
"units" ) ) );
131 mapCanvas.appendChild( qgis.namedItem( QStringLiteral(
"extent" ) ) );
135 QDomElement properties = qgis.firstChildElement( QStringLiteral(
"properties" ) );
136 QDomElement spatial = properties.firstChildElement( QStringLiteral(
"SpatialRefSys" ) );
137 QDomElement hasCrsTransformEnabled = spatial.firstChildElement( QStringLiteral(
"ProjectionsEnabled" ) );
140 QDomElement projection = mDom.createElement( QStringLiteral(
"projections" ) );
141 QgsDebugMsg( QString(
"Projection flag: " ) + hasCrsTransformEnabled.text() );
143 projection.appendChild( mDom.createTextNode( hasCrsTransformEnabled.text() ) );
145 mapCanvas.appendChild( projection );
152 QDomNodeList mapLayers = mDom.elementsByTagName( QStringLiteral(
"maplayer" ) );
153 bool doneDestination =
false;
154 for (
int i = 0; i < mapLayers.count(); i++ )
156 QDomNode mapLayer = mapLayers.item( i );
158 QDomNode coordinateTransform = mapLayer.namedItem( QStringLiteral(
"coordinatetransform" ) );
160 QDomNode sourceCrs = coordinateTransform.namedItem( QStringLiteral(
"sourcesrs" ) );
162 sourceCrs.toElement().setTagName( QStringLiteral(
"srs" ) );
164 mapLayer.appendChild( sourceCrs );
167 if ( ! doneDestination )
170 QDomNode destinationCRS = coordinateTransform.namedItem( QStringLiteral(
"destinationsrs" ) );
173 mapCanvas.appendChild( destinationCRS );
175 doneDestination =
true;
177 mapLayer.removeChild( coordinateTransform );
184 QDomNodeList legendLayerFiles = mDom.elementsByTagName( QStringLiteral(
"legendlayerfile" ) );
185 QgsDebugMsg( QString(
"Legend layer file entries: " ) + QString::number( legendLayerFiles.count() ) );
186 for (
int i = 0; i < mapLayers.count(); i++ )
189 QDomElement mapLayer = mapLayers.item( i ).toElement();
191 QString
id = mapLayer.firstChildElement( QStringLiteral(
"id" ) ).text();
194 for (
int j = 0; j < legendLayerFiles.count(); j++ )
196 QDomElement legendLayerFile = legendLayerFiles.item( j ).toElement();
197 if (
id == legendLayerFile.attribute( QStringLiteral(
"layerid" ) ) )
203 legendLayerFile.setAttribute( QStringLiteral(
"visible" ), mapLayer.attribute( QStringLiteral(
"visible" ) ) );
206 legendLayerFile.setAttribute( QStringLiteral(
"isInOverview" ), mapLayer.attribute( QStringLiteral(
"showInOverviewFlag" ) ) );
213 void QgsProjectFileTransform::transform091to0100()
215 if ( ! mDom.isNull() )
218 QDomNodeList rasterPropertyList = mDom.elementsByTagName( QStringLiteral(
"rasterproperties" ) );
219 QgsDebugMsg( QString(
"Raster properties file entries: " ) + QString::number( rasterPropertyList.count() ) );
220 for (
int i = 0; i < rasterPropertyList.count(); i++ )
223 QDomNode rasterProperty = rasterPropertyList.item( i );
226 rasterProperty.namedItem( QStringLiteral(
"stdDevsToPlotDouble" ) ).toElement().setTagName( QStringLiteral(
"mStandardDeviations" ) );
228 rasterProperty.namedItem( QStringLiteral(
"invertHistogramFlag" ) ).toElement().setTagName( QStringLiteral(
"mInvertPixelsFlag" ) );
229 rasterProperty.namedItem( QStringLiteral(
"showDebugOverLayFlag" ) ).toElement().setTagName( QStringLiteral(
"mDebugOverLayFlag" ) );
231 rasterProperty.namedItem( QStringLiteral(
"redBandNameQString" ) ).toElement().setTagName( QStringLiteral(
"mRedBandName" ) );
232 rasterProperty.namedItem( QStringLiteral(
"blueBandNameQString" ) ).toElement().setTagName( QStringLiteral(
"mBlueBandName" ) );
233 rasterProperty.namedItem( QStringLiteral(
"greenBandNameQString" ) ).toElement().setTagName( QStringLiteral(
"mGreenBandName" ) );
234 rasterProperty.namedItem( QStringLiteral(
"grayBandNameQString" ) ).toElement().setTagName( QStringLiteral(
"mGrayBandName" ) );
238 QDomNodeList symbolPropertyList = mDom.elementsByTagName( QStringLiteral(
"symbol" ) );
239 for (
int i = 0; i < symbolPropertyList.count(); i++ )
242 QDomNode symbolProperty = symbolPropertyList.item( i );
244 QDomElement pointSymbol = symbolProperty.firstChildElement( QStringLiteral(
"pointsymbol" ) );
245 if ( pointSymbol.text().startsWith( QLatin1String(
"hard:" ) ) )
248 int lineWidth = symbolProperty.firstChildElement( QStringLiteral(
"outlinewidth" ) ).text().toInt();
249 int pointSize = symbolProperty.firstChildElement( QStringLiteral(
"pointsize" ) ).text().toInt();
251 if ( pointSize != 0 )
256 pointSize = pointSize + 2 + 2 * lineWidth;
257 QgsDebugMsg( QString(
"Setting point size to %1" ).arg( pointSize ) );
258 QDomElement newPointSizeProperty = mDom.createElement( QStringLiteral(
"pointsize" ) );
259 QDomText newPointSizeTxt = mDom.createTextNode( QString::number( pointSize ) );
260 newPointSizeProperty.appendChild( newPointSizeTxt );
261 symbolProperty.replaceChild( newPointSizeProperty, pointSymbol );
269 void QgsProjectFileTransform::transform0100to0110()
271 if ( ! mDom.isNull() )
273 #ifndef QT_NO_PRINTER 275 QPrinter myPrinter( QPrinter::ScreenResolution );
276 int screenDpi = myPrinter.resolution();
277 double widthScaleFactor = 25.4 / screenDpi;
279 QDomNodeList outlineWidthList = mDom.elementsByTagName( QStringLiteral(
"outlinewidth" ) );
280 for (
int i = 0; i < outlineWidthList.size(); ++i )
283 QDomElement currentOutlineElem = outlineWidthList.at( i ).toElement();
284 double outlineWidth = currentOutlineElem.text().toDouble();
285 outlineWidth *= widthScaleFactor;
288 QDomNode outlineTextNode = currentOutlineElem.firstChild();
289 QDomText newOutlineText = mDom.createTextNode( QString::number( outlineWidth ) );
290 currentOutlineElem.replaceChild( newOutlineText, outlineTextNode );
295 QDomNodeList pointSizeList = mDom.elementsByTagName( QStringLiteral(
"pointsize" ) );
296 for (
int i = 0; i < pointSizeList.size(); ++i )
299 QDomElement currentPointSizeElem = pointSizeList.at( i ).toElement();
300 double pointSize = currentPointSizeElem.text().toDouble();
301 pointSize *= widthScaleFactor;
304 QDomNode pointSizeTextNode = currentPointSizeElem.firstChild();
305 QDomText newPointSizeText = mDom.createTextNode( QString::number( static_cast< int >( pointSize ) ) );
306 currentPointSizeElem.replaceChild( newPointSizeText, pointSizeTextNode );
312 void QgsProjectFileTransform::transform0110to1000()
314 if ( ! mDom.isNull() )
316 QDomNodeList layerList = mDom.elementsByTagName( QStringLiteral(
"maplayer" ) );
317 for (
int i = 0; i < layerList.size(); ++i )
319 QDomElement layerElem = layerList.at( i ).toElement();
320 QString typeString = layerElem.attribute( QStringLiteral(
"type" ) );
321 if ( typeString != QLatin1String(
"vector" ) )
327 QDomNode dataSourceNode = layerElem.namedItem( QStringLiteral(
"datasource" ) );
328 if ( dataSourceNode.isNull() )
332 QString dataSource = dataSourceNode.toElement().text();
335 QDomNode providerNode = layerElem.namedItem( QStringLiteral(
"provider" ) );
336 if ( providerNode.isNull() )
340 QString providerKey = providerNode.toElement().text();
360 QDomNodeList classificationFieldList = layerElem.elementsByTagName( QStringLiteral(
"classificationfield" ) );
361 for (
int j = 0; j < classificationFieldList.size(); ++j )
363 QDomElement classificationFieldElem = classificationFieldList.
at( j ).toElement();
364 int fieldNumber = classificationFieldElem.text().toInt();
365 if ( fieldNumber >= 0 && fieldNumber < fields.
count() )
367 QDomText fieldName = mDom.createTextNode( fields.
at( fieldNumber ).
name() );
368 QDomNode nameNode = classificationFieldElem.firstChild();
369 classificationFieldElem.replaceChild( fieldName, nameNode );
377 void QgsProjectFileTransform::transform1100to1200()
383 QDomNode qgis = mDom.firstChildElement( QStringLiteral(
"qgis" ) );
387 QDomElement properties = qgis.firstChildElement( QStringLiteral(
"properties" ) );
388 if ( properties.isNull() )
391 QDomElement digitizing = properties.firstChildElement( QStringLiteral(
"Digitizing" ) );
392 if ( digitizing.isNull() )
395 QDomElement tolList = digitizing.firstChildElement( QStringLiteral(
"LayerSnappingToleranceList" ) );
396 if ( tolList.isNull() )
399 QDomElement tolUnitList = digitizing.firstChildElement( QStringLiteral(
"LayerSnappingToleranceUnitList" ) );
400 if ( !tolUnitList.isNull() )
404 for (
int i = 0; i < tolList.childNodes().count(); i++ )
405 units << QStringLiteral(
"0" );
408 value.
writeXml( QStringLiteral(
"LayerSnappingToleranceUnitList" ), digitizing, mDom );
411 void QgsProjectFileTransform::transform1400to1500()
419 QDomNodeList layerItemList = mDom.elementsByTagName( QStringLiteral(
"LayerItem" ) );
420 QDomElement currentLayerItemElem;
421 QString currentLayerId;
423 for (
int i = 0; i < layerItemList.size(); ++i )
425 currentLayerItemElem = layerItemList.at( i ).toElement();
426 if ( currentLayerItemElem.isNull() )
430 currentLayerId = currentLayerItemElem.attribute( QStringLiteral(
"layerId" ) );
432 QDomNodeList vectorClassificationList = currentLayerItemElem.elementsByTagName( QStringLiteral(
"VectorClassificationItem" ) );
433 QDomElement currentClassificationElem;
434 for (
int j = 0; j < vectorClassificationList.size(); ++j )
436 currentClassificationElem = vectorClassificationList.at( j ).toElement();
437 if ( !currentClassificationElem.isNull() )
439 currentClassificationElem.setAttribute( QStringLiteral(
"layerId" ), currentLayerId );
444 QDomNodeList textItemList = currentLayerItemElem.elementsByTagName( QStringLiteral(
"TextItem" ) );
445 QDomElement currentTextItem;
447 for (
int j = 0; j < textItemList.size(); ++j )
449 currentTextItem = textItemList.at( j ).toElement();
450 if ( currentTextItem.isNull() )
455 QDomElement classificationElement;
456 if ( !vectorClassificationList.isEmpty() )
458 classificationElement = mDom.createElement( QStringLiteral(
"VectorClassificationItem" ) );
462 classificationElement = mDom.createElement( QStringLiteral(
"RasterClassificationItem" ) );
465 classificationElement.setAttribute( QStringLiteral(
"layerId" ), currentLayerId );
466 classificationElement.setAttribute( QStringLiteral(
"text" ), currentTextItem.attribute( QStringLiteral(
"text" ) ) );
467 currentLayerItemElem.replaceChild( classificationElement, currentTextItem );
472 void QgsProjectFileTransform::transform1800to1900()
482 QDomNodeList layerItemList = mDom.elementsByTagName( QStringLiteral(
"rasterproperties" ) );
483 for (
int i = 0; i < layerItemList.size(); ++i )
485 QDomElement rasterPropertiesElem = layerItemList.at( i ).toElement();
486 QDomNode layerNode = rasterPropertiesElem.parentNode();
487 QDomElement dataSourceElem = layerNode.firstChildElement( QStringLiteral(
"datasource" ) );
488 QDomElement layerNameElem = layerNode.firstChildElement( QStringLiteral(
"layername" ) );
492 rasterLayer.
readLayerXml( layerNode.toElement(), context );
498 QDomNodeList composerMapList = mDom.elementsByTagName( QStringLiteral(
"ComposerMap" ) );
499 for (
int i = 0; i < composerMapList.size(); ++i )
501 QDomNodeList gridList = composerMapList.at( i ).toElement().elementsByTagName( QStringLiteral(
"Grid" ) );
502 for (
int j = 0; j < gridList.size(); ++j )
504 QDomNodeList annotationList = gridList.at( j ).toElement().elementsByTagName( QStringLiteral(
"Annotation" ) );
505 for (
int k = 0; k < annotationList.size(); ++k )
507 QDomElement annotationElem = annotationList.at( k ).toElement();
510 if ( annotationElem.hasAttribute( QStringLiteral(
"position" ) ) )
512 int pos = annotationElem.attribute( QStringLiteral(
"position" ) ).toInt();
513 annotationElem.setAttribute( QStringLiteral(
"leftPosition" ), pos );
514 annotationElem.setAttribute( QStringLiteral(
"rightPosition" ), pos );
515 annotationElem.setAttribute( QStringLiteral(
"topPosition" ), pos );
516 annotationElem.setAttribute( QStringLiteral(
"bottomPosition" ), pos );
517 annotationElem.removeAttribute( QStringLiteral(
"position" ) );
521 if ( annotationElem.hasAttribute( QStringLiteral(
"direction" ) ) )
523 int dir = annotationElem.attribute( QStringLiteral(
"direction" ) ).toInt();
526 annotationElem.setAttribute( QStringLiteral(
"leftDirection" ), 0 );
527 annotationElem.setAttribute( QStringLiteral(
"rightDirection" ), 0 );
528 annotationElem.setAttribute( QStringLiteral(
"topDirection" ), 1 );
529 annotationElem.setAttribute( QStringLiteral(
"bottomDirection" ), 1 );
533 annotationElem.setAttribute( QStringLiteral(
"leftDirection" ), 1 );
534 annotationElem.setAttribute( QStringLiteral(
"rightDirection" ), 1 );
535 annotationElem.setAttribute( QStringLiteral(
"topDirection" ), 0 );
536 annotationElem.setAttribute( QStringLiteral(
"bottomDirection" ), 0 );
540 annotationElem.setAttribute( QStringLiteral(
"leftDirection" ), dir );
541 annotationElem.setAttribute( QStringLiteral(
"rightDirection" ), dir );
542 annotationElem.setAttribute( QStringLiteral(
"topDirection" ), dir );
543 annotationElem.setAttribute( QStringLiteral(
"bottomDirection" ), dir );
545 annotationElem.removeAttribute( QStringLiteral(
"direction" ) );
552 QDomNodeList composerList = mDom.elementsByTagName( QStringLiteral(
"Composer" ) );
553 for (
int i = 0; i < composerList.size(); ++i )
555 QDomElement composerElem = composerList.at( i ).toElement();
558 QDomElement compositionElem = composerElem.firstChildElement( QStringLiteral(
"Composition" ) );
559 if ( compositionElem.isNull() )
564 QDomNodeList composerChildren = composerElem.childNodes();
566 if ( composerChildren.size() < 1 )
571 for (
int j = composerChildren.size() - 1; j >= 0; --j )
573 QDomElement childElem = composerChildren.at( j ).toElement();
574 if ( childElem.tagName() == QLatin1String(
"Composition" ) )
579 composerElem.removeChild( childElem );
580 compositionElem.appendChild( childElem );
588 QDomNodeList rendererList = mDom.elementsByTagName( QStringLiteral(
"renderer-v2" ) );
589 for (
int i = 0; i < rendererList.size(); ++i )
591 QDomNodeList layerList = rendererList.at( i ).toElement().elementsByTagName( QStringLiteral(
"layer" ) );
592 for (
int j = 0; j < layerList.size(); ++j )
594 QDomElement layerElem = layerList.at( j ).toElement();
595 if ( layerElem.attribute( QStringLiteral(
"class" ) ) == QLatin1String(
"SimpleFill" ) )
597 QDomNodeList propList = layerElem.elementsByTagName( QStringLiteral(
"prop" ) );
598 for (
int k = 0; k < propList.size(); ++k )
600 QDomElement propElem = propList.at( k ).toElement();
601 if ( propElem.attribute( QStringLiteral(
"k" ) ) == QLatin1String(
"color" ) || propElem.attribute( QStringLiteral(
"k" ) ) == QLatin1String(
"color_border" ) )
603 propElem.setAttribute( QStringLiteral(
"v" ), propElem.attribute( QStringLiteral(
"v" ) ).section(
',', 0, 2 ) +
",255" );
613 void QgsProjectFileTransform::transform2200to2300()
616 QDomNodeList composerPictureList = mDom.elementsByTagName( QStringLiteral(
"ComposerPicture" ) );
617 for (
int i = 0; i < composerPictureList.size(); ++i )
619 QDomElement picture = composerPictureList.at( i ).toElement();
620 picture.setAttribute( QStringLiteral(
"anchorPoint" ), QString::number( 4 ) );
624 void QgsProjectFileTransform::transform2990()
627 QDomElement propsElem = mDom.firstChildElement( QStringLiteral(
"qgis" ) ).toElement().firstChildElement( QStringLiteral(
"properties" ) );
628 QDomNodeList srsNodes = propsElem.elementsByTagName( QStringLiteral(
"SpatialRefSys" ) );
630 QDomElement projElem;
631 if ( srsNodes.count() > 0 )
633 srsElem = srsNodes.at( 0 ).toElement();
634 QDomNodeList projNodes = srsElem.elementsByTagName( QStringLiteral(
"ProjectionsEnabled" ) );
635 if ( projNodes.count() == 0 )
637 projElem = mDom.createElement( QStringLiteral(
"ProjectionsEnabled" ) );
638 projElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"int" ) );
639 QDomText projText = mDom.createTextNode( QStringLiteral(
"0" ) );
640 projElem.appendChild( projText );
641 srsElem.appendChild( projElem );
646 srsElem = mDom.createElement( QStringLiteral(
"SpatialRefSys" ) );
647 projElem = mDom.createElement( QStringLiteral(
"ProjectionsEnabled" ) );
648 projElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"int" ) );
649 QDomText projText = mDom.createTextNode( QStringLiteral(
"0" ) );
650 projElem.appendChild( projText );
651 srsElem.appendChild( projElem );
652 propsElem.appendChild( srsElem );
657 QDomNodeList canvasNodes = mDom.elementsByTagName( QStringLiteral(
"mapcanvas" ) );
658 if ( canvasNodes.count() > 0 )
660 QDomElement canvasElem = canvasNodes.at( 0 ).toElement();
661 QDomNodeList canvasSrsNodes = canvasElem.elementsByTagName( QStringLiteral(
"spatialrefsys" ) );
662 if ( canvasSrsNodes.count() > 0 )
664 QDomElement canvasSrsElem = canvasSrsNodes.at( 0 ).toElement();
669 QDomNodeList proj4Nodes = canvasSrsElem.elementsByTagName( QStringLiteral(
"proj4" ) );
670 if ( proj4Nodes.count() > 0 )
672 QDomElement proj4Node = proj4Nodes.at( 0 ).toElement();
673 proj = proj4Node.text();
675 QDomNodeList authidNodes = canvasSrsElem.elementsByTagName( QStringLiteral(
"authid" ) );
676 if ( authidNodes.count() > 0 )
678 QDomElement authidNode = authidNodes.at( 0 ).toElement();
679 authid = authidNode.text();
681 QDomNodeList srsidNodes = canvasSrsElem.elementsByTagName( QStringLiteral(
"srsid" ) );
682 if ( srsidNodes.count() > 0 )
684 QDomElement srsidNode = srsidNodes.at( 0 ).toElement();
685 srsid = srsidNode.text();
689 QDomNodeList oldProjectProj4Nodes = srsElem.elementsByTagName( QStringLiteral(
"ProjectCRSProj4String" ) );
690 for (
int i = oldProjectProj4Nodes.count(); i >= 0; --i )
692 srsElem.removeChild( oldProjectProj4Nodes.at( i ) );
694 QDomNodeList oldProjectCrsNodes = srsElem.elementsByTagName( QStringLiteral(
"ProjectCrs" ) );
695 for (
int i = oldProjectCrsNodes.count(); i >= 0; --i )
697 srsElem.removeChild( oldProjectCrsNodes.at( i ) );
699 QDomNodeList oldProjectCrsIdNodes = srsElem.elementsByTagName( QStringLiteral(
"ProjectCRSID" ) );
700 for (
int i = oldProjectCrsIdNodes.count(); i >= 0; --i )
702 srsElem.removeChild( oldProjectCrsIdNodes.at( i ) );
704 QDomNodeList projectionsEnabledNodes = srsElem.elementsByTagName( QStringLiteral(
"ProjectionsEnabled" ) );
705 for (
int i = projectionsEnabledNodes.count(); i >= 0; --i )
707 srsElem.removeChild( projectionsEnabledNodes.at( i ) );
710 QDomElement proj4Elem = mDom.createElement( QStringLiteral(
"ProjectCRSProj4String" ) );
711 proj4Elem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"QString" ) );
712 QDomText proj4Text = mDom.createTextNode( proj );
713 proj4Elem.appendChild( proj4Text );
714 QDomElement projectCrsElem = mDom.createElement( QStringLiteral(
"ProjectCrs" ) );
715 projectCrsElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"QString" ) );
716 QDomText projectCrsText = mDom.createTextNode( authid );
717 projectCrsElem.appendChild( projectCrsText );
718 QDomElement projectCrsIdElem = mDom.createElement( QStringLiteral(
"ProjectCRSID" ) );
719 projectCrsIdElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"int" ) );
720 QDomText srsidText = mDom.createTextNode( srsid );
721 projectCrsIdElem.appendChild( srsidText );
722 QDomElement projectionsEnabledElem = mDom.createElement( QStringLiteral(
"ProjectionsEnabled" ) );
723 projectionsEnabledElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"int" ) );
724 QDomText projectionsEnabledText = mDom.createTextNode( QStringLiteral(
"1" ) );
725 projectionsEnabledElem.appendChild( projectionsEnabledText );
726 srsElem.appendChild( proj4Elem );
727 srsElem.appendChild( projectCrsElem );
728 srsElem.appendChild( projectCrsIdElem );
729 srsElem.appendChild( projectionsEnabledElem );
731 QDomNodeList srsNodes = propsElem.elementsByTagName( QStringLiteral(
"SpatialRefSys" ) );
732 for (
int i = srsNodes.count(); i >= 0; --i )
734 propsElem.removeChild( srsNodes.at( i ) );
736 propsElem.appendChild( srsElem );
741 QDomNodeList mapLayers = mDom.elementsByTagName( QStringLiteral(
"maplayer" ) );
743 for (
int mapLayerIndex = 0; mapLayerIndex < mapLayers.count(); ++mapLayerIndex )
745 QDomElement layerElem = mapLayers.at( mapLayerIndex ).toElement();
748 QDomElement fieldConfigurationElement = mDom.createElement( QStringLiteral(
"fieldConfiguration" ) );
749 layerElem.appendChild( fieldConfigurationElement );
751 QDomNodeList editTypeNodes = layerElem.namedItem( QStringLiteral(
"edittypes" ) ).childNodes();
752 QDomElement constraintExpressionsElem = mDom.createElement( QStringLiteral(
"constraintExpressions" ) );
753 layerElem.appendChild( constraintExpressionsElem );
755 for (
int i = 0; i < editTypeNodes.size(); ++i )
757 QDomNode editTypeNode = editTypeNodes.at( i );
758 QDomElement editTypeElement = editTypeNode.toElement();
760 QDomElement fieldElement = mDom.createElement( QStringLiteral(
"field" ) );
761 fieldConfigurationElement.appendChild( fieldElement );
763 QString name = editTypeElement.attribute( QStringLiteral(
"name" ) );
764 fieldElement.setAttribute( QStringLiteral(
"name" ), name );
765 QDomElement constraintExpressionElem = mDom.createElement( QStringLiteral(
"constraint" ) );
766 constraintExpressionElem.setAttribute( QStringLiteral(
"field" ), name );
767 constraintExpressionsElem.appendChild( constraintExpressionElem );
769 QDomElement editWidgetElement = mDom.createElement( QStringLiteral(
"editWidget" ) );
770 fieldElement.appendChild( editWidgetElement );
772 QString ewv2Type = editTypeElement.attribute( QStringLiteral(
"widgetv2type" ) );
773 editWidgetElement.setAttribute( QStringLiteral(
"type" ), ewv2Type );
775 QDomElement ewv2CfgElem = editTypeElement.namedItem( QStringLiteral(
"widgetv2config" ) ).toElement();
777 if ( !ewv2CfgElem.isNull() )
779 QDomElement editWidgetConfigElement = mDom.createElement( QStringLiteral(
"config" ) );
780 editWidgetElement.appendChild( editWidgetConfigElement );
782 QVariantMap editWidgetConfiguration;
784 QDomNamedNodeMap configAttrs = ewv2CfgElem.attributes();
785 for (
int configIndex = 0; configIndex < configAttrs.count(); ++configIndex )
787 QDomAttr configAttr = configAttrs.item( configIndex ).toAttr();
788 if ( configAttr.name() == QStringLiteral(
"fieldEditable" ) )
790 editWidgetConfigElement.setAttribute( QStringLiteral(
"fieldEditable" ), configAttr.value() );
792 else if ( configAttr.name() == QStringLiteral(
"labelOnTop" ) )
794 editWidgetConfigElement.setAttribute( QStringLiteral(
"labelOnTop" ), configAttr.value() );
796 else if ( configAttr.name() == QStringLiteral(
"notNull" ) )
798 editWidgetConfigElement.setAttribute( QStringLiteral(
"notNull" ), configAttr.value() );
800 else if ( configAttr.name() == QStringLiteral(
"constraint" ) )
802 constraintExpressionElem.setAttribute( QStringLiteral(
"exp" ), configAttr.value() );
804 else if ( configAttr.name() == QStringLiteral(
"constraintDescription" ) )
806 constraintExpressionElem.setAttribute( QStringLiteral(
"desc" ), configAttr.value() );
810 editWidgetConfiguration.insert( configAttr.name(), configAttr.value() );
814 if ( ewv2Type == QStringLiteral(
"ValueMap" ) )
816 QDomNodeList configElements = ewv2CfgElem.childNodes();
818 for (
int configIndex = 0; configIndex < configElements.count(); ++configIndex )
820 QDomElement configElem = configElements.at( configIndex ).toElement();
821 map.insert( configElem.attribute( QStringLiteral(
"key" ) ), configElem.attribute( QStringLiteral(
"value" ) ) );
823 editWidgetConfiguration.insert( QStringLiteral(
"map" ), map );
825 else if ( ewv2Type == QStringLiteral(
"Photo" ) )
827 editWidgetElement.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"ExternalResource" ) );
829 editWidgetConfiguration.insert( QStringLiteral(
"DocumentViewer" ), 1 );
830 editWidgetConfiguration.insert( QStringLiteral(
"DocumentViewerHeight" ), editWidgetConfiguration.value( QStringLiteral(
"Height" ) ) );
831 editWidgetConfiguration.insert( QStringLiteral(
"DocumentViewerWidth" ), editWidgetConfiguration.value( QStringLiteral(
"Width" ) ) );
832 editWidgetConfiguration.insert( QStringLiteral(
"RelativeStorage" ), 1 );
834 else if ( ewv2Type == QStringLiteral(
"FileName" ) )
836 editWidgetElement.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"ExternalResource" ) );
838 editWidgetConfiguration.insert( QStringLiteral(
"RelativeStorage" ), 1 );
840 else if ( ewv2Type == QStringLiteral(
"WebView" ) )
842 editWidgetElement.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"ExternalResource" ) );
844 editWidgetConfiguration.insert( QStringLiteral(
"DocumentViewerHeight" ), editWidgetConfiguration.value( QStringLiteral(
"Height" ) ) );
845 editWidgetConfiguration.insert( QStringLiteral(
"DocumentViewerWidth" ), editWidgetConfiguration.value( QStringLiteral(
"Width" ) ) );
846 editWidgetConfiguration.insert( QStringLiteral(
"RelativeStorage" ), 1 );
860 QDomNode noDataNode = rasterPropertiesElem.namedItem( QStringLiteral(
"mNoDataValue" ) );
861 QDomElement noDataElement = noDataNode.toElement();
862 if ( !noDataElement.text().isEmpty() )
864 QgsDebugMsg(
"mNoDataValue = " + noDataElement.text() );
865 QDomElement noDataElem = doc.createElement( QStringLiteral(
"noData" ) );
867 QDomElement noDataRangeList = doc.createElement( QStringLiteral(
"noDataRangeList" ) );
868 noDataRangeList.setAttribute( QStringLiteral(
"bandNo" ), 1 );
870 QDomElement noDataRange = doc.createElement( QStringLiteral(
"noDataRange" ) );
871 noDataRange.setAttribute( QStringLiteral(
"min" ), noDataElement.text() );
872 noDataRange.setAttribute( QStringLiteral(
"max" ), noDataElement.text() );
873 noDataRangeList.appendChild( noDataRange );
875 noDataElem.appendChild( noDataRangeList );
877 parentNode.appendChild( noDataElem );
880 QDomElement rasterRendererElem = doc.createElement( QStringLiteral(
"rasterrenderer" ) );
884 rasterRendererElem.setAttribute( QStringLiteral(
"invertColor" ), QStringLiteral(
"0" ) );
885 QDomElement invertColorElem = rasterPropertiesElem.firstChildElement( QStringLiteral(
"mInvertColor" ) );
886 if ( !invertColorElem.isNull() )
888 if ( invertColorElem.text() == QLatin1String(
"true" ) )
890 rasterRendererElem.setAttribute( QStringLiteral(
"invertColor" ), QStringLiteral(
"1" ) );
895 rasterRendererElem.setAttribute( QStringLiteral(
"opacity" ), QStringLiteral(
"1" ) );
896 QDomElement transparencyElem = parentNode.firstChildElement( QStringLiteral(
"transparencyLevelInt" ) );
897 if ( !transparencyElem.isNull() )
899 double transparency = transparencyElem.text().toInt();
900 rasterRendererElem.setAttribute( QStringLiteral(
"opacity" ), QString::number( transparency / 255.0 ) );
904 rasterRendererElem.setAttribute( QStringLiteral(
"alphaBand" ), -1 );
907 int grayBand = rasterBandNumber( rasterPropertiesElem, QStringLiteral(
"mGrayBandName" ), rlayer );
910 QString drawingStyle = rasterPropertiesElem.firstChildElement( QStringLiteral(
"mDrawingStyle" ) ).text();
917 if ( drawingStyle == QLatin1String(
"PalettedColor" ) )
919 QDomElement customColorRampElem = rasterPropertiesElem.firstChildElement( QStringLiteral(
"customColorRamp" ) );
920 QDomNodeList colorRampEntryList = customColorRampElem.elementsByTagName( QStringLiteral(
"colorRampEntry" ) );
922 for (
int i = 0; i < colorRampEntryList.size(); ++i )
924 QDomElement colorRampEntryElem = colorRampEntryList.at( i ).toElement();
925 QString strValue = colorRampEntryElem.attribute( QStringLiteral(
"value" ) );
926 double value = strValue.toDouble();
927 if ( value < 0 || value > 10000 || !
qgsDoubleNear( value, static_cast< int >( value ) ) )
929 QgsDebugMsg( QString(
"forcing SingleBandPseudoColor value = %1" ).arg( value ) );
930 drawingStyle = QStringLiteral(
"SingleBandPseudoColor" );
936 if ( drawingStyle == QLatin1String(
"SingleBandGray" ) )
938 rasterRendererElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"singlebandgray" ) );
939 rasterRendererElem.setAttribute( QStringLiteral(
"grayBand" ), grayBand );
940 transformContrastEnhancement( doc, rasterPropertiesElem, rasterRendererElem );
942 else if ( drawingStyle == QLatin1String(
"SingleBandPseudoColor" ) )
944 rasterRendererElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"singlebandpseudocolor" ) );
945 rasterRendererElem.setAttribute( QStringLiteral(
"band" ), grayBand );
946 QDomElement newRasterShaderElem = doc.createElement( QStringLiteral(
"rastershader" ) );
947 QDomElement newColorRampShaderElem = doc.createElement( QStringLiteral(
"colorrampshader" ) );
948 newRasterShaderElem.appendChild( newColorRampShaderElem );
949 rasterRendererElem.appendChild( newRasterShaderElem );
952 QString colorShadingAlgorithm = rasterPropertiesElem.firstChildElement( QStringLiteral(
"mColorShadingAlgorithm" ) ).text();
953 if ( colorShadingAlgorithm == QLatin1String(
"PseudoColorShader" ) || colorShadingAlgorithm == QLatin1String(
"FreakOutShader" ) )
955 newColorRampShaderElem.setAttribute( QStringLiteral(
"colorRampType" ), QStringLiteral(
"INTERPOLATED" ) );
961 double breakSize = ( maxValue - minValue ) / 3;
963 QStringList colorList;
964 if ( colorShadingAlgorithm == QLatin1String(
"FreakOutShader" ) )
966 colorList << QStringLiteral(
"#ff00ff" ) << QStringLiteral(
"#00ffff" ) << QStringLiteral(
"#ff0000" ) << QStringLiteral(
"#00ff00" );
970 colorList << QStringLiteral(
"#0000ff" ) << QStringLiteral(
"#00ffff" ) << QStringLiteral(
"#ffff00" ) << QStringLiteral(
"#ff0000" );
972 QStringList::const_iterator colorIt = colorList.constBegin();
973 double boundValue = minValue;
974 for ( ; colorIt != colorList.constEnd(); ++colorIt )
976 QDomElement newItemElem = doc.createElement( QStringLiteral(
"item" ) );
977 newItemElem.setAttribute( QStringLiteral(
"value" ), QString::number( boundValue ) );
978 newItemElem.setAttribute( QStringLiteral(
"label" ), QString::number( boundValue ) );
979 newItemElem.setAttribute( QStringLiteral(
"color" ), *colorIt );
980 newColorRampShaderElem.appendChild( newItemElem );
981 boundValue += breakSize;
984 else if ( colorShadingAlgorithm == QLatin1String(
"ColorRampShader" ) )
986 QDomElement customColorRampElem = rasterPropertiesElem.firstChildElement( QStringLiteral(
"customColorRamp" ) );
987 QString type = customColorRampElem.firstChildElement( QStringLiteral(
"colorRampType" ) ).text();
988 newColorRampShaderElem.setAttribute( QStringLiteral(
"colorRampType" ), type );
989 QDomNodeList colorNodeList = customColorRampElem.elementsByTagName( QStringLiteral(
"colorRampEntry" ) );
991 QString value, label;
993 int red, green, blue;
994 QDomElement currentItemElem;
995 for (
int i = 0; i < colorNodeList.size(); ++i )
997 currentItemElem = colorNodeList.at( i ).toElement();
998 value = currentItemElem.attribute( QStringLiteral(
"value" ) );
999 label = currentItemElem.attribute( QStringLiteral(
"label" ) );
1000 red = currentItemElem.attribute( QStringLiteral(
"red" ) ).toInt();
1001 green = currentItemElem.attribute( QStringLiteral(
"green" ) ).toInt();
1002 blue = currentItemElem.attribute( QStringLiteral(
"blue" ) ).toInt();
1003 newColor = QColor( red, green, blue );
1004 QDomElement newItemElem = doc.createElement( QStringLiteral(
"item" ) );
1005 newItemElem.setAttribute( QStringLiteral(
"value" ), value );
1006 newItemElem.setAttribute( QStringLiteral(
"label" ), label );
1007 newItemElem.setAttribute( QStringLiteral(
"color" ), newColor.name() );
1008 newColorRampShaderElem.appendChild( newItemElem );
1012 else if ( drawingStyle == QLatin1String(
"PalettedColor" ) )
1014 rasterRendererElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"paletted" ) );
1015 rasterRendererElem.setAttribute( QStringLiteral(
"band" ), grayBand );
1016 QDomElement customColorRampElem = rasterPropertiesElem.firstChildElement( QStringLiteral(
"customColorRamp" ) );
1017 QDomNodeList colorRampEntryList = customColorRampElem.elementsByTagName( QStringLiteral(
"colorRampEntry" ) );
1018 QDomElement newColorPaletteElem = doc.createElement( QStringLiteral(
"colorPalette" ) );
1024 QDomElement colorRampEntryElem;
1025 for (
int i = 0; i < colorRampEntryList.size(); ++i )
1027 colorRampEntryElem = colorRampEntryList.at( i ).toElement();
1028 QDomElement newPaletteElem = doc.createElement( QStringLiteral(
"paletteEntry" ) );
1029 value =
static_cast< int >( colorRampEntryElem.attribute( QStringLiteral(
"value" ) ).toDouble() );
1030 newPaletteElem.setAttribute( QStringLiteral(
"value" ), value );
1031 red = colorRampEntryElem.attribute( QStringLiteral(
"red" ) ).toInt();
1032 green = colorRampEntryElem.attribute( QStringLiteral(
"green" ) ).toInt();
1033 blue = colorRampEntryElem.attribute( QStringLiteral(
"blue" ) ).toInt();
1034 newPaletteElem.setAttribute( QStringLiteral(
"color" ), QColor( red, green, blue ).name() );
1035 QString label = colorRampEntryElem.attribute( QStringLiteral(
"label" ) );
1036 if ( !label.isEmpty() )
1038 newPaletteElem.setAttribute( QStringLiteral(
"label" ), label );
1040 newColorPaletteElem.appendChild( newPaletteElem );
1042 rasterRendererElem.appendChild( newColorPaletteElem );
1044 else if ( drawingStyle == QLatin1String(
"MultiBandColor" ) )
1046 rasterRendererElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"multibandcolor" ) );
1049 int redBand = rasterBandNumber( rasterPropertiesElem, QStringLiteral(
"mRedBandName" ), rlayer );
1050 int greenBand = rasterBandNumber( rasterPropertiesElem, QStringLiteral(
"mGreenBandName" ), rlayer );
1051 int blueBand = rasterBandNumber( rasterPropertiesElem, QStringLiteral(
"mBlueBandName" ), rlayer );
1052 rasterRendererElem.setAttribute( QStringLiteral(
"redBand" ), redBand );
1053 rasterRendererElem.setAttribute( QStringLiteral(
"greenBand" ), greenBand );
1054 rasterRendererElem.setAttribute( QStringLiteral(
"blueBand" ), blueBand );
1056 transformContrastEnhancement( doc, rasterPropertiesElem, rasterRendererElem );
1064 if ( !parentNode.isNull() )
1066 parentNode.replaceChild( rasterRendererElem, rasterPropertiesElem );
1070 int QgsProjectFileTransform::rasterBandNumber(
const QDomElement &rasterPropertiesElem,
const QString &bandName,
1079 QDomElement rasterBandElem = rasterPropertiesElem.firstChildElement( bandName );
1080 if ( !rasterBandElem.isNull() )
1082 QRegExp re(
"(\\d+)" );
1084 if ( re.indexIn( rasterBandElem.text() ) >= 0 )
1086 return re.cap( 1 ).toInt();
1092 void QgsProjectFileTransform::transformContrastEnhancement( QDomDocument &doc,
const QDomElement &rasterproperties, QDomElement &rendererElem )
1094 if ( rasterproperties.isNull() || rendererElem.isNull() )
1099 double minimumValue = 0;
1100 double maximumValue = 0;
1101 QDomElement contrastMinMaxElem = rasterproperties.firstChildElement( QStringLiteral(
"contrastEnhancementMinMaxValues" ) );
1102 if ( contrastMinMaxElem.isNull() )
1107 QDomElement contrastEnhancementAlgorithmElem = rasterproperties.firstChildElement( QStringLiteral(
"mContrastEnhancementAlgorithm" ) );
1108 if ( contrastEnhancementAlgorithmElem.isNull() )
1114 int algorithmEnum = 0;
1115 QString algorithmString = contrastEnhancementAlgorithmElem.text();
1116 if ( algorithmString == QLatin1String(
"StretchToMinimumMaximum" ) )
1120 else if ( algorithmString == QLatin1String(
"StretchAndClipToMinimumMaximum" ) )
1124 else if ( algorithmString == QLatin1String(
"ClipToMinimumMaximum" ) )
1128 else if ( algorithmString == QLatin1String(
"UserDefinedEnhancement" ) )
1133 QDomNodeList minMaxEntryList = contrastMinMaxElem.elementsByTagName( QStringLiteral(
"minMaxEntry" ) );
1134 QStringList enhancementNameList;
1135 if ( minMaxEntryList.size() == 1 )
1137 enhancementNameList << QStringLiteral(
"contrastEnhancement" );
1139 if ( minMaxEntryList.size() == 3 )
1141 enhancementNameList << QStringLiteral(
"redContrastEnhancement" ) << QStringLiteral(
"greenContrastEnhancement" ) << QStringLiteral(
"blueContrastEnhancement" );
1143 if ( minMaxEntryList.size() > enhancementNameList.size() )
1148 QDomElement minMaxEntryElem;
1149 for (
int i = 0; i < minMaxEntryList.size(); ++i )
1151 minMaxEntryElem = minMaxEntryList.at( i ).toElement();
1152 QDomElement minElem = minMaxEntryElem.firstChildElement( QStringLiteral(
"min" ) );
1153 if ( minElem.isNull() )
1157 minimumValue = minElem.text().toDouble();
1159 QDomElement maxElem = minMaxEntryElem.firstChildElement( QStringLiteral(
"max" ) );
1160 if ( maxElem.isNull() )
1164 maximumValue = maxElem.text().toDouble();
1166 QDomElement newContrastEnhancementElem = doc.createElement( enhancementNameList.at( i ) );
1167 QDomElement newMinValElem = doc.createElement( QStringLiteral(
"minValue" ) );
1168 QDomText minText = doc.createTextNode( QString::number( minimumValue ) );
1169 newMinValElem.appendChild( minText );
1170 newContrastEnhancementElem.appendChild( newMinValElem );
1171 QDomElement newMaxValElem = doc.createElement( QStringLiteral(
"maxValue" ) );
1172 QDomText maxText = doc.createTextNode( QString::number( maximumValue ) );
1173 newMaxValElem.appendChild( maxText );
1174 newContrastEnhancementElem.appendChild( newMaxValElem );
1176 QDomElement newAlgorithmElem = doc.createElement( QStringLiteral(
"algorithm" ) );
1177 QDomText newAlgorithmText = doc.createTextNode( QString::number( algorithmEnum ) );
1178 newAlgorithmElem.appendChild( newAlgorithmText );
1179 newContrastEnhancementElem.appendChild( newAlgorithmElem );
1181 rendererElem.appendChild( newContrastEnhancementElem );
1185 void QgsProjectFileTransform::transformRasterTransparency( QDomDocument &doc,
const QDomElement &orig, QDomElement &rendererElem )
1190 Q_UNUSED( rendererElem );
The class is used as a container of context for various read/write operations on other objects...
bool loadDefaultStyle
Set to true if the default layer style should be loaded.
void setPathResolver(const QgsPathResolver &resolver)
Sets up path resolver for conversion between relative and absolute paths.
Setting options for loading vector layers.
This class provides qgis with the ability to render raster datasets onto the mapcanvas.
double maximumValue
The maximum cell value in the raster band.
Container of fields for a vector layer.
bool isValid() const
Return the status of the layer.
bool isNull() const
Returns true if this is a NULL project version.
int count() const
Return number of items.
Project property value node, contains a QgsProjectPropertyKey's value.
bool qgsDoubleNear(double a, double b, double epsilon=4 *DBL_EPSILON)
Compare two doubles (but allow some difference)
QgsField at(int i) const
Get field at particular index (must be in range 0..N-1)
QgsRasterDataProvider * dataProvider() override
The RasterBandStats struct is a container for statistics about a single raster band.
QgsFields fields() const override=0
Returns the fields associated with this data provider.
A class to describe the version of a project.
bool readLayerXml(const QDomElement &layerElement, const QgsReadWriteContext &context)
Sets state from Dom document.
virtual QgsRasterBandStats bandStatistics(int bandNo, int stats=QgsRasterBandStats::All, const QgsRectangle &extent=QgsRectangle(), int sampleSize=0, QgsRasterBlockFeedback *feedback=nullptr)
Get band statistics.
bool writeXml(const QString &nodeName, QDomElement &element, QDomDocument &document) override
Writes the property hierarchy to a specified DOM element.
static QgsProject * instance()
Returns the QgsProject singleton instance.
QgsVectorDataProvider * dataProvider() override
Returns the layer's data provider.
double minimumValue
The minimum cell value in the raster band.
This is the base class for vector data providers.
Represents a vector layer which manages a vector based data sets.
static QDomElement writeVariant(const QVariant &value, QDomDocument &doc)
Write a QVariant to a QDomElement.