diff --git a/python/core/auto_generated/qgsmaplayer.sip.in b/python/core/auto_generated/qgsmaplayer.sip.in index 42c7685244b..bb9b2ed0846 100644 --- a/python/core/auto_generated/qgsmaplayer.sip.in +++ b/python/core/auto_generated/qgsmaplayer.sip.in @@ -1429,6 +1429,24 @@ Returns the layer's temporal properties. This may be ``None``, depending on the Returns the layer's elevation properties. This may be ``None``, depending on the layer type. .. versionadded:: 3.18 +%End + + QString legendPlaceholderImage() const; +%Docstring +Returns path to the placeholder image or an empty string if a generated legend is shown + +:return: placholder image path + +.. versionadded:: 3.22 +%End + + void setLegendPlaceholderImage( const QString &imgPath ); +%Docstring +Set placeholder image for legend. If the string is empty, a generated legend will be shown. + +:param imgPath: file path to the placeholder image + +.. versionadded:: 3.22 %End public slots: diff --git a/src/core/layertree/qgslayertreemodellegendnode.cpp b/src/core/layertree/qgslayertreemodellegendnode.cpp index 719a0d89b3d..4ca8aebf9ca 100644 --- a/src/core/layertree/qgslayertreemodellegendnode.cpp +++ b/src/core/layertree/qgslayertreemodellegendnode.cpp @@ -946,19 +946,23 @@ QSizeF QgsImageLegendNode::drawSymbol( const QgsLegendSettings &settings, ItemCo { Q_UNUSED( itemHeight ) - if ( ctx && ctx->painter ) + if ( ctx && ctx->painter && ctx->context ) { + QgsScopedRenderContextScaleToPixels scopedScaleToPixels( *( ctx->context ) ); + double scaleFactor = ctx->context->scaleFactor(); + double imgWidth = settings.wmsLegendSize().width() * scaleFactor; + double imgHeight = settings.wmsLegendSize().height() * scaleFactor; + + QImage scaledImg = mImage.scaled( QSizeF( imgWidth, imgHeight ).toSize(), Qt::KeepAspectRatio, Qt::SmoothTransformation ); switch ( settings.symbolAlignment() ) { case Qt::AlignLeft: default: - ctx->painter->drawImage( QRectF( ctx->columnLeft, ctx->top, settings.wmsLegendSize().width(), settings.wmsLegendSize().height() ), - mImage, QRectF( 0, 0, mImage.width(), mImage.height() ) ); + ctx->painter->drawImage( QPointF( ctx->columnLeft * scaleFactor, ctx->top * scaleFactor ), scaledImg ); break; case Qt::AlignRight: - ctx->painter->drawImage( QRectF( ctx->columnRight - settings.wmsLegendSize().width(), ctx->top, settings.wmsLegendSize().width(), settings.wmsLegendSize().height() ), - mImage, QRectF( 0, 0, mImage.width(), mImage.height() ) ); + ctx->painter->drawImage( QPointF( ctx->columnRight * scaleFactor - imgWidth, ctx->top * scaleFactor ), scaledImg ); break; } } diff --git a/src/core/qgsmaplayer.cpp b/src/core/qgsmaplayer.cpp index 9e77be0826e..4f789807dd4 100644 --- a/src/core/qgsmaplayer.cpp +++ b/src/core/qgsmaplayer.cpp @@ -406,6 +406,8 @@ bool QgsMapLayer::readLayerXml( const QDomElement &layerElement, QgsReadWriteCon mWgs84Extent = QgsXmlUtils::readRectangle( wgs84ExtentNode.toElement() ); } + mLegendPlaceholderImage = layerElement.attribute( QStringLiteral( "legendPlaceholderImage" ) ); + return ! layerError; } // bool QgsMapLayer::readLayerXML @@ -576,6 +578,8 @@ bool QgsMapLayer::writeLayerXml( QDomElement &layerElement, QDomDocument &docume mMetadata.writeMetadataXml( myMetadataElem, document ); layerElement.appendChild( myMetadataElem ); + layerElement.setAttribute( QStringLiteral( "legendPlaceholderImage" ), mLegendPlaceholderImage ); + // now append layer node to map layer node return writeXml( layerElement, document, context ); } diff --git a/src/core/qgsmaplayer.h b/src/core/qgsmaplayer.h index 7e02738b15b..c5ac3beb4cd 100644 --- a/src/core/qgsmaplayer.h +++ b/src/core/qgsmaplayer.h @@ -1279,6 +1279,20 @@ class CORE_EXPORT QgsMapLayer : public QObject */ virtual QgsMapLayerElevationProperties *elevationProperties() { return nullptr; } + /** + * Returns path to the placeholder image or an empty string if a generated legend is shown + * \return placholder image path + * \since QGIS 3.22 + */ + QString legendPlaceholderImage() const { return mLegendPlaceholderImage;} + + /** + * Set placeholder image for legend. If the string is empty, a generated legend will be shown. + * \param imgPath file path to the placeholder image + * \since QGIS 3.22 + */ + void setLegendPlaceholderImage( const QString &imgPath ) { mLegendPlaceholderImage = imgPath; } + public slots: /** @@ -1867,6 +1881,9 @@ class CORE_EXPORT QgsMapLayer : public QObject //! To avoid firing multiple time repaintRequested signal on circular layer circular dependencies bool mRepaintRequestedFired = false; + //! Path to placeholder image for layer legend. If the string is empty, a generated legend is shown + QString mLegendPlaceholderImage; + friend class QgsVectorLayer; }; diff --git a/src/core/qgsmaplayerlegend.cpp b/src/core/qgsmaplayerlegend.cpp index c633484a657..1c06baffab9 100644 --- a/src/core/qgsmaplayerlegend.cpp +++ b/src/core/qgsmaplayerlegend.cpp @@ -14,7 +14,8 @@ ***************************************************************************/ #include "qgsmaplayerlegend.h" - +#include "qgsiconutils.h" +#include "qgsimagecache.h" #include "qgssettings.h" #include "qgslayertree.h" #include "qgslayertreemodellegendnode.h" @@ -359,6 +360,18 @@ QList QgsDefaultVectorLayerLegend::createLayerTre { QList nodes; + if ( mLayer ) + { + QString placeholderImage = mLayer->legendPlaceholderImage(); + if ( !placeholderImage.isEmpty() ) + { + bool fitsInCache; + QImage img = QgsApplication::imageCache()->pathAsImage( placeholderImage, QSize(), false, 1.0, fitsInCache ); + nodes << new QgsImageLegendNode( nodeLayer, img ); + return nodes; + } + } + QgsFeatureRenderer *r = mLayer->renderer(); if ( !r ) return nodes; @@ -502,7 +515,14 @@ QList QgsDefaultRasterLayerLegend::createLayerTre nodes << new QgsWmsLegendNode( nodeLayer ); } - if ( mLayer->renderer() ) + QString placeholderImage = mLayer->legendPlaceholderImage(); + if ( !placeholderImage.isEmpty() ) + { + bool fitsInCache; + QImage img = QgsApplication::imageCache()->pathAsImage( placeholderImage, QSize(), false, 1.0, fitsInCache ); + nodes << new QgsImageLegendNode( nodeLayer, img ); + } + else if ( mLayer->renderer() ) nodes.append( mLayer->renderer()->createLegendNodes( nodeLayer ) ); return nodes; } diff --git a/src/gui/raster/qgsrasterlayerproperties.cpp b/src/gui/raster/qgsrasterlayerproperties.cpp index 01e4d3270c9..71443ed0f50 100644 --- a/src/gui/raster/qgsrasterlayerproperties.cpp +++ b/src/gui/raster/qgsrasterlayerproperties.cpp @@ -914,6 +914,8 @@ void QgsRasterLayerProperties::sync() QVariant wmsBackgroundLayer = mRasterLayer->customProperty( QStringLiteral( "WMSBackgroundLayer" ), false ); mBackgroundLayerCheckBox->setChecked( wmsBackgroundLayer.toBool() ); + mLegendPlaceholderWidget->setLastPathSettingsKey( QStringLiteral( "lastLegendPlaceholderDir" ) ); + mLegendPlaceholderWidget->setSource( mRasterLayer->legendPlaceholderImage() ); mLegendConfigEmbeddedWidget->setLayer( mRasterLayer ); mTemporalWidget->syncToLayer(); @@ -946,6 +948,7 @@ void QgsRasterLayerProperties::apply() /* * Legend Tab */ + mRasterLayer->setLegendPlaceholderImage( mLegendPlaceholderWidget->source() ); mLegendConfigEmbeddedWidget->applyToLayer(); QgsDebugMsgLevel( QStringLiteral( "apply processing symbology tab" ), 3 ); diff --git a/src/gui/vector/qgsvectorlayerlegendwidget.cpp b/src/gui/vector/qgsvectorlayerlegendwidget.cpp index af36769acd4..87f2540a86f 100644 --- a/src/gui/vector/qgsvectorlayerlegendwidget.cpp +++ b/src/gui/vector/qgsvectorlayerlegendwidget.cpp @@ -21,6 +21,7 @@ #include #include "qgsexpressionbuilderdialog.h" +#include "qgsfilecontentsourcelineedit.h" #include "qgsmapcanvas.h" #include "qgsmaplayerlegend.h" #include "qgsrenderer.h" @@ -71,10 +72,19 @@ QgsVectorLayerLegendWidget::QgsVectorLayerLegendWidget( QWidget *parent ) labelLegendLayout->addWidget( mLabelLegendTreeWidget ); mLabelLegendGroupBox->setLayout( labelLegendLayout ); + mPlaceholderImageLabel = new QLabel( tr( "Legend placeholder image" ) ); + mImageSourceLineEdit = new QgsImageSourceLineEdit(); + mImageSourceLineEdit->setLastPathSettingsKey( QStringLiteral( "lastLegendPlaceholderDir" ) ); + if ( mLayer ) + { + mImageSourceLineEdit->setSource( mLayer->legendPlaceholderImage() ); + } QVBoxLayout *layout = new QVBoxLayout; layout->setContentsMargins( 0, 0, 0, 0 ); + layout->addWidget( mPlaceholderImageLabel ); + layout->addWidget( mImageSourceLineEdit ); layout->addWidget( mShowLabelLegendCheckBox ); layout->addWidget( mLabelLegendGroupBox ); layout->addWidget( mTextOnSymbolGroupBox ); @@ -122,7 +132,10 @@ void QgsVectorLayerLegendWidget::setLayer( QgsVectorLayer *layer ) mTextOnSymbolGroupBox->setChecked( legend->textOnSymbolEnabled() ); mTextOnSymbolFormatButton->setTextFormat( legend->textOnSymbolTextFormat() ); populateLegendTreeView( legend->textOnSymbolContent() ); - + if ( mLayer ) + { + mImageSourceLineEdit->setSource( mLayer->legendPlaceholderImage() ); + } } void QgsVectorLayerLegendWidget::populateLabelLegendTreeWidget() @@ -221,6 +234,8 @@ void QgsVectorLayerLegendWidget::applyToLayer() applyLabelLegend(); } + mLayer->setLegendPlaceholderImage( mImageSourceLineEdit->source() ); + mLayer->setLegend( legend ); } diff --git a/src/gui/vector/qgsvectorlayerlegendwidget.h b/src/gui/vector/qgsvectorlayerlegendwidget.h index 2c5518b934e..2fc59d4978f 100644 --- a/src/gui/vector/qgsvectorlayerlegendwidget.h +++ b/src/gui/vector/qgsvectorlayerlegendwidget.h @@ -25,6 +25,7 @@ #include "qgis_gui.h" class QCheckBox; +class QgsImageSourceLineEdit; class QLabel; class QPushButton; class QTreeView; @@ -76,6 +77,8 @@ class GUI_EXPORT QgsVectorLayerLegendWidget : public QWidget QCheckBox *mShowLabelLegendCheckBox = nullptr; QgsCollapsibleGroupBox *mLabelLegendGroupBox = nullptr; QTreeWidget *mLabelLegendTreeWidget = nullptr; + QLabel *mPlaceholderImageLabel = nullptr; + QgsImageSourceLineEdit *mImageSourceLineEdit = nullptr; QgsMapCanvas *mCanvas = nullptr; QgsVectorLayer *mLayer = nullptr; diff --git a/src/ui/qgsrasterlayerpropertiesbase.ui b/src/ui/qgsrasterlayerpropertiesbase.ui index 94769bff22f..1d615d9143d 100644 --- a/src/ui/qgsrasterlayerpropertiesbase.ui +++ b/src/ui/qgsrasterlayerpropertiesbase.ui @@ -254,7 +254,7 @@ - 1 + 0 @@ -299,8 +299,8 @@ 0 0 - 643 - 679 + 650 + 673 @@ -1563,8 +1563,8 @@ border-radius: 2px; 0 0 - 577 - 190 + 650 + 673 @@ -1633,8 +1633,8 @@ border-radius: 2px; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Fira Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell';"><br /></span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:12pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:11pt;"><br /></span></p></body></html> @@ -1739,21 +1739,15 @@ p, li { white-space: pre-wrap; } - - - 0 - - - 0 - - - 0 - - - 0 - - + + + + + 0 + 0 + + Embedded Widgets in Legend @@ -1764,6 +1758,16 @@ p, li { white-space: pre-wrap; } + + + + + + + Legend placeholder image + + + @@ -1793,8 +1797,8 @@ p, li { white-space: pre-wrap; } 0 0 - 343 - 684 + 629 + 793 @@ -2315,6 +2319,23 @@ p, li { white-space: pre-wrap; } QComboBox
qgsblendmodecombobox.h
+ + QgsOpacityWidget + QWidget +
qgsopacitywidget.h
+ 1 +
+ + QgsRasterBandComboBox + QComboBox +
qgsrasterbandcombobox.h
+
+ + QgsImageSourceLineEdit + QWidget +
qgsfilecontentsourcelineedit.h
+ 1 +
mSearchLineEdit diff --git a/tests/src/python/test_qgsserver_wms_getlegendgraphic.py b/tests/src/python/test_qgsserver_wms_getlegendgraphic.py index 54cd59c796e..24450f32cbc 100644 --- a/tests/src/python/test_qgsserver_wms_getlegendgraphic.py +++ b/tests/src/python/test_qgsserver_wms_getlegendgraphic.py @@ -1045,6 +1045,19 @@ class TestQgsServerWMSGetLegendGraphic(TestQgsServerWMSTestBase): self.assertEqual(node['scaleMaxDenom'], 1000) self.assertEqual(node['scaleMinDenom'], 10000) + def testLegendPlaceholderIcon(self): + qs = "?" + "&".join(["%s=%s" % i for i in list({ + "MAP": self.testdata_path + 'test_project_legend_placeholder_image.qgs', + "SERVICE": "WMS", + "VERSION": "1.3", + "REQUEST": "GetLegendGraphic", + "LAYER": "landsat", + "FORMAT": "image/png", + }.items())]) + + r, h = self._result(self._execute_request(qs)) + self._img_diff_error(r, h, "WMS_GetLegendGraphic_Legend_Placeholder_Icon") + if __name__ == '__main__': unittest.main() diff --git a/tests/testdata/control_images/qgis_server/WMS_GetLegendGraphic_Legend_Placeholder_Icon/WMS_GetLegendGraphic_Legend_Placeholder_Icon.png b/tests/testdata/control_images/qgis_server/WMS_GetLegendGraphic_Legend_Placeholder_Icon/WMS_GetLegendGraphic_Legend_Placeholder_Icon.png new file mode 100644 index 00000000000..c371296ceb7 Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetLegendGraphic_Legend_Placeholder_Icon/WMS_GetLegendGraphic_Legend_Placeholder_Icon.png differ diff --git a/tests/testdata/control_images/qgis_server/WMS_GetLegendGraphic_Legend_Placeholder_Icon/WMS_GetLegendGraphic_Legend_Placeholder_Icon_mask.png b/tests/testdata/control_images/qgis_server/WMS_GetLegendGraphic_Legend_Placeholder_Icon/WMS_GetLegendGraphic_Legend_Placeholder_Icon_mask.png new file mode 100644 index 00000000000..4064ef10bdf Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetLegendGraphic_Legend_Placeholder_Icon/WMS_GetLegendGraphic_Legend_Placeholder_Icon_mask.png differ diff --git a/tests/testdata/qgis_server/test_project_legend_placeholder_image.qgs b/tests/testdata/qgis_server/test_project_legend_placeholder_image.qgs new file mode 100644 index 00000000000..857ee2b106f --- /dev/null +++ b/tests/testdata/qgis_server/test_project_legend_placeholder_image.qgs @@ -0,0 +1,3257 @@ + + + + QGIS Test Project + + + + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + testlayer20150528120452665 + testlayer_c0988fd7_97ca_451d_adbc_37ad6d10583a + testlayer_0b835118_a5d5_4255_b5dd_f42253c0a4a0 + testlayer_2b89ed65_ef2f_4897_af15_9b32d4c4e040 + testlayer_èé_cf86cf11_222f_4b62_929c_12cfc82b9774 + testlayer_èé_2_a5f61891_b949_43e3_ad30_84013fc922de + landsat_a7d15b35_ca83_4b23_a9fb_af3fbdd60d15 + + + + + + + + + + + + + + + + degrees + + 17.92123882869385909 + 30.1492204088525888 + 18.0486921925404431 + 30.25992437587047235 + + 0 + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Beschriftungen_bd4c1b29_b8ad_49b9_a322_c2680ab442c5 + + + + + + + + + + 0 + 0 + + + + + false + + + + + + + + + + + + + + + + + 0 + 0 + + + + + false + + + + + + 1 + 0 + + + + + 781662.375 + 3339523.125 + 793062.375 + 3350923.125 + + + 17.92427343259496908 + 30.15185621759111001 + 18.04565758863933667 + 30.25728856713195114 + + landsat_a7d15b35_ca83_4b23_a9fb_af3fbdd60d15 + ../landsat.tif + + + + landsat + + + PROJCRS["WGS 84 / UTM zone 33N",BASEGEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 33N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",15,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["unknown"],AREA["World - N hemisphere - 12°E to 18°E - by country"],BBOX[0,12,84,18]],ID["EPSG",32633]] + +proj=utm +zone=33 +datum=WGS84 +units=m +no_defs + 3117 + 32633 + EPSG:32633 + WGS 84 / UTM zone 33N + utm + EPSG:7030 + false + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + false + + + + + + + + + + + + + gdal + + + + + + + + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + MinMax + WholeRaster + Estimated + 0.02 + 0.98 + 2 + + + 122 + 130 + StretchToMinimumMaximum + + + + + + + + + + + resamplingFilter + + 0 + + + + 8.20345930703634352 + 44.90139483904469131 + 8.20354699399348775 + 44.90148252600183554 + + + 8.20345930703634352 + 44.90139483904469131 + 8.20354699399348775 + 44.90148252600183554 + + testlayer20150528120452665 + ./testlayer.shp + A test vector layer + A test vector layer with unicode òà + + + + testlayer èé + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + + + + + + + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + ogr + + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + 0 + . + + 0 + generatedlayout + + + + + + "name" + [% 'Name: ' || "name" %] + + + + 8.20345930703634352 + 44.90139483904469131 + 8.20354699399348775 + 44.90148252600183554 + + + 8.20345930703634352 + 44.90139483904469131 + 8.20354699399348775 + 44.90148252600183554 + + testlayer_0b835118_a5d5_4255_b5dd_f42253c0a4a0 + ./testlayer.shp + + + + testlayer3 + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + + + + + + + + + + + 0 + 0 + + + + + false + + + + + ogr + + + + + + + + + + 0 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + 0 + + + 0 + generatedlayout + + + + + + + + + + + 8.20345930703634352 + 44.90139483904469131 + 8.20354699399348775 + 44.90148252600183554 + + + 8.20345930703634352 + 44.90139483904469131 + 8.20354699399348775 + 44.90148252600183554 + + testlayer_2b89ed65_ef2f_4897_af15_9b32d4c4e040 + ./testlayer.shp + + + + testlayer2 + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + false + + + + + + + + + + + + + ogr + + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + id + + + + + 8.20345930703634352 + 44.90139483904469131 + 8.20354699399348775 + 44.90148252600183554 + + + 8.20345930703634352 + 44.90139483904469131 + 8.20354699399348775 + 44.90148252600183554 + + testlayer_c0988fd7_97ca_451d_adbc_37ad6d10583a + ./testlayer.shp + layer_with_short_name + A Layer with a short name + A Layer with an abstract + + + + testlayer + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + false + + + + + + + + + + + + + ogr + + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + id + + + + + 8.20345930703634352 + 44.90139483904469131 + 8.20354699399348775 + 44.90148252600183554 + + + 8.20345930703634352 + 44.90139483904469131 + 8.20354699399348775 + 44.90148252600183554 + + testlayer_èé_2_a5f61891_b949_43e3_ad30_84013fc922de + ./testlayer.shp + A test vector layer + A test vector layer with unicode òà + + + + exclude_attribute + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + false + + + + + + + + + + + + + ogr + + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + 0 + . + + 0 + generatedlayout + + + + + + + + + + + + + + name + [% 'Name: ' || "name" %] + + + + 8.20345930703634352 + 44.90139483904469131 + 8.20354699399348775 + 44.90148252600183554 + + + 8.20345930703634352 + 44.90139483904469131 + 8.20354699399348775 + 44.90148252600183554 + + testlayer_èé_cf86cf11_222f_4b62_929c_12cfc82b9774 + ./testlayer.shp + A test vector layer + A test vector layer with unicode òà + + + + fields_alias + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + false + + + + + + + + + + + + + ogr + + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + 0 + . + + 0 + generatedlayout + + + + + + + + + + + + + + name + [% 'Name: ' || "name" %] + + + + + + + + + + + + + + 255 + + + + + 1 + true + + + + 2 + 0 + 2 + off + + + + + + current_layer + + + 255 + 255 + 255 + 255 + 0 + 255 + 255 + + + + testlayer_0b835118_a5d5_4255_b5dd_f42253c0a4a0 + + + + false + + + + + + WGS84 + + + m2 + meters + + + 50 + 5 + 16 + 30 + 2.5 + true + false + false + 0 + 0 + false + false + true + 0 + 255,0,0,255 + + + false + + + true + 2 + D + + + + + + 3452 + +proj=longlat +datum=WGS84 +no_defs + EPSG:4326 + 1 + + + + 0 + + + + + + + + + testlayer20150528120452665 + + + 8 + + + + testlayer20150528120452665 + + + testlayer20150528120452665 + + + testlayer20150528120452665 + + + + None + true + elpaso@itopen.it + QGIS dev team + Alessandro Pasotti + + + + 8.20315414376310059 + 44.901236559338642 + 8.204164917965862 + 44.90159838674664172 + + conditions unknown + 90 + + + + + 4 + false + + + false + Some UTF8 text èòù + true + QGIS TestProject + + false + + + + + + + + + + + + QGIS Test Project + + + + + + + + + + + + + 2000-01-01T00:00:00 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + + + +