20 #include <QDomDocument> 21 #include <QDomElement> 22 #include <QDomImplementation> 26 #include <QTextStream> 61 return QStringLiteral(
".qmd" );
64 return QStringLiteral(
".qml" );
70 const QString &lyrname,
75 , mUndoStack( new QUndoStack( this ) )
76 , mUndoStackStyles( new QUndoStack( this ) )
78 , mRefreshTimer( new QTimer( this ) )
83 QString uuid = QUuid::createUuid().toString();
85 mID = lyrname +
'_' + uuid.mid( 1, uuid.length() - 2 );
93 mID.replace( QRegExp(
"[\\W]" ), QStringLiteral(
"_" ) );
96 connect( mRefreshTimer, &QTimer::timeout,
this, [ = ] {
triggerRepaint(
true ); } );
103 delete mStyleManager;
110 Q_FOREACH (
const QString &s,
styleManager()->styles() )
214 mnl = layerElement.namedItem( QStringLiteral(
"provider" ) );
215 mne = mnl.toElement();
216 provider = mne.text();
219 mnl = layerElement.namedItem( QStringLiteral(
"datasource" ) );
220 mne = mnl.toElement();
224 QRegExp rx(
"authcfg=([a-z]|[A-Z]|[0-9]){7}" );
232 if ( provider == QLatin1String(
"spatialite" ) )
238 else if ( provider == QLatin1String(
"ogr" ) )
240 QStringList theURIParts =
mDataSource.split(
'|' );
242 mDataSource = theURIParts.join( QStringLiteral(
"|" ) );
244 else if ( provider == QLatin1String(
"gpx" ) )
246 QStringList theURIParts =
mDataSource.split(
'?' );
248 mDataSource = theURIParts.join( QStringLiteral(
"?" ) );
250 else if ( provider == QLatin1String(
"delimitedtext" ) )
252 QUrl urlSource = QUrl::fromEncoded(
mDataSource.toLatin1() );
254 if ( !
mDataSource.startsWith( QLatin1String(
"file:" ) ) )
257 urlSource.setScheme( QStringLiteral(
"file" ) );
258 urlSource.setPath( file.path() );
261 QUrl urlDest = QUrl::fromLocalFile( context.
pathResolver().
readPath( urlSource.toLocalFile() ) );
262 urlDest.setQueryItems( urlSource.queryItems() );
263 mDataSource = QString::fromLatin1( urlDest.toEncoded() );
265 else if ( provider == QLatin1String(
"wms" ) )
279 if ( !
mDataSource.contains( QLatin1String(
"type=" ) ) &&
282 QgsDebugMsg(
"Old WMS URI format detected -> converting to new format" );
284 if ( !
mDataSource.startsWith( QLatin1String(
"http:" ) ) )
287 QStringListIterator iter( parts );
288 while ( iter.hasNext() )
290 QString item = iter.next();
291 if ( item.startsWith( QLatin1String(
"username=" ) ) )
293 uri.
setParam( QStringLiteral(
"username" ), item.mid( 9 ) );
295 else if ( item.startsWith( QLatin1String(
"password=" ) ) )
297 uri.
setParam( QStringLiteral(
"password" ), item.mid( 9 ) );
299 else if ( item.startsWith( QLatin1String(
"tiled=" ) ) )
305 QStringList params = item.mid( 6 ).split(
';' );
307 if ( params.size() == 2 )
309 uri.
setParam( QStringLiteral(
"maxWidth" ), params.takeFirst() );
310 uri.
setParam( QStringLiteral(
"maxHeight" ), params.takeFirst() );
312 else if ( params.size() > 2 )
316 uri.
setParam( QStringLiteral(
"tileMatrixSet" ), QLatin1String(
"" ) );
319 else if ( item.startsWith( QLatin1String(
"featureCount=" ) ) )
321 uri.
setParam( QStringLiteral(
"featureCount" ), item.mid( 13 ) );
323 else if ( item.startsWith( QLatin1String(
"url=" ) ) )
325 uri.
setParam( QStringLiteral(
"url" ), item.mid( 4 ) );
327 else if ( item.startsWith( QLatin1String(
"ignoreUrl=" ) ) )
329 uri.
setParam( QStringLiteral(
"ignoreUrl" ), item.mid( 10 ).split(
';' ) );
345 bool handled =
false;
347 if ( provider == QLatin1String(
"gdal" ) )
349 if (
mDataSource.startsWith( QLatin1String(
"NETCDF:" ) ) )
353 QRegExp r(
"NETCDF:(.+):([^:]+)" );
356 QString filename = r.cap( 1 );
357 if ( filename.startsWith(
'"' ) && filename.endsWith(
'"' ) )
358 filename = filename.mid( 1, filename.length() - 2 );
363 else if (
mDataSource.startsWith( QLatin1String(
"HDF4_SDS:" ) ) )
367 QRegExp r(
"HDF4_SDS:([^:]+):(.+):([^:]+)" );
370 QString filename = r.cap( 2 );
371 if ( filename.startsWith(
'"' ) && filename.endsWith(
'"' ) )
372 filename = filename.mid( 1, filename.length() - 2 );
377 else if (
mDataSource.startsWith( QLatin1String(
"HDF5:" ) ) )
381 QRegExp r(
"HDF5:(.+):([^:]+)" );
384 QString filename = r.cap( 1 );
385 if ( filename.startsWith(
'"' ) && filename.endsWith(
'"' ) )
386 filename = filename.mid( 1, filename.length() - 2 );
391 else if (
mDataSource.contains( QRegExp(
"^(NITF_IM|RADARSAT_2_CALIB):" ) ) )
395 QRegExp r(
"([^:]+):([^:]+):(.+)" );
412 mnl = layerElement.namedItem( QStringLiteral(
"layername" ) );
413 mne = mnl.toElement();
418 QDomNode srsNode = layerElement.namedItem( QStringLiteral(
"srs" ) );
434 layerError = !
readXml( layerElement, context );
453 mnl = layerElement.namedItem( QStringLiteral(
"id" ) );
454 if ( ! mnl.isNull() )
456 mne = mnl.toElement();
457 if ( ! mne.isNull() && mne.text().length() > 10 )
464 setScaleBasedVisibility( layerElement.attribute( QStringLiteral(
"hasScaleBasedVisibilityFlag" ) ).toInt() == 1 );
465 if ( layerElement.hasAttribute( QStringLiteral(
"minimumScale" ) ) )
468 setMaximumScale( layerElement.attribute( QStringLiteral(
"minimumScale" ) ).toDouble() );
469 setMinimumScale( layerElement.attribute( QStringLiteral(
"maximumScale" ) ).toDouble() );
473 setMaximumScale( layerElement.attribute( QStringLiteral(
"maxScale" ) ).toDouble() );
474 setMinimumScale( layerElement.attribute( QStringLiteral(
"minScale" ) ).toDouble() );
477 setAutoRefreshInterval( layerElement.attribute( QStringLiteral(
"autoRefreshTime" ), QStringLiteral(
"0" ) ).toInt() );
478 setAutoRefreshEnabled( layerElement.attribute( QStringLiteral(
"autoRefreshEnabled" ), QStringLiteral(
"0" ) ).toInt() );
480 setRefreshOnNotifyEnabled( layerElement.attribute( QStringLiteral(
"refreshOnNotifyEnabled" ), QStringLiteral(
"0" ) ).toInt() );
484 mnl = layerElement.namedItem( QStringLiteral(
"layername" ) );
485 mne = mnl.toElement();
489 QDomElement shortNameElem = layerElement.firstChildElement( QStringLiteral(
"shortname" ) );
490 if ( !shortNameElem.isNull() )
496 QDomElement titleElem = layerElement.firstChildElement( QStringLiteral(
"title" ) );
497 if ( !titleElem.isNull() )
499 mTitle = titleElem.text();
503 QDomElement abstractElem = layerElement.firstChildElement( QStringLiteral(
"abstract" ) );
504 if ( !abstractElem.isNull() )
510 QDomElement keywordListElem = layerElement.firstChildElement( QStringLiteral(
"keywordList" ) );
511 if ( !keywordListElem.isNull() )
514 for ( QDomNode n = keywordListElem.firstChild(); !n.isNull(); n = n.nextSibling() )
516 kwdList << n.toElement().text();
522 QDomElement dataUrlElem = layerElement.firstChildElement( QStringLiteral(
"dataUrl" ) );
523 if ( !dataUrlElem.isNull() )
526 mDataUrlFormat = dataUrlElem.attribute( QStringLiteral(
"format" ), QLatin1String(
"" ) );
530 QDomElement legendUrlElem = layerElement.firstChildElement( QStringLiteral(
"legendUrl" ) );
531 if ( !legendUrlElem.isNull() )
534 mLegendUrlFormat = legendUrlElem.attribute( QStringLiteral(
"format" ), QLatin1String(
"" ) );
538 QDomElement attribElem = layerElement.firstChildElement( QStringLiteral(
"attribution" ) );
539 if ( !attribElem.isNull() )
542 mAttributionUrl = attribElem.attribute( QStringLiteral(
"href" ), QLatin1String(
"" ) );
546 QDomElement metaUrlElem = layerElement.firstChildElement( QStringLiteral(
"metadataUrl" ) );
547 if ( !metaUrlElem.isNull() )
550 mMetadataUrlType = metaUrlElem.attribute( QStringLiteral(
"type" ), QLatin1String(
"" ) );
551 mMetadataUrlFormat = metaUrlElem.attribute( QStringLiteral(
"format" ), QLatin1String(
"" ) );
555 QDomElement metadataElem = layerElement.firstChildElement( QStringLiteral(
"resourceMetadata" ) );
564 Q_UNUSED( layer_node );
576 layerElement.setAttribute( QStringLiteral(
"hasScaleBasedVisibilityFlag" ),
hasScaleBasedVisibility() ? 1 : 0 );
577 layerElement.setAttribute( QStringLiteral(
"maxScale" ), QString::number(
maximumScale() ) );
578 layerElement.setAttribute( QStringLiteral(
"minScale" ), QString::number(
minimumScale() ) );
585 layerElement.setAttribute( QStringLiteral(
"autoRefreshTime" ), QString::number( mRefreshTimer->interval() ) );
586 layerElement.setAttribute( QStringLiteral(
"autoRefreshEnabled" ), mRefreshTimer->isActive() ? 1 : 0 );
592 QDomElement layerId = document.createElement( QStringLiteral(
"id" ) );
593 QDomText layerIdText = document.createTextNode(
id() );
594 layerId.appendChild( layerIdText );
596 layerElement.appendChild( layerId );
599 QDomElement dataSource = document.createElement( QStringLiteral(
"datasource" ) );
605 if ( vlayer && vlayer->
providerType() == QLatin1String(
"spatialite" ) )
612 else if ( vlayer && vlayer->
providerType() == QLatin1String(
"ogr" ) )
614 QStringList theURIParts = src.split(
'|' );
616 src = theURIParts.join( QStringLiteral(
"|" ) );
618 else if ( vlayer && vlayer->
providerType() == QLatin1String(
"gpx" ) )
620 QStringList theURIParts = src.split(
'?' );
622 src = theURIParts.join( QStringLiteral(
"?" ) );
624 else if ( vlayer && vlayer->
providerType() == QLatin1String(
"delimitedtext" ) )
626 QUrl urlSource = QUrl::fromEncoded( src.toLatin1() );
628 urlDest.setQueryItems( urlSource.queryItems() );
629 src = QString::fromLatin1( urlDest.toEncoded() );
631 else if ( vlayer && vlayer->
providerType() == QLatin1String(
"memory" ) )
638 bool handled =
false;
644 if ( rlayer && rlayer->
providerType() == QLatin1String(
"gdal" ) )
646 if ( src.startsWith( QLatin1String(
"NETCDF:" ) ) )
650 QRegExp r(
"NETCDF:(.+):([^:]+)" );
651 if ( r.exactMatch( src ) )
653 QString filename = r.cap( 1 );
654 if ( filename.startsWith(
'"' ) && filename.endsWith(
'"' ) )
655 filename = filename.mid( 1, filename.length() - 2 );
660 else if ( src.startsWith( QLatin1String(
"HDF4_SDS:" ) ) )
664 QRegExp r(
"HDF4_SDS:([^:]+):(.+):([^:]+)" );
665 if ( r.exactMatch( src ) )
667 QString filename = r.cap( 2 );
668 if ( filename.startsWith(
'"' ) && filename.endsWith(
'"' ) )
669 filename = filename.mid( 1, filename.length() - 2 );
670 src =
"HDF4_SDS:" + r.cap( 1 ) +
":\"" + context.
pathResolver().
writePath( filename ) +
"\":" + r.cap( 3 );
674 else if ( src.startsWith( QLatin1String(
"HDF5:" ) ) )
678 QRegExp r(
"HDF5:(.+):([^:]+)" );
679 if ( r.exactMatch( src ) )
681 QString filename = r.cap( 1 );
682 if ( filename.startsWith(
'"' ) && filename.endsWith(
'"' ) )
683 filename = filename.mid( 1, filename.length() - 2 );
688 else if ( src.contains( QRegExp(
"^(NITF_IM|RADARSAT_2_CALIB):" ) ) )
692 QRegExp r(
"([^:]+):([^:]+):(.+)" );
693 if ( r.exactMatch( src ) )
706 QDomText dataSourceText = document.createTextNode( src );
707 dataSource.appendChild( dataSourceText );
709 layerElement.appendChild( dataSource );
713 QDomElement layerName = document.createElement( QStringLiteral(
"layername" ) );
714 QDomText layerNameText = document.createTextNode(
name() );
715 layerName.appendChild( layerNameText );
716 layerElement.appendChild( layerName );
721 QDomElement layerShortName = document.createElement( QStringLiteral(
"shortname" ) );
722 QDomText layerShortNameText = document.createTextNode(
mShortName );
723 layerShortName.appendChild( layerShortNameText );
724 layerElement.appendChild( layerShortName );
730 QDomElement layerTitle = document.createElement( QStringLiteral(
"title" ) );
731 QDomText layerTitleText = document.createTextNode(
mTitle );
732 layerTitle.appendChild( layerTitleText );
733 layerElement.appendChild( layerTitle );
739 QDomElement layerAbstract = document.createElement( QStringLiteral(
"abstract" ) );
740 QDomText layerAbstractText = document.createTextNode(
mAbstract );
741 layerAbstract.appendChild( layerAbstractText );
742 layerElement.appendChild( layerAbstract );
746 QStringList keywordStringList =
keywordList().split(
',' );
747 if ( !keywordStringList.isEmpty() )
749 QDomElement layerKeywordList = document.createElement( QStringLiteral(
"keywordList" ) );
750 for (
int i = 0; i < keywordStringList.size(); ++i )
752 QDomElement layerKeywordValue = document.createElement( QStringLiteral(
"value" ) );
753 QDomText layerKeywordText = document.createTextNode( keywordStringList.at( i ).trimmed() );
754 layerKeywordValue.appendChild( layerKeywordText );
755 layerKeywordList.appendChild( layerKeywordValue );
757 layerElement.appendChild( layerKeywordList );
762 if ( !aDataUrl.isEmpty() )
764 QDomElement layerDataUrl = document.createElement( QStringLiteral(
"dataUrl" ) );
765 QDomText layerDataUrlText = document.createTextNode( aDataUrl );
766 layerDataUrl.appendChild( layerDataUrlText );
767 layerDataUrl.setAttribute( QStringLiteral(
"format" ),
dataUrlFormat() );
768 layerElement.appendChild( layerDataUrl );
773 if ( !aLegendUrl.isEmpty() )
775 QDomElement layerLegendUrl = document.createElement( QStringLiteral(
"legendUrl" ) );
776 QDomText layerLegendUrlText = document.createTextNode( aLegendUrl );
777 layerLegendUrl.appendChild( layerLegendUrlText );
778 layerLegendUrl.setAttribute( QStringLiteral(
"format" ),
legendUrlFormat() );
779 layerElement.appendChild( layerLegendUrl );
784 if ( !aAttribution.isEmpty() )
786 QDomElement layerAttribution = document.createElement( QStringLiteral(
"attribution" ) );
787 QDomText layerAttributionText = document.createTextNode( aAttribution );
788 layerAttribution.appendChild( layerAttributionText );
789 layerAttribution.setAttribute( QStringLiteral(
"href" ),
attributionUrl() );
790 layerElement.appendChild( layerAttribution );
795 if ( !aMetadataUrl.isEmpty() )
797 QDomElement layerMetadataUrl = document.createElement( QStringLiteral(
"metadataUrl" ) );
798 QDomText layerMetadataUrlText = document.createTextNode( aMetadataUrl );
799 layerMetadataUrl.appendChild( layerMetadataUrlText );
800 layerMetadataUrl.setAttribute( QStringLiteral(
"type" ),
metadataUrlType() );
801 layerMetadataUrl.setAttribute( QStringLiteral(
"format" ),
metadataUrlFormat() );
802 layerElement.appendChild( layerMetadataUrl );
808 QDomElement stamp = document.createElement( QStringLiteral(
"timestamp" ) );
809 QDomText stampText = document.createTextNode(
timestamp().toString( Qt::ISODate ) );
810 stamp.appendChild( stampText );
811 layerElement.appendChild( stamp );
814 layerElement.appendChild( layerName );
821 QDomElement mySrsElement = document.createElement( QStringLiteral(
"srs" ) );
822 mCRS.
writeXml( mySrsElement, document );
823 layerElement.appendChild( mySrsElement );
826 QDomElement myMetadataElem = document.createElement( QStringLiteral(
"resourceMetadata" ) );
828 layerElement.appendChild( myMetadataElem );
834 return writeXml( layerElement, document, context );
841 Q_UNUSED( layer_node );
842 Q_UNUSED( document );
858 mCustomProperties.
readXml( layerNode, keyStartsWith );
863 mCustomProperties.
writeXml( layerNode, doc );
868 QDomElement styleMgrElem = layerNode.firstChildElement( QStringLiteral(
"map-layer-style-manager" ) );
869 if ( !styleMgrElem.isNull() )
870 mStyleManager->
readXml( styleMgrElem );
872 mStyleManager->
reset();
879 QDomElement styleMgrElem = doc.createElement( QStringLiteral(
"map-layer-style-manager" ) );
880 mStyleManager->
writeXml( styleMgrElem );
881 layerNode.appendChild( styleMgrElem );
891 void QgsMapLayer::connectNotify(
const char *signal )
900 return !mScaleBasedVisibility ||
902 && ( mMaxScale == 0 || scale < mMaxScale ) );
907 return mScaleBasedVisibility;
912 return mRefreshTimer->isActive();
917 return mRefreshTimer->interval();
924 mRefreshTimer->stop();
925 mRefreshTimer->setInterval( 0 );
929 mRefreshTimer->setInterval( interval );
937 mRefreshTimer->stop();
938 else if ( mRefreshTimer->interval() > 0 )
939 mRefreshTimer->start();
967 mScaleBasedVisibility = enabled;
977 return QStringList();
1014 QString layerName( name );
1015 layerName.replace(
'_',
' ' );
1025 if ( myURI.startsWith( QLatin1String(
"/vsigzip/" ), Qt::CaseInsensitive ) )
1027 myURI.remove( 0, 9 );
1029 else if ( myURI.startsWith( QLatin1String(
"/vsizip/" ), Qt::CaseInsensitive ) &&
1030 myURI.endsWith( QLatin1String(
".zip" ), Qt::CaseInsensitive ) )
1033 myURI.remove( 0, 8 );
1035 else if ( myURI.startsWith( QLatin1String(
"/vsitar/" ), Qt::CaseInsensitive ) &&
1036 ( myURI.endsWith( QLatin1String(
".tar" ), Qt::CaseInsensitive ) ||
1037 myURI.endsWith( QLatin1String(
".tar.gz" ), Qt::CaseInsensitive ) ||
1038 myURI.endsWith( QLatin1String(
".tgz" ), Qt::CaseInsensitive ) ) )
1041 myURI.remove( 0, 8 );
1044 QFileInfo myFileInfo( myURI );
1047 if ( myFileInfo.exists() )
1050 if ( myURI.endsWith( QLatin1String(
".gz" ), Qt::CaseInsensitive ) )
1052 else if ( myURI.endsWith( QLatin1String(
".zip" ), Qt::CaseInsensitive ) )
1054 else if ( myURI.endsWith( QLatin1String(
".tar" ), Qt::CaseInsensitive ) )
1056 else if ( myURI.endsWith( QLatin1String(
".tar.gz" ), Qt::CaseInsensitive ) )
1058 else if ( myURI.endsWith( QLatin1String(
".tgz" ), Qt::CaseInsensitive ) )
1060 myFileInfo.setFile( myURI );
1074 return baseURI( PropertyType::Metadata );
1089 return baseURI( PropertyType::Style );
1099 return loadNamedPropertyFromDatabase( db, uri, qmd, PropertyType::Metadata );
1104 return loadNamedPropertyFromDatabase( db, uri, qml, PropertyType::Style );
1111 bool resultFlag =
false;
1119 QgsDebugMsgLevel( QString(
"Trying to load style or metadata for \"%1\" from \"%2\"" ).arg( uri, db ), 4 );
1121 if ( db.isEmpty() || !QFile( db ).exists() )
1124 myResult = database.
open_v2( db, SQLITE_OPEN_READONLY,
nullptr );
1125 if ( myResult != SQLITE_OK )
1134 mySql = QStringLiteral(
"select qmd from tbl_metadata where metadata=?" );
1138 mySql = QStringLiteral(
"select qml from tbl_styles where style=?" );
1142 statement = database.
prepare( mySql, myResult );
1143 if ( myResult == SQLITE_OK )
1145 QByteArray param = uri.toUtf8();
1147 if ( sqlite3_bind_text( statement.get(), 1, param.data(), param.length(), SQLITE_STATIC ) == SQLITE_OK &&
1148 sqlite3_step( statement.get() ) == SQLITE_ROW )
1150 xml = QString::fromUtf8( reinterpret_cast< const char * >( sqlite3_column_text( statement.get(), 0 ) ) );
1160 return loadNamedProperty( uri, PropertyType::Style, resultFlag );
1170 QDomDocument myDocument( QStringLiteral(
"qgis" ) );
1174 QString myErrorMessage;
1176 QFile myFile( uri );
1177 if ( myFile.open( QFile::ReadOnly ) )
1179 QgsDebugMsg( QString(
"file found %1" ).arg( uri ) );
1181 resultFlag = myDocument.setContent( &myFile, &myErrorMessage, &line, &column );
1183 myErrorMessage = tr(
"%1 at line %2 column %3" ).arg( myErrorMessage ).arg( line ).arg( column );
1189 QgsDebugMsgLevel( QString(
"project fileName: %1" ).arg( project.absoluteFilePath() ), 4 );
1197 ( project.exists() &&
loadNamedStyleFromDatabase( project.absoluteDir().absoluteFilePath( project.baseName() +
".qmldb" ), uri, xml ) ) ||
1200 resultFlag = myDocument.setContent( xml, &myErrorMessage, &line, &column );
1203 myErrorMessage = tr(
"%1 at line %2 column %3" ).arg( myErrorMessage ).arg( line ).arg( column );
1208 myErrorMessage = tr(
"Style not found in database" );
1216 ( project.exists() &&
loadNamedMetadataFromDatabase( project.absoluteDir().absoluteFilePath( project.baseName() +
".qmldb" ), uri, xml ) ) ||
1219 resultFlag = myDocument.setContent( xml, &myErrorMessage, &line, &column );
1222 myErrorMessage = tr(
"%1 at line %2 column %3" ).arg( myErrorMessage ).arg( line ).arg( column );
1227 myErrorMessage = tr(
"Metadata not found in database" );
1237 return myErrorMessage;
1245 myErrorMessage = tr(
"Loading style file %1 failed because:\n%2" ).arg( uri, myErrorMessage );
1250 myErrorMessage = tr(
"Loading metadata file %1 failed because:\n%2" ).arg( uri, myErrorMessage );
1253 return myErrorMessage;
1258 QDomElement myRoot = document.firstChildElement( QStringLiteral(
"qgis" ) );
1259 if ( myRoot.isNull() )
1261 errorMessage = tr(
"Root <qgis> element could not be found" );
1270 QDomElement myRoot = myDocument.firstChildElement( QStringLiteral(
"qgis" ) );
1271 if ( myRoot.isNull() )
1273 myErrorMessage = tr(
"Root <qgis> element could not be found" );
1278 QgsProjectVersion fileVersion( myRoot.attribute( QStringLiteral(
"version" ) ) );
1281 if ( thisVersion > fileVersion )
1294 myErrorMessage = tr(
"Cannot apply style to layer with a different geometry type" );
1301 if ( myRoot.hasAttribute( QStringLiteral(
"minimumScale" ) ) )
1304 setMaximumScale( myRoot.attribute( QStringLiteral(
"minimumScale" ) ).toDouble() );
1305 setMinimumScale( myRoot.attribute( QStringLiteral(
"maximumScale" ) ).toDouble() );
1309 setMaximumScale( myRoot.attribute( QStringLiteral(
"maxScale" ) ).toDouble() );
1310 setMinimumScale( myRoot.attribute( QStringLiteral(
"minScale" ) ).toDouble() );
1318 QDomImplementation DomImplementation;
1319 QDomDocumentType documentType = DomImplementation.createDocumentType( QStringLiteral(
"qgis" ), QStringLiteral(
"http://mrcc.com/qgis.dtd" ), QStringLiteral(
"SYSTEM" ) );
1320 QDomDocument myDocument( documentType );
1322 QDomElement myRootNode = myDocument.createElement( QStringLiteral(
"qgis" ) );
1324 myDocument.appendChild( myRootNode );
1328 errorMsg = QObject::tr(
"Could not save metadata" );
1337 QDomImplementation DomImplementation;
1338 QDomDocumentType documentType = DomImplementation.createDocumentType( QStringLiteral(
"qgis" ), QStringLiteral(
"http://mrcc.com/qgis.dtd" ), QStringLiteral(
"SYSTEM" ) );
1339 QDomDocument myDocument( documentType );
1341 QDomElement myRootNode = myDocument.createElement( QStringLiteral(
"qgis" ) );
1343 myDocument.appendChild( myRootNode );
1345 myRootNode.setAttribute( QStringLiteral(
"hasScaleBasedVisibilityFlag" ),
hasScaleBasedVisibility() ? 1 : 0 );
1346 myRootNode.setAttribute( QStringLiteral(
"maxScale" ), QString::number(
maximumScale() ) );
1347 myRootNode.setAttribute( QStringLiteral(
"minScale" ), QString::number(
minimumScale() ) );
1351 errorMsg = QObject::tr(
"Could not save symbology because:\n%1" ).arg( errorMsg );
1363 QString geoType = QString::number( vl->
geometryType() );
1366 QDomElement layerGeometryType = myDocument.createElement( QStringLiteral(
"layerGeometryType" ) );
1367 QDomText
type = myDocument.createTextNode( geoType );
1369 layerGeometryType.appendChild( type );
1370 myRootNode.appendChild( layerGeometryType );
1399 if ( vlayer && vlayer->
providerType() == QLatin1String(
"ogr" ) )
1401 QStringList theURIParts = uri.split(
'|' );
1402 filename = theURIParts[0];
1404 else if ( vlayer && vlayer->
providerType() == QLatin1String(
"gpx" ) )
1406 QStringList theURIParts = uri.split(
'?' );
1407 filename = theURIParts[0];
1409 else if ( vlayer && vlayer->
providerType() == QLatin1String(
"delimitedtext" ) )
1411 filename = QUrl::fromEncoded( uri.toLatin1() ).toLocalFile();
1413 if ( filename.isEmpty() )
1421 QString myErrorMessage;
1422 QDomDocument myDocument;
1434 QFileInfo myFileInfo( filename );
1437 QFileInfo myDirInfo( myFileInfo.path() );
1438 if ( !myDirInfo.isWritable() )
1440 return tr(
"The directory containing your dataset needs to be writable!" );
1446 QFile myFile( myFileName );
1447 if ( myFile.open( QFile::WriteOnly | QFile::Truncate ) )
1449 QTextStream myFileStream( &myFile );
1451 myDocument.save( myFileStream, 2 );
1457 return tr(
"Created default metadata file as %1" ).arg( myFileName );
1460 return tr(
"Created default style file as %1" ).arg( myFileName );
1470 return tr(
"ERROR: Failed to created default metadata file as %1. Check file permissions and retry." ).arg( myFileName );
1473 return tr(
"ERROR: Failed to created default style file as %1. Check file permissions and retry." ).arg( myFileName );
1479 QString qml = myDocument.toString();
1486 if ( myResult != SQLITE_OK )
1488 return tr(
"User database could not be opened." );
1491 QByteArray param0 = uri.toUtf8();
1492 QByteArray param1 = qml.toUtf8();
1498 mySql = QStringLiteral(
"create table if not exists tbl_metadata(metadata varchar primary key,qmd varchar)" );
1502 mySql = QStringLiteral(
"create table if not exists tbl_styles(style varchar primary key,qml varchar)" );
1506 statement = database.
prepare( mySql, myResult );
1507 if ( myResult == SQLITE_OK )
1509 if ( sqlite3_step( statement.get() ) != SQLITE_DONE )
1515 return tr(
"The metadata table could not be created." );
1518 return tr(
"The style table could not be created." );
1526 mySql = QStringLiteral(
"insert into tbl_metadata(metadata,qmd) values (?,?)" );
1530 mySql = QStringLiteral(
"insert into tbl_styles(style,qml) values (?,?)" );
1533 statement = database.
prepare( mySql, myResult );
1534 if ( myResult == SQLITE_OK )
1536 if ( sqlite3_bind_text( statement.get(), 1, param0.data(), param0.length(), SQLITE_STATIC ) == SQLITE_OK &&
1537 sqlite3_bind_text( statement.get(), 2, param1.data(), param1.length(), SQLITE_STATIC ) == SQLITE_OK &&
1538 sqlite3_step( statement.get() ) == SQLITE_DONE )
1544 myErrorMessage = tr(
"The metadata %1 was saved to database" ).arg( uri );
1548 myErrorMessage = tr(
"The style %1 was saved to database" ).arg( uri );
1560 mySql = QStringLiteral(
"update tbl_metadata set qmd=? where metadata=?" );
1564 mySql = QStringLiteral(
"update tbl_styles set qml=? where style=?" );
1567 statement = database.
prepare( mySql, myResult );
1568 if ( myResult == SQLITE_OK )
1570 if ( sqlite3_bind_text( statement.get(), 2, param0.data(), param0.length(), SQLITE_STATIC ) == SQLITE_OK &&
1571 sqlite3_bind_text( statement.get(), 1, param1.data(), param1.length(), SQLITE_STATIC ) == SQLITE_OK &&
1572 sqlite3_step( statement.get() ) == SQLITE_DONE )
1578 myErrorMessage = tr(
"The metadata %1 was updated in the database." ).arg( uri );
1582 myErrorMessage = tr(
"The style %1 was updated in the database." ).arg( uri );
1592 myErrorMessage = tr(
"The metadata %1 could not be updated in the database." ).arg( uri );
1596 myErrorMessage = tr(
"The style %1 could not be updated in the database." ).arg( uri );
1607 myErrorMessage = tr(
"The metadata %1 could not be inserted into database." ).arg( uri );
1611 myErrorMessage = tr(
"The style %1 could not be inserted into database." ).arg( uri );
1618 return myErrorMessage;
1628 QDomDocument myDocument = QDomDocument();
1630 QDomNode header = myDocument.createProcessingInstruction( QStringLiteral(
"xml" ), QStringLiteral(
"version=\"1.0\" encoding=\"UTF-8\"" ) );
1631 myDocument.appendChild( header );
1634 QDomElement root = myDocument.createElementNS( QStringLiteral(
"http://www.opengis.net/sld" ), QStringLiteral(
"StyledLayerDescriptor" ) );
1635 root.setAttribute( QStringLiteral(
"version" ), QStringLiteral(
"1.1.0" ) );
1636 root.setAttribute( QStringLiteral(
"xsi:schemaLocation" ), QStringLiteral(
"http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" ) );
1637 root.setAttribute( QStringLiteral(
"xmlns:ogc" ), QStringLiteral(
"http://www.opengis.net/ogc" ) );
1638 root.setAttribute( QStringLiteral(
"xmlns:se" ), QStringLiteral(
"http://www.opengis.net/se" ) );
1639 root.setAttribute( QStringLiteral(
"xmlns:xlink" ), QStringLiteral(
"http://www.w3.org/1999/xlink" ) );
1640 root.setAttribute( QStringLiteral(
"xmlns:xsi" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema-instance" ) );
1641 myDocument.appendChild( root );
1644 QDomElement namedLayerNode = myDocument.createElement( QStringLiteral(
"NamedLayer" ) );
1645 root.appendChild( namedLayerNode );
1650 errorMsg = tr(
"Could not save symbology because:\n%1" )
1651 .arg( QStringLiteral(
"Non-vector layers not supported yet" ) );
1658 props[ QStringLiteral(
"scaleMinDenom" )] = QString::number( mMinScale );
1659 props[ QStringLiteral(
"scaleMaxDenom" )] = QString::number( mMaxScale );
1661 if ( !vlayer->
writeSld( namedLayerNode, myDocument, errorMsg, props ) )
1663 errorMsg = tr(
"Could not save symbology because:\n%1" ).arg( errorMsg );
1673 QDomDocument myDocument;
1675 if ( !errorMsg.isNull() )
1685 if ( vlayer->
providerType() == QLatin1String(
"ogr" ) )
1687 QStringList theURIParts = uri.split(
'|' );
1688 filename = theURIParts[0];
1690 else if ( vlayer->
providerType() == QLatin1String(
"gpx" ) )
1692 QStringList theURIParts = uri.split(
'?' );
1693 filename = theURIParts[0];
1695 else if ( vlayer->
providerType() == QLatin1String(
"delimitedtext" ) )
1697 filename = QUrl::fromEncoded( uri.toLatin1() ).toLocalFile();
1699 if ( filename.isEmpty() )
1707 QFileInfo myFileInfo( filename );
1708 if ( myFileInfo.exists() || filename.endsWith( QLatin1String(
".sld" ), Qt::CaseInsensitive ) )
1710 QFileInfo myDirInfo( myFileInfo.path() );
1711 if ( !myDirInfo.isWritable() )
1713 return tr(
"The directory containing your dataset needs to be writable!" );
1717 QString myFileName = myFileInfo.path() + QDir::separator() + myFileInfo.completeBaseName() +
".sld";
1719 QFile myFile( myFileName );
1720 if ( myFile.open( QFile::WriteOnly | QFile::Truncate ) )
1722 QTextStream myFileStream( &myFile );
1724 myDocument.save( myFileStream, 2 );
1727 return tr(
"Created default style file as %1" ).arg( myFileName );
1732 return tr(
"ERROR: Failed to created SLD style file as %1. Check file permissions and retry." ).arg( filename );
1739 QDomDocument myDocument;
1743 QString myErrorMessage;
1745 QFile myFile( uri );
1746 if ( myFile.open( QFile::ReadOnly ) )
1749 resultFlag = myDocument.setContent( &myFile,
true, &myErrorMessage, &line, &column );
1751 myErrorMessage = tr(
"%1 at line %2 column %3" ).arg( myErrorMessage ).arg( line ).arg( column );
1756 myErrorMessage = tr(
"Unable to open file %1" ).arg( uri );
1761 return myErrorMessage;
1765 QDomElement myRoot = myDocument.firstChildElement( QStringLiteral(
"StyledLayerDescriptor" ) );
1766 if ( myRoot.isNull() )
1768 myErrorMessage = QStringLiteral(
"Error: StyledLayerDescriptor element not found in %1" ).arg( uri );
1770 return myErrorMessage;
1775 QDomElement namedLayerElem = myRoot.firstChildElement( QStringLiteral(
"NamedLayer" ) );
1776 if ( namedLayerElem.isNull() )
1778 myErrorMessage = QStringLiteral(
"Info: NamedLayer element not found." );
1780 return myErrorMessage;
1784 resultFlag =
readSld( namedLayerElem, errorMsg );
1787 myErrorMessage = tr(
"Loading style file %1 failed because:\n%2" ).arg( uri, errorMsg );
1788 return myErrorMessage;
1791 return QLatin1String(
"" );
1797 Q_UNUSED( errorMessage );
1798 Q_UNUSED( context );
1806 Q_UNUSED( errorMessage );
1807 Q_UNUSED( context );
1816 QDomElement renderer3DElem = document.createElement( QStringLiteral(
"renderer-3d" ) );
1817 renderer3DElem.setAttribute( QStringLiteral(
"type" ), m3DRenderer->
type() );
1818 m3DRenderer->
writeXml( renderer3DElem, context );
1819 layerElement.appendChild( renderer3DElem );
1826 QDomElement renderer3DElem = layerElement.firstChildElement( QStringLiteral(
"renderer-3d" ) );
1827 if ( !renderer3DElem.isNull() )
1829 QString type3D = renderer3DElem.attribute( QStringLiteral(
"type" ) );
1846 return mUndoStackStyles;
1851 return mCustomProperties.
keys();
1856 mCustomProperties.
setValue( key, value );
1861 mCustomProperties = properties;
1866 return mCustomProperties.
value( value, defaultValue );
1871 mCustomProperties.
remove( key );
1898 if ( legend == mLegend )
1906 mLegend->setParent(
this );
1920 return mStyleManager;
1925 if ( renderer == m3DRenderer )
1929 m3DRenderer = renderer;
1970 static QList<const QgsMapLayer *> _depOutEdges(
const QgsMapLayer *vl,
const QgsMapLayer *that,
const QSet<QgsMapLayerDependency> &layers )
1972 QList<const QgsMapLayer *> lst;
1992 static bool _depHasCycleDFS(
const QgsMapLayer *n, QHash<const QgsMapLayer *, int> &mark,
const QgsMapLayer *that,
const QSet<QgsMapLayerDependency> &layers )
1994 if ( mark.value( n ) == 1 )
1996 if ( mark.value( n ) == 0 )
1999 Q_FOREACH (
const QgsMapLayer *m, _depOutEdges( n, that, layers ) )
2001 if ( _depHasCycleDFS( m, mark, that, layers ) )
2011 QHash<const QgsMapLayer *, int> marks;
2012 return _depHasCycleDFS(
this, marks,
this, layers );
2015 bool QgsMapLayer::isReadOnly()
const 2027 QSet<QgsMapLayerDependency> deps;
2059 void QgsMapLayer::onNotifiedTriggerRepaint(
const QString &message )
QString attributionUrl() const
Returns the attribution URL of the layer used by QGIS Server in GetCapabilities request.
Origin origin() const
Return the dependency origin.
virtual QStringList subLayers() const
Returns the sublayers of this layer.
void writeCommonStyle(QDomElement &layerElement, QDomDocument &document, const QgsReadWriteContext &context) const
Write style data common to all layer types.
void setMetadataUrl(const QString &metaUrl)
Sets the metadata URL of the layer used by QGIS Server in GetCapabilities request.
The class is used as a container of context for various read/write operations on other objects...
QString dataUrlFormat() const
Returns the DataUrl format of the layer used by QGIS Server in GetCapabilities request.
A rectangle specified with double values.
Base class for all map layer types.
static QString formatLayerName(const QString &name)
A convenience function to capitalize and format a layer name.
static Qgs3DRendererRegistry * renderer3DRegistry()
Returns registry of available 3D renderers.
static const QString QGIS_VERSION
Version string.
void currentStyleChanged(const QString ¤tName)
Emitted when the current style has been changed.
void setShortName(const QString &shortName)
Sets the short name of the layer used by QGIS Server to identify the layer.
virtual void resolveReferences(const QgsProject &project)
Resolves references to other objects - second phase of loading - after readXml()
virtual void exportSldStyle(QDomDocument &doc, QString &errorMsg) const
Export the properties of this layer as SLD style in a QDomDocument.
virtual QgsMapLayer * clone() const =0
Returns a new instance equivalent to this one except for the id which is still unique.
void dependenciesChanged()
Emitted when dependencies are changed.
virtual QString loadSldStyle(const QString &uri, bool &resultFlag)
Attempts to style the layer using the formatting from an SLD type file.
Base class for all renderers that may to participate in 3D view.
static QString qgisSettingsDirPath()
Returns the path to the settings directory in user's home dir.
virtual QSet< QgsMapLayerDependency > dependencies() const
Gets the list of dependencies.
virtual QgsDataProvider * dataProvider()
Returns the layer's data provider.
void readXml(const QDomNode &parentNode, const QString &keyStartsWith=QString())
Read store contents from XML.
void reset()
Reset the style manager to a basic state - with one default style which is set as current...
QStringList customPropertyKeys() const
Returns list of all keys within custom properties.
QString shortName() const
Returns the short name of the layer used by QGIS Server to identify the layer.
QString readPath(const QString &filename) const
Turn filename read from the project file to an absolute path.
QgsMapLayerLegend * legend() const
Can be null.
Unique pointer for sqlite3 prepared statements, which automatically finalizes the statement when the ...
void setCustomProperties(const QgsObjectCustomProperties &properties)
Set custom properties for layer.
void metadataChanged()
Emitted when the layer's metadata is changed.
virtual QgsError error() const
Get current status error.
This class provides qgis with the ability to render raster datasets onto the mapcanvas.
void validate()
Perform some validation on this CRS.
QString dataUrl() const
Returns the DataUrl of the layer used by QGIS Server in GetCapabilities request.
void readCommonStyle(const QDomElement &layerElement, const QgsReadWriteContext &context)
Read style data common to all layer types.
void emitStyleChanged()
Triggers an emission of the styleChanged() signal.
virtual QString loadNamedStyle(const QString &uri, bool &resultFlag)
Retrieve a named style for this layer if one exists (either as a .qml file on disk or as a record in ...
PropertyType
Maplayer has a style and a metadata property.
void setRefreshOnNotifyEnabled(bool enabled)
Set whether provider notification is connected to triggerRepaint.
void setCustomProperty(const QString &key, const QVariant &value)
Set a custom property for layer.
static void setCustomCrsValidation(CUSTOM_CRS_VALIDATION f)
Sets custom function to force valid CRS.
void readCustomProperties(const QDomNode &layerNode, const QString &keyStartsWith=QString())
Read custom properties from project file.
virtual bool loadNamedStyleFromDatabase(const QString &db, const QString &uri, QString &qml)
Retrieve a named style for this layer from a sqlite database.
virtual void resolveReferences(QgsProject *project)
Resolve references to other layers (kept as layer IDs after reading XML) into layer objects...
virtual bool readXml(const QDomNode &layer_node, const QgsReadWriteContext &context)
Called by readLayerXML(), used by children to read state specific to them from project files...
virtual bool writeXml(QDomNode &layer_node, QDomDocument &document, const QgsReadWriteContext &context) const
Called by writeLayerXML(), used by children to write state specific to them to project files...
virtual QString saveSldStyle(const QString &uri, bool &resultFlag) const
Saves the properties of this layer to an SLD format file.
static QDomElement writeRectangle(const QgsRectangle &rect, QDomDocument &doc)
void crsChanged()
Emit a signal that layer's CRS has been reset.
QgsWkbTypes::GeometryType geometryType() const
Returns point, line or polygon.
virtual const QgsLayerMetadata & metadata() const
Returns a reference to the layer's metadata store.
bool isInScaleRange(double scale) const
Tests whether the layer should be visible at the specified scale.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
Return value for the given key. If the key is not stored, default value will be used.
void setMetadataUrlType(const QString &metaUrlType)
Set the metadata type of the layer used by QGIS Server in GetCapabilities request MetadataUrlType ind...
Abstract base class for spatial data provider implementations.
virtual QString styleURI() const
Retrieve the style URI for this layer (either as a .qml file on disk or as a record in the users styl...
void writeXml(QDomNode &parentNode, QDomDocument &doc) const
Write store contents to XML.
QString saveNamedMetadata(const QString &uri, bool &resultFlag)
Save the current metadata of this layer as a named metadata (either as a .qmd file on disk or as a re...
bool isValid() const
Return the status of the layer.
void notify(const QString &msg)
Emitted when datasource issues a notification.
void setBlendMode(QPainter::CompositionMode blendMode)
Set the blending mode used for rendering a layer.
void setConnection(const QString &aHost, const QString &aPort, const QString &aDatabase, const QString &aUsername, const QString &aPassword, SslMode sslmode=SslPrefer, const QString &authConfigId=QString())
Set all connection related members at once.
bool mIsRefreshOnNofifyEnabled
QgsMapLayer::LayerType type() const
Returns the type of the layer.
QMap< QString, QString > QgsStringMap
void remove(const QString &key)
Remove a key (entry) from the store.
void exportNamedMetadata(QDomDocument &doc, QString &errorMsg) const
Export the current metadata of this layer as named metadata in a QDomDocument.
QString mLayerName
Name of the layer - used for display.
QString username() const
Returns the username.
bool isRefreshOnNotifyEnabled() const
Returns true if the refresh on provider nofification is enabled.
void styleChanged()
Signal emitted whenever a change affects the layer's style.
bool loadNamedMetadataFromDatabase(const QString &db, const QString &uri, QString &qmd)
Retrieve a named metadata for this layer from a sqlite database.
virtual bool readSymbology(const QDomNode &node, QString &errorMessage, const QgsReadWriteContext &context)=0
Read the symbology for the current layer from the Dom node supplied.
virtual QString htmlMetadata() const
Obtain a formatted HTML string containing assorted metadata for this layer.
virtual QgsRectangle extent() const
Returns the extent of the layer.
QgsMapLayer(QgsMapLayer::LayerType type=VectorLayer, const QString &name=QString(), const QString &source=QString())
Constructor for QgsMapLayer.
void writeCustomProperties(QDomNode &layerNode, QDomDocument &doc) const
Write custom properties to project file.
void setMaximumScale(double scale)
Sets the maximum map scale (i.e.
QgsMapLayerStyleManager * styleManager() const
Get access to the layer's style manager.
virtual bool writeSymbology(QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context) const =0
Write the symbology for the layer into the docment provided.
QgsRectangle mExtent
Extent of the layer.
virtual void writeXml(QDomElement &elem, const QgsReadWriteContext &context) const =0
Writes renderer's properties to given XML element.
QString mMetadataUrl
MetadataUrl of the layer.
void setLegendUrlFormat(const QString &legendUrlFormat)
Sets the format for a URL based layer legend.
QString host() const
Returns the host.
QString metadataUrlFormat() const
Returns the metadata format of the layer used by QGIS Server in GetCapabilities request.
void setValidationHint(const QString &html)
Set user hint for validation.
const QgsPathResolver & pathResolver() const
Returns path resolver for conversion between relative and absolute paths.
void setKeywordList(const QString &keywords)
Sets the keyword list of the layer used by QGIS Server in GetCapabilities request.
void setValue(const QString &key, const QVariant &value)
Add an entry to the store. If the entry with the keys exists already, it will be overwritten.
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
static QString capitalize(const QString &string, Capitalization capitalization)
Converts a string by applying capitalization rules to the string.
void setTitle(const QString &title)
Sets the title of the layer used by QGIS Server in GetCapabilities request.
void readStyleManager(const QDomNode &layerNode)
Read style manager's configuration (if any). To be called by subclasses.
void triggerRepaint(bool deferredUpdate=false)
Will advise the map canvas (and any other interested party) that this layer requires to be repainted...
int autoRefreshInterval() const
Returns the auto refresh interval (in milliseconds).
virtual void setSubLayerVisibility(const QString &name, bool visible)
Set the visibility of the given sublayer name.
#define QgsDebugMsgLevel(str, level)
virtual QString type() const =0
Returns unique identifier of the renderer class (used to identify subclass)
LayerType
Types of layers that can be added to a map.
virtual void setMetadata(const QgsLayerMetadata &metadata)
Sets the layer's metadata store.
void setCrs(const QgsCoordinateReferenceSystem &srs, bool emitSignal=true)
Sets layer's spatial reference system.
QSet< QgsMapLayerDependency > mDependencies
List of layers that may modify this layer on modification.
virtual void setListening(bool isListening)
Set whether the provider will listen to datasource notifications If set, the provider will issue noti...
void nameChanged()
Emitted when the name has been changed.
A class to describe the version of a project.
QString providerType() const
[ data provider interface ] Which provider is being used for this Raster Layer?
virtual void setExtent(const QgsRectangle &rect)
Set the extent.
void readXml(const QDomElement &mgrElement)
Read configuration (for project loading)
QString keywordList() const
Returns the keyword list of the layer used by QGIS Server in GetCapabilities request.
bool writeSld(QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsStringMap &props=QgsStringMap()) const
Writes the symbology of the layer into the document provided in SLD 1.1 format.
virtual QString dataSourceUri(bool expandAuthConfig=false) const
Get the data source specification.
QString mDataUrl
DataUrl of the layer.
The QgsMapLayerLegend class is abstract interface for implementations of legends for one map layer...
virtual bool isEditable() const
Returns true if the layer can be edited.
virtual QString saveDefaultMetadata(bool &resultFlag)
Save the current metadata of this layer as the default metadata (either as a .qmd file on disk or as ...
QString legendUrl() const
Returns the URL for the layer's legend.
QgsCoordinateReferenceSystem crs() const
Returns the layer's spatial reference system.
Reads and writes project states.
QString publicSource() const
Gets a version of the internal layer definition that has sensitive bits removed (for example...
void setParam(const QString &key, const QString &value)
Set generic param (generic mode)
void setRenderer3D(QgsAbstract3DRenderer *renderer)
Sets 3D renderer for the layer.
void removeCustomProperty(const QString &key)
Remove a custom property from layer.
static QString extensionPropertyType(PropertyType type)
Returns the extension of a Property.
virtual bool importNamedStyle(QDomDocument &doc, QString &errorMsg)
Import the properties of this layer from a QDomDocument.
sqlite3_statement_unique_ptr prepare(const QString &sql, int &resultCode) const
Prepares a sql statement, returning the result.
double minimumScale() const
Returns the minimum map scale (i.e.
double maximumScale() const
Returns the maximum map scale (i.e.
bool mValid
Indicates if the layer is valid and can be drawn.
QString port() const
Returns the port.
void setName(const QString &name)
Set the display name of the layer.
void setDataUrlFormat(const QString &dataUrlFormat)
Sets the DataUrl format of the layer used by QGIS Server in GetCapabilities request.
int open(const QString &path)
Opens the database at the specified file path.
QStringList keys() const
Return list of stored keys.
QgsAbstract3DRenderer * renderer3D() const
Returns 3D renderer associated with the layer.
virtual bool readSld(const QDomNode &node, QString &errorMessage)
QString legendUrlFormat() const
Returns the format for a URL based layer legend.
Convert just the first letter of each word to uppercase, leave the rest untouched.
QString mMetadataUrlFormat
void setLegendUrl(const QString &legendUrl)
Sets the URL for the layer's legend.
bool hasDependencyCycle(const QSet< QgsMapLayerDependency > &layers) const
Checks whether a new set of dependencies will introduce a cycle.
void setMetadataUrlFormat(const QString &metaUrlFormat)
Sets the metadata format of the layer used by QGIS Server in GetCapabilities request.
QString title() const
Returns the title of the layer used by QGIS Server in GetCapabilities request.
static QString pkgDataPath()
Returns the common root path of all application data directories.
static CUSTOM_CRS_VALIDATION customCrsValidation()
Gets custom function.
void repaintRequested(bool deferredUpdate=false)
By emitting this signal the layer tells that either appearance or content have been changed and any v...
QString uri(bool expandAuthConfig=true) const
return complete uri
bool readLayerXml(const QDomElement &layerElement, const QgsReadWriteContext &context)
Sets state from Dom document.
QString mAttribution
Attribution of the layer.
QString mAbstract
Description of the layer.
void writeStyleManager(QDomNode &layerNode, QDomDocument &doc) const
Write style manager's configuration (if exists). To be called by subclasses.
Unique pointer for sqlite3 databases, which automatically closes the database when the pointer goes o...
void blendModeChanged(QPainter::CompositionMode blendMode)
Signal emitted when the blend mode is changed, through QgsMapLayer::setBlendMode() ...
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
QString mRefreshOnNofifyMessage
static QgsAuthManager * authManager()
Returns the application's authentication manager instance.
virtual bool readStyle(const QDomNode &node, QString &errorMessage, const QgsReadWriteContext &context)
Read the style for the current layer from the Dom node supplied.
int open_v2(const QString &path, int flags, const char *zVfs)
Opens the database at the specified file path.
virtual QString loadDefaultStyle(bool &resultFlag)
Retrieve the default style for this layer if one exists (either as a .qml file on disk or as a record...
virtual QString saveDefaultStyle(bool &resultFlag)
Save the properties of this layer as the default style (either as a .qml file on disk or as a record ...
void itemsChanged()
Emitted when existing items/nodes got invalid and should be replaced by new ones. ...
QString name() const
Returns the display name of the layer.
QString mDataSource
Data source description string, varies by layer type.
QString source() const
Returns the source for the layer.
bool hasScaleBasedVisibility() const
Returns whether scale based visibility is enabled for the layer.
QgsError is container for error messages (report).
bool setMasterPassword(bool verify=false)
Main call to initially set or continually check master password is set.
void setMinimumScale(double scale)
Sets the minimum map scale (i.e.
QByteArray encodedUri() const
return complete encoded uri (generic mode)
static QgsProject * instance()
Returns the QgsProject singleton instance.
Qgs3DRendererAbstractMetadata * rendererMetadata(const QString &type) const
Returns metadata for a 3D renderer type (may be used to create a new instance of the type) ...
QString mLegendUrl
WMS legend.
This class represents a coordinate reference system (CRS).
QString layerId() const
Return the ID of the layer this dependency depends on.
QgsVectorDataProvider * dataProvider() override
Returns the layer's data provider.
void legendChanged()
Signal emitted when legend of the layer has changed.
QString writePath(const QString &filename) const
Prepare a filename to save it to the project file.
Simple key-value store (keys = strings, values = variants) that supports loading/saving to/from XML i...
void setAutoRefreshInterval(int interval)
Sets the auto refresh interval (in milliseconds) for the layer.
virtual bool isSpatial() const
Returns true if the layer is considered a spatial layer, ie it has some form of geometry associated w...
bool readXml(const QDomNode &node)
Restores state from the given DOM node.
void setAttributionUrl(const QString &attribUrl)
Sets the attribution URL of the layer used by QGIS Server in GetCapabilities request.
virtual QString saveNamedStyle(const QString &uri, bool &resultFlag)
Save the properties of this layer as a named style (either as a .qml file on disk or as a record in t...
QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
virtual bool writeStyle(QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context) const
Write just the style information for the layer into the document.
QString loadDefaultMetadata(bool &resultFlag)
Retrieve the default metadata for this layer if one exists (either as a .qmd file on disk or as a rec...
QString metadataUrl() const
Returns the metadata URL of the layer used by QGIS Server in GetCapabilities request.
void setAutoRefreshEnabled(bool enabled)
Sets whether auto refresh is enabled for the layer.
QUndoStack * undoStackStyles()
Return pointer to layer's style undo stack.
QString password() const
Returns the password.
bool addStyle(const QString &name, const QgsMapLayerStyle &style)
Add a style with given name and data.
QVariant customProperty(const QString &value, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer.
QUndoStack * undoStack()
Return pointer to layer's undo stack.
void setAttribution(const QString &attrib)
Sets the attribution of the layer used by QGIS Server in GetCapabilities request. ...
void(* CUSTOM_CRS_VALIDATION)(QgsCoordinateReferenceSystem &)
QString providerType() const
Return the provider type for this layer.
void setRefreshOnNofifyMessage(const QString &message)
Set the notification message that triggers repaine If refresh on notification is enabled, the notification will triggerRepaint only if the notification message is equal to.
virtual QString loadNamedMetadata(const QString &uri, bool &resultFlag)
Retrieve a named metadata for this layer if one exists (either as a .qmd file on disk or as a record ...
bool hasAutoRefreshEnabled() const
Returns true if auto refresh is enabled for the layer.
void setLegend(QgsMapLayerLegend *legend)
Assign a legend controller to the map layer.
Class for storing the component parts of a PostgreSQL/RDBMS datasource URI.
bool writeXml(QDomNode &node, QDomDocument &doc) const
Stores state to the given Dom node in the given document.
void autoRefreshIntervalChanged(int interval)
Emitted when the auto refresh interval changes.
This class models dependencies with or between map layers.
Management of styles for use with one map layer.
QString refreshOnNotifyMessage() const
Returns the message that should be notified by the provider to triggerRepaint.
Represents a vector layer which manages a vector based data sets.
virtual QDateTime timestamp() const
Time stamp of data source in the moment when data/metadata were loaded by provider.
virtual void setLayerOrder(const QStringList &layers)
Reorders the previously selected sublayers of this layer from bottom to top.
void writeXml(QDomElement &mgrElement) const
Write configuration (for project saving)
bool writeLayerXml(QDomElement &layerElement, QDomDocument &document, const QgsReadWriteContext &context) const
Stores state in Dom node.
void setDataUrl(const QString &dataUrl)
Sets the DataUrl of the layer used by QGIS Server in GetCapabilities request.
void setValid(bool valid)
Set whether layer is valid or not - should be used in constructor.
QString database() const
Returns the database.
void setDatabase(const QString &database)
Set database.
void setAbstract(const QString &abstract)
Sets the abstract of the layer used by QGIS Server in GetCapabilities request.
static const double SCALE_PRECISION
Fudge factor used to compare two scales.
QString attribution() const
Returns the attribution of the layer used by QGIS Server in GetCapabilities request.
QString metadataUrlType() const
Returns the metadata type of the layer used by QGIS Server in GetCapabilities request.
void setScaleBasedVisibility(const bool enabled)
Sets whether scale based visibility is enabled for the layer.
QPainter::CompositionMode blendMode() const
Returns the current blending mode for a layer.
void renderer3DChanged()
Signal emitted when 3D renderer associated with the layer has changed.
static QString removePassword(const QString &aUri)
Removes password element from uris.
bool importNamedMetadata(QDomDocument &document, QString &errorMessage)
Import the metadata of this layer from a QDomDocument.
virtual QString metadataUri() const
Retrieve the metadata URI for this layer (either as a .qmd file on disk or as a record in the users s...
virtual bool setDependencies(const QSet< QgsMapLayerDependency > &layers)
Sets the list of dependencies.
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
virtual void exportNamedStyle(QDomDocument &doc, QString &errorMsg) const
Export the properties of this layer as named style in a QDomDocument.