17 #include <QDomElement>
28 if (
"unknown" == element.text() )
43 const QDomNode xminNode = element.namedItem( QStringLiteral(
"xmin" ) );
44 const QDomNode yminNode = element.namedItem( QStringLiteral(
"ymin" ) );
45 const QDomNode xmaxNode = element.namedItem( QStringLiteral(
"xmax" ) );
46 const QDomNode ymaxNode = element.namedItem( QStringLiteral(
"ymax" ) );
48 QDomElement exElement = xminNode.toElement();
49 const double xmin = exElement.text().toDouble();
52 exElement = yminNode.toElement();
53 const double ymin = exElement.text().toDouble();
56 exElement = xmaxNode.toElement();
57 const double xmax = exElement.text().toDouble();
60 exElement = ymaxNode.toElement();
61 const double ymax = exElement.text().toDouble();
74 unitsString = QStringLiteral(
"unknown" );
76 QDomElement unitsNode = doc.createElement( QStringLiteral(
"units" ) );
77 unitsNode.appendChild( doc.createTextNode( unitsString ) );
83 QDomElement xMin = doc.createElement( QStringLiteral(
"xmin" ) );
84 QDomElement yMin = doc.createElement( QStringLiteral(
"ymin" ) );
85 QDomElement xMax = doc.createElement( QStringLiteral(
"xmax" ) );
86 QDomElement yMax = doc.createElement( QStringLiteral(
"ymax" ) );
93 xMin.appendChild( xMinText );
94 yMin.appendChild( yMinText );
95 xMax.appendChild( xMaxText );
96 yMax.appendChild( yMaxText );
98 QDomElement extentNode = doc.createElement( elementName );
99 extentNode.appendChild( xMin );
100 extentNode.appendChild( yMin );
101 extentNode.appendChild( xMax );
102 extentNode.appendChild( yMax );
108 QDomElement element = doc.createElement( QStringLiteral(
"Option" ) );
109 switch ( value.type() )
111 case QVariant::Invalid:
113 element.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"invalid" ) );
119 const QVariantMap map = value.toMap();
121 for (
auto option = map.constBegin(); option != map.constEnd(); ++option )
123 QDomElement optionElement =
writeVariant( option.value(), doc );
124 optionElement.setAttribute( QStringLiteral(
"name" ), option.key() );
125 element.appendChild( optionElement );
126 element.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"Map" ) );
133 const QVariantList list = value.toList();
135 const auto constList = list;
136 for (
const QVariant &value : constList )
138 const QDomElement valueElement =
writeVariant( value, doc );
139 element.appendChild( valueElement );
140 element.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"List" ) );
145 case QVariant::StringList:
147 const QStringList list = value.toStringList();
149 const auto constList = list;
150 for (
const QString &value : constList )
152 const QDomElement valueElement =
writeVariant( value, doc );
153 element.appendChild( valueElement );
154 element.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"StringList" ) );
162 case QVariant::Double:
163 case QVariant::LongLong:
164 case QVariant::ULongLong:
165 case QVariant::String:
166 element.setAttribute( QStringLiteral(
"type" ), QVariant::typeToName( value.type() ) );
167 element.setAttribute( QStringLiteral(
"value" ), value.toString() );
171 element.setAttribute( QStringLiteral(
"type" ), QVariant::typeToName( value.type() ) );
172 element.setAttribute( QStringLiteral(
"value" ), value.isNull() ? QString() : value.toString() );
175 case QVariant::Color:
176 element.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"color" ) );
177 element.setAttribute( QStringLiteral(
"value" ), value.value< QColor >().isValid() ?
QgsSymbolLayerUtils::encodeColor( value.value< QColor >() ) : QString() );
180 case QVariant::DateTime:
181 element.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"datetime" ) );
182 element.setAttribute( QStringLiteral(
"value" ), value.value< QDateTime >().isValid() ? value.toDateTime().toString( Qt::ISODate ) : QString() );
186 element.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"date" ) );
187 element.setAttribute( QStringLiteral(
"value" ), value.value< QDate >().isValid() ? value.toDate().toString( Qt::ISODate ) : QString() );
191 element.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"time" ) );
192 element.setAttribute( QStringLiteral(
"value" ), value.value< QTime >().isValid() ? value.toTime().toString( Qt::ISODate ) : QString() );
195 case QVariant::UserType:
199 element.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"QgsProperty" ) );
201 element.appendChild( propertyElem );
206 element.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"QgsCoordinateReferenceSystem" ) );
213 element.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"QgsGeometry" ) );
215 element.setAttribute( QStringLiteral(
"value" ), geom.
asWkt() );
221 element.appendChild( valueElement );
222 element.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"QgsProcessingOutputLayerDefinition" ) );
228 element.appendChild( valueElement );
229 element.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"QgsProcessingFeatureSourceDefinition" ) );
235 element.appendChild( valueElement );
236 element.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"QgsRemappingSinkDefinition" ) );
239 Q_ASSERT_X(
false,
"QgsXmlUtils::writeVariant", QStringLiteral(
"unsupported user variant type %1" ).arg(
QMetaType::typeName( value.userType() ) ).toLocal8Bit() );
244 Q_ASSERT_X(
false,
"QgsXmlUtils::writeVariant", QStringLiteral(
"unsupported variant type %1" ).arg( QVariant::typeToName( value.type() ) ).toLocal8Bit() );
253 const QString type = element.attribute( QStringLiteral(
"type" ) );
255 if ( type == QLatin1String(
"invalid" ) )
259 else if ( type == QLatin1String(
"int" ) )
261 return element.attribute( QStringLiteral(
"value" ) ).toInt();
263 else if ( type == QLatin1String(
"uint" ) )
265 return element.attribute( QStringLiteral(
"value" ) ).toUInt();
267 else if ( type == QLatin1String(
"qlonglong" ) )
269 return element.attribute( QStringLiteral(
"value" ) ).toLongLong();
271 else if ( type == QLatin1String(
"qulonglong" ) )
273 return element.attribute( QStringLiteral(
"value" ) ).toULongLong();
275 else if ( type == QLatin1String(
"double" ) )
277 return element.attribute( QStringLiteral(
"value" ) ).toDouble();
279 else if ( type == QLatin1String(
"QString" ) )
281 return element.attribute( QStringLiteral(
"value" ) );
283 else if ( type == QLatin1String(
"QChar" ) )
285 const QString res = element.attribute( QStringLiteral(
"value" ) );
286 return res.isEmpty() ? QChar() : res.at( 0 );
288 else if ( type == QLatin1String(
"bool" ) )
290 return element.attribute( QStringLiteral(
"value" ) ) == QLatin1String(
"true" );
292 else if ( type == QLatin1String(
"color" ) )
294 return element.attribute( QStringLiteral(
"value" ) ).isEmpty() ? QColor() :
QgsSymbolLayerUtils::decodeColor( element.attribute( QStringLiteral(
"value" ) ) );
296 else if ( type == QLatin1String(
"datetime" ) )
298 return element.attribute( QStringLiteral(
"value" ) ).isEmpty() ? QDateTime() : QDateTime::fromString( element.attribute( QStringLiteral(
"value" ) ), Qt::ISODate );
300 else if ( type == QLatin1String(
"date" ) )
302 return element.attribute( QStringLiteral(
"value" ) ).isEmpty() ? QDate() : QDate::fromString( element.attribute( QStringLiteral(
"value" ) ), Qt::ISODate );
304 else if ( type == QLatin1String(
"time" ) )
306 return element.attribute( QStringLiteral(
"value" ) ).isEmpty() ? QTime() : QTime::fromString( element.attribute( QStringLiteral(
"value" ) ), Qt::ISODate );
308 else if ( type == QLatin1String(
"Map" ) )
311 const QDomNodeList options = element.childNodes();
313 for (
int i = 0; i < options.count(); ++i )
315 const QDomElement elem = options.at( i ).toElement();
316 if ( elem.tagName() == QLatin1String(
"Option" ) )
317 map.insert( elem.attribute( QStringLiteral(
"name" ) ),
readVariant( elem ) );
321 else if ( type == QLatin1String(
"List" ) )
324 const QDomNodeList values = element.childNodes();
325 for (
int i = 0; i < values.count(); ++i )
327 const QDomElement elem = values.at( i ).toElement();
332 else if ( type == QLatin1String(
"StringList" ) )
335 const QDomNodeList values = element.childNodes();
336 for (
int i = 0; i < values.count(); ++i )
338 const QDomElement elem = values.at( i ).toElement();
343 else if ( type == QLatin1String(
"QgsProperty" ) )
345 const QDomNodeList values = element.childNodes();
346 if ( values.isEmpty() )
355 else if ( type == QLatin1String(
"QgsCoordinateReferenceSystem" ) )
361 else if ( type == QLatin1String(
"QgsGeometry" ) )
365 else if ( type == QLatin1String(
"QgsProcessingOutputLayerDefinition" ) )
368 const QDomNodeList values = element.childNodes();
369 if ( values.isEmpty() )
377 else if ( type == QLatin1String(
"QgsProcessingFeatureSourceDefinition" ) )
380 const QDomNodeList values = element.childNodes();
381 if ( values.isEmpty() )
389 else if ( type == QLatin1String(
"QgsRemappingSinkDefinition" ) )
392 const QDomNodeList values = element.childNodes();
393 if ( values.isEmpty() )
397 return QVariant::fromValue( res );
This class represents a coordinate reference system (CRS).
bool readXml(const QDomNode &node)
Restores state from the given DOM node.
bool writeXml(QDomNode &node, QDomDocument &doc) const
Stores state to the given Dom node in the given document.
A geometry is the spatial representation of a feature.
static QgsGeometry fromWkt(const QString &wkt)
Creates a new geometry from a WKT string.
QString asWkt(int precision=17) const
Exports the geometry to WKT.
Encapsulates settings relating to a feature source input to a processing algorithm.
bool loadVariant(const QVariantMap &map)
Loads this source definition from a QVariantMap, wrapped in a QVariant.
QVariant toVariant() const
Saves this source definition to a QVariantMap, wrapped in a QVariant.
Encapsulates settings relating to a feature sink or output raster layer for a processing algorithm.
bool loadVariant(const QVariantMap &map)
Loads this output layer definition from a QVariantMap, wrapped in a QVariant.
QVariant toVariant() const
Saves this output layer definition to a QVariantMap, wrapped in a QVariant.
A store for object properties.
QVariant toVariant() const
Saves this property to a QVariantMap, wrapped in a QVariant.
bool loadVariant(const QVariant &property)
Loads this property from a QVariantMap, wrapped in a QVariant.
A rectangle specified with double values.
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
void setYMinimum(double y) SIP_HOLDGIL
Set the minimum y value.
void setXMaximum(double x) SIP_HOLDGIL
Set the maximum x value.
void setXMinimum(double x) SIP_HOLDGIL
Set the minimum x value.
void setYMaximum(double y) SIP_HOLDGIL
Set the maximum y value.
Defines the parameters used to remap features when creating a QgsRemappingProxyFeatureSink.
QVariant toVariant() const
Saves this remapping definition to a QVariantMap, wrapped in a QVariant.
bool loadVariant(const QVariantMap &map)
Loads this remapping definition from a QVariantMap, wrapped in a QVariant.
static QColor decodeColor(const QString &str)
static QString encodeColor(const QColor &color)
DistanceUnit
Units of distance.
@ DistanceDegrees
Degrees, for planar geographic CRS distance measurements.
@ DistanceUnknownUnit
Unknown distance unit.
static Q_INVOKABLE QString encodeUnit(QgsUnitTypes::DistanceUnit unit)
Encodes a distance unit to a string.
static Q_INVOKABLE QgsUnitTypes::DistanceUnit decodeDistanceUnit(const QString &string, bool *ok=nullptr)
Decodes a distance unit from a string.
static QDomElement writeVariant(const QVariant &value, QDomDocument &doc)
Write a QVariant to a QDomElement.
static QDomElement writeRectangle(const QgsRectangle &rect, QDomDocument &doc, const QString &elementName=QStringLiteral("extent"))
Encodes a rectangle to a DOM element.
static QVariant readVariant(const QDomElement &element)
Read a QVariant from a QDomElement.
static QDomElement writeMapUnits(QgsUnitTypes::DistanceUnit units, QDomDocument &doc)
Encodes a distance unit to a DOM element.
static QgsUnitTypes::DistanceUnit readMapUnits(const QDomElement &element)
Decodes a distance unit from a DOM element.
static QgsRectangle readRectangle(const QDomElement &element)
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
const QgsCoordinateReferenceSystem & crs