23#include <QRegularExpression>
42 mConstraints << constraint;
102 layer->
setCustomProperty( QStringLiteral(
"metadata/extent" ), QVariant::fromValue( mExtent ) );
110 layer->
setCustomProperty( QStringLiteral(
"metadata/constraints" ), QVariant::fromValue( mConstraints ) );
124 mFees = layer->
customProperty( QStringLiteral(
"metadata/fees" ) ).toString();
125 mRights = layer->
customProperty( QStringLiteral(
"metadata/rights" ) ).toStringList();
126 mLicenses = layer->
customProperty( QStringLiteral(
"metadata/licenses" ) ).toStringList();
128 mEncoding = layer->
customProperty( QStringLiteral(
"metadata/encoding" ) ).toString();
129 const QString crsAuthId = layer->
customProperty( QStringLiteral(
"metadata/crs" ) ).toString();
146 mnl = metadataElement.namedItem( QStringLiteral(
"fees" ) );
147 mFees = mnl.toElement().text();
150 const QDomNodeList constraintsList = metadataElement.elementsByTagName( QStringLiteral(
"constraints" ) );
151 mConstraints.clear();
152 for (
int i = 0; i < constraintsList.size(); i++ )
154 mnl = constraintsList.at( i );
155 mne = mnl.toElement();
160 const QDomNodeList rightsNodeList = metadataElement.elementsByTagName( QStringLiteral(
"rights" ) );
161 QStringList rightsList;
162 for (
int i = 0; i < rightsNodeList.size(); i++ )
164 mnl = rightsNodeList.at( i );
165 mne = mnl.toElement();
167 rightsList.append( right );
172 const QDomNodeList licensesNodeList = metadataElement.elementsByTagName( QStringLiteral(
"license" ) );
173 QStringList licensesList;
174 for (
int i = 0; i < licensesNodeList.size(); i++ )
176 mnl = licensesNodeList.at( i );
177 mne = mnl.toElement();
178 licensesList.append( mne.text() );
183 mnl = metadataElement.namedItem( QStringLiteral(
"encoding" ) );
184 mEncoding = mnl.toElement().text();
187 mnl = metadataElement.namedItem( QStringLiteral(
"crs" ) );
188 if ( !mCrs.readXml( mnl ) )
192 mnl = metadataElement.namedItem( QStringLiteral(
"extent" ) );
196 const QDomNodeList spatialList = mnl.toElement().elementsByTagName( QStringLiteral(
"spatial" ) );
197 QList< QgsLayerMetadata::SpatialExtent > metadataSpatialExtents;
198 for (
int i = 0; i < spatialList.size(); i++ )
200 mnl = spatialList.at( i );
201 mne = mnl.toElement();
211 metadataSpatialExtents.append( se );
216 mnl = metadataElement.namedItem( QStringLiteral(
"extent" ) );
217 const QDomNodeList temporalList = mnl.toElement().elementsByTagName( QStringLiteral(
"temporal" ) );
218 QList<QgsDateTimeRange> metadataDates;
219 for (
int j = 0; j < temporalList.size(); j++ )
221 mnl = temporalList.at( j );
222 const QDomNodeList instantList = mnl.toElement().elementsByTagName( QStringLiteral(
"instant" ) );
223 for (
int i = 0; i < instantList.size(); i++ )
225 mnl = instantList.at( i );
226 const QDateTime d = QDateTime::fromString( mnl.toElement().text(), Qt::ISODate );
228 metadataDates << date;
230 const QDomNodeList periodList = mnl.toElement().elementsByTagName( QStringLiteral(
"period" ) );
231 for (
int i = 0; i < periodList.size(); i++ )
233 const QDomNode begin = periodList.at( i ).namedItem( QStringLiteral(
"start" ) );
234 const QDomNode end = periodList.at( i ).namedItem( QStringLiteral(
"end" ) );
235 const QDateTime beginDate = QDateTime::fromString( begin.toElement().text(), Qt::ISODate );
236 const QDateTime endDate = QDateTime::fromString( end.toElement().text(), Qt::ISODate );
238 metadataDates << date;
252 QDomElement
fees = document.createElement( QStringLiteral(
"fees" ) );
253 const QDomText feesText = document.createTextNode( mFees );
254 fees.appendChild( feesText );
255 metadataElement.appendChild(
fees );
260 QDomElement constraintElement = document.createElement( QStringLiteral(
"constraints" ) );
261 constraintElement.setAttribute( QStringLiteral(
"type" ), constraint.type );
262 const QDomText constraintText = document.createTextNode( constraint.constraint );
263 constraintElement.appendChild( constraintText );
264 metadataElement.appendChild( constraintElement );
268 for (
const QString &right : mRights )
270 QDomElement rightElement = document.createElement( QStringLiteral(
"rights" ) );
271 const QDomText rightText = document.createTextNode( right );
272 rightElement.appendChild( rightText );
273 metadataElement.appendChild( rightElement );
277 for (
const QString &license : mLicenses )
279 QDomElement licenseElement = document.createElement( QStringLiteral(
"license" ) );
280 const QDomText licenseText = document.createTextNode( license );
281 licenseElement.appendChild( licenseText );
282 metadataElement.appendChild( licenseElement );
286 QDomElement
encoding = document.createElement( QStringLiteral(
"encoding" ) );
287 const QDomText encodingText = document.createTextNode( mEncoding );
288 encoding.appendChild( encodingText );
289 metadataElement.appendChild(
encoding );
292 QDomElement crsElement = document.createElement( QStringLiteral(
"crs" ) );
293 mCrs.writeXml( crsElement, document );
294 metadataElement.appendChild( crsElement );
297 QDomElement extentElement = document.createElement( QStringLiteral(
"extent" ) );
303 QDomElement spatialElement = document.createElement( QStringLiteral(
"spatial" ) );
305 spatialElement.setAttribute( QStringLiteral(
"dimensions" ), QStringLiteral(
"2" ) );
306 spatialElement.setAttribute( QStringLiteral(
"crs" ), spatialExtent.extentCrs.authid() );
307 spatialElement.setAttribute( QStringLiteral(
"minx" ),
qgsDoubleToString( spatialExtent.bounds.xMinimum() ) );
308 spatialElement.setAttribute( QStringLiteral(
"miny" ),
qgsDoubleToString( spatialExtent.bounds.yMinimum() ) );
309 spatialElement.setAttribute( QStringLiteral(
"minz" ),
qgsDoubleToString( spatialExtent.bounds.zMinimum() ) );
310 spatialElement.setAttribute( QStringLiteral(
"maxx" ),
qgsDoubleToString( spatialExtent.bounds.xMaximum() ) );
311 spatialElement.setAttribute( QStringLiteral(
"maxy" ),
qgsDoubleToString( spatialExtent.bounds.yMaximum() ) );
312 spatialElement.setAttribute( QStringLiteral(
"maxz" ),
qgsDoubleToString( spatialExtent.bounds.zMaximum() ) );
313 extentElement.appendChild( spatialElement );
320 QDomElement temporalElement = document.createElement( QStringLiteral(
"temporal" ) );
321 if ( temporalExtent.isInstant() )
323 QDomElement instantElement = document.createElement( QStringLiteral(
"instant" ) );
324 const QDomText instantText = document.createTextNode( temporalExtent.begin().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODate ) );
325 instantElement.appendChild( instantText );
326 temporalElement.appendChild( instantElement );
330 QDomElement periodElement = document.createElement( QStringLiteral(
"period" ) );
331 QDomElement startElement = document.createElement( QStringLiteral(
"start" ) );
332 QDomElement endElement = document.createElement( QStringLiteral(
"end" ) );
333 const QDomText startText = document.createTextNode( temporalExtent.begin().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODate ) );
334 const QDomText endText = document.createTextNode( temporalExtent.end().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODate ) );
335 startElement.appendChild( startText );
336 endElement.appendChild( endText );
337 periodElement.appendChild( startElement );
338 periodElement.appendChild( endElement );
339 temporalElement.appendChild( periodElement );
341 extentElement.appendChild( temporalElement );
344 metadataElement.appendChild( extentElement );
353 for (
const QString &right : std::as_const( mRights ) )
365 if ( !otherLayerMetadata->fees().isEmpty() )
366 mFees = otherLayerMetadata->fees();
368 if ( !otherLayerMetadata->constraints().isEmpty() )
369 mConstraints = otherLayerMetadata->constraints();
371 if ( !otherLayerMetadata->rights().isEmpty() )
372 mRights = otherLayerMetadata->rights();
374 if ( !otherLayerMetadata->licenses().isEmpty() )
375 mLicenses = otherLayerMetadata->licenses();
377 if ( !otherLayerMetadata->encoding().isEmpty() )
378 mEncoding = otherLayerMetadata->encoding();
380 if ( otherLayerMetadata->crs().isValid() )
381 mCrs = otherLayerMetadata->crs();
383 if ( !otherLayerMetadata->extent().spatialExtents().isEmpty() )
384 mExtent.setSpatialExtents( otherLayerMetadata->extent().spatialExtents() );
386 if ( !otherLayerMetadata->extent().temporalExtents().isEmpty() )
387 mExtent.setTemporalExtents( otherLayerMetadata->extent().temporalExtents() );
408 return mSpatialExtents;
418 return mTemporalExtents;
428 return mSpatialExtents == other.mSpatialExtents && mTemporalExtents == other.mTemporalExtents;
434 mFees == other.mFees &&
435 mConstraints == other.mConstraints &&
436 mRights == other.mRights &&
437 mLicenses == other.mLicenses &&
438 mEncoding == other.mEncoding &&
439 mCrs == other.mCrs &&
440 mExtent == other.mExtent;
446 if ( searchString.trimmed().isEmpty() )
451 if (
title().
contains( searchString, Qt::CaseInsensitive ) ||
458 const QList<QStringList> keyVals {
keywords().values() };
459 for (
const QStringList &kws : std::as_const( keyVals ) )
461 for (
const QString &kw : std::as_const( kws ) )
463 if ( kw.contains( searchString, Qt::CaseSensitivity::CaseInsensitive ) )
471 for (
const QString &cat : std::as_const( constCat ) )
473 if ( cat.contains( searchString, Qt::CaseSensitivity::CaseInsensitive ) )
484 for (
const QRegularExpression &re : std::as_const( searchReList ) )
486 if ( re.match(
title() ).hasMatch() ||
493 const QList<QStringList> keyVals {
keywords().values() };
494 for (
const QStringList &kws : std::as_const( keyVals ) )
496 for (
const QString &kw : std::as_const( kws ) )
498 if ( re.match( kw ).hasMatch() )
506 for (
const QString &cat : std::as_const( constCat ) )
508 if ( re.match( cat ).hasMatch() )
A 3-dimensional box composed of x, y, z coordinates.
void setZMinimum(double z)
Sets the minimum z value.
void setYMaximum(double y)
Sets the maximum y value.
void setZMaximum(double z)
Sets the maximum z value.
void setXMaximum(double x)
Sets the maximum x value.
void setYMinimum(double y)
Sets the minimum y value.
void setXMinimum(double x)
Sets the minimum x value.
Represents a coordinate reference system (CRS).
static QgsCoordinateReferenceSystem fromOgcWmsCrs(const QString &ogcCrs)
Creates a CRS from a given OGC WMS-format Coordinate Reference System string.
Base class for all map layer types.
Q_INVOKABLE QVariant customProperty(const QString &value, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer.
Q_INVOKABLE void setCustomProperty(const QString &key, const QVariant &value)
Set a custom property for layer.
virtual QString translate(const QString &context, const QString &sourceText, const char *disambiguation=nullptr, int n=-1) const =0
Translates a string using the Qt QTranslator mechanism.
A container for the context for various read/write operations on objects.
const QgsProjectTranslator * projectTranslator() const
Returns the project translator.
Used for the collecting of strings from projects for translation and creation of ts files.
void registerTranslation(const QString &context, const QString &source)
Registers the source to be translated.
QList< QgsAbstractMetadataBase::Link > LinkList
A list of links.
QList< QgsAbstractMetadataBase::Contact > ContactList
A list of contacts.
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
QgsTemporalRange< QDateTime > QgsDateTimeRange
QgsRange which stores a range of date times.