QGIS API Documentation 4.3.0-Master (45633be667c)
Loading...
Searching...
No Matches
qgsprocessingparametertileextentmaxzoomlist.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsprocessingparametertileextentmaxzoomlist.cpp
3 ---------------------
4 Date : September 2026
5 Copyright : (C) 2026 by Nyall Dawson
6 Email : nyall dot dawson at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
19
20#include <QString>
21
22using namespace Qt::StringLiterals;
23
24//
25// QgsProcessingParameterTileExtentMaxZoomList
26//
30
35
40
42{
43 QVariant input = value;
44 if ( !input.isValid() )
45 {
46 if ( !defaultValue().isValid() )
48
49 input = defaultValue();
50 }
51
52 if ( input.typeId() == QMetaType::Type::QVariantList )
53 {
54 const QVariantList list = input.toList();
55 for ( const QVariant &item : list )
56 {
57 if ( item.typeId() != QMetaType::Type::QVariantMap )
58 {
59 return false;
60 }
61
62 const QVariantMap map = item.toMap();
63 if ( !map.contains( u"extent"_s ) || !map.contains( u"max_zoom"_s ) )
64 {
65 return false;
66 }
67 }
68 return true;
69 }
70 else if ( input.typeId() == QMetaType::Type::QString )
71 {
72 const QStringList regionStrings = input.toString().split( "::|::"_L1 );
73 QList<QgsTileExtentMaxZoomRegion> regions;
74 regions.reserve( regionStrings.size() );
75 for ( const QString &regionString : regionStrings )
76 {
77 const int sepPos = regionString.indexOf( ':' );
78 if ( sepPos < 0 )
79 return false;
80
81 const QString zoomPart = regionString.left( sepPos );
82 bool ok = false;
83 ( void ) zoomPart.toInt( &ok );
84 if ( !ok )
85 return false;
86
87 const QString extentPart = regionString.mid( sepPos + 1 );
88 if ( extentPart.isEmpty() )
89 return false;
90 }
91 return true;
92 }
93
94 return false;
95}
96
98{
99 if ( QgsVariantUtils::isNull( value ) )
100 return u"None"_s;
101
102 const QList<QgsTileExtentMaxZoomRegion> regions = parameterAsRegionList( value, context );
103 QStringList listItems;
104 listItems.reserve( regions.size() );
105 for ( const QgsTileExtentMaxZoomRegion &region : regions )
106 {
107 const QString regionExtentString = u"'%1, %3, %2, %4 [%5]'"_s.arg(
108 qgsDoubleToString( region.extent.xMinimum() ),
109 qgsDoubleToString( region.extent.yMinimum() ),
110 qgsDoubleToString( region.extent.xMaximum() ),
111 qgsDoubleToString( region.extent.yMaximum() ),
112 region.extent.crs().authid()
113 );
114 listItems.append( u"{'extent': %1, 'max_zoom': %2}"_s.arg( regionExtentString ).arg( region.maxZoom ) );
115 }
116
117 return u"[%1]"_s.arg( listItems.join( ", "_L1 ) );
118}
119
120QString QgsProcessingParameterTileExtentMaxZoomList::valueAsString( const QVariant &value, QgsProcessingContext &context, bool &ok ) const
121{
122 ok = true;
123 if ( QgsVariantUtils::isNull( value ) )
124 return QString();
125
126 const QList<QgsTileExtentMaxZoomRegion> regions = parameterAsRegionList( value, context );
127 QStringList stringListItems;
128 stringListItems.reserve( regions.size() );
129 for ( const QgsTileExtentMaxZoomRegion &region : regions )
130 {
131 const QString regionExtentString = u"%1,%3,%2,%4 [%5]"_s.arg(
132 qgsDoubleToString( region.extent.xMinimum() ),
133 qgsDoubleToString( region.extent.yMinimum() ),
134 qgsDoubleToString( region.extent.xMaximum() ),
135 qgsDoubleToString( region.extent.yMaximum() ),
136 region.extent.crs().authid()
137 );
138 stringListItems.append( u"%1:%2"_s.arg( region.maxZoom ).arg( regionExtentString ) );
139 }
140
141 return stringListItems.join( "::|::"_L1 );
142}
143
145{
146 if ( QgsVariantUtils::isNull( value ) )
147 return QVariant();
148
149 const QList<QgsTileExtentMaxZoomRegion> regions = parameterAsRegionList( value, context );
150 QVariantList jsonListItems;
151 jsonListItems.reserve( regions.size() );
152 for ( const QgsTileExtentMaxZoomRegion &region : regions )
153 {
154 const QString regionExtentString = u"'%1,%3,%2,%4 [%5]'"_s.arg(
155 qgsDoubleToString( region.extent.xMinimum() ),
156 qgsDoubleToString( region.extent.yMinimum() ),
157 qgsDoubleToString( region.extent.xMaximum() ),
158 qgsDoubleToString( region.extent.yMaximum() ),
159 region.extent.crs().authid()
160 );
161 QVariantMap regionMap;
162 regionMap[u"extent"_s] = regionExtentString;
163 regionMap[u"max_zoom"_s] = region.maxZoom;
164 jsonListItems.append( regionMap );
165 }
166
167 return jsonListItems;
168}
169
170QList<QgsTileExtentMaxZoomRegion> QgsProcessingParameterTileExtentMaxZoomList::parameterAsRegionList( const QVariant &variant, QgsProcessingContext &context ) const
171{
172 if ( QgsVariantUtils::isNull( variant ) )
173 return {};
174
175 if ( variant.typeId() == QMetaType::Type::QVariantList )
176 {
177 QList<QgsTileExtentMaxZoomRegion> regions;
178 const QVariantList list = variant.toList();
179 regions.reserve( list.size() );
180
181 for ( const QVariant &item : list )
182 {
183 if ( item.typeId() == QMetaType::Type::QVariantMap )
184 {
185 regions.append( regionFromVariantMap( item.toMap(), context ) );
186 }
187 }
188 return regions;
189 }
190 else if ( variant.typeId() == QMetaType::Type::QString )
191 {
192 const QStringList regionStrings = variant.toString().split( "::|::"_L1 );
193 QList<QgsTileExtentMaxZoomRegion> regions;
194 regions.reserve( regionStrings.size() );
195 for ( const QString &regionString : regionStrings )
196 {
197 const QgsTileExtentMaxZoomRegion region = regionFromVariant( regionString, context );
198 if ( region.extent.isNull() )
199 continue;
200
201 regions.append( region );
202 }
203 return regions;
204 }
205 return {};
206}
207
208QVariant QgsProcessingParameterTileExtentMaxZoomList::toVariant( const QList<QgsTileExtentMaxZoomRegion> &regions )
209{
210 QVariantList res;
211 res.reserve( regions.size() );
212 for ( const QgsTileExtentMaxZoomRegion &region : regions )
213 {
214 res.append( regionToVariantMap( region ) );
215 }
216 return res;
217}
218
220{
221 if ( variant.userType() == QVariant::Map )
222 {
223 return regionFromVariantMap( variant.toMap(), context );
224 }
225 else if ( variant.userType() == QVariant::String )
226 {
227 const QString regionString = variant.toString();
228 const int sepPos = regionString.indexOf( ':' );
229 if ( sepPos < 0 )
231
232 const QString zoomPart = regionString.left( sepPos );
233 const QString extentPart = regionString.mid( sepPos + 1 );
235 region.maxZoom = zoomPart.toInt();
237 const QgsRectangle rect = QgsProcessingParameters::parameterAsExtent( this, extentPart, context );
238 region.extent = QgsReferencedRectangle( rect, crs );
239 return region;
240 }
242}
243
244int QgsProcessingParameterTileExtentMaxZoomList::maxZoomForTile( const QgsRectangle &tileExtent, const QList<QgsTileExtentMaxZoomRegion> &regions, int defaultMaxZoom )
245{
246 int effectiveMaxZoom = -1;
247
248 for ( const QgsTileExtentMaxZoomRegion &region : regions )
249 {
250 if ( region.extent.intersects( tileExtent ) )
251 {
252 effectiveMaxZoom = std::max( effectiveMaxZoom, region.maxZoom );
253 }
254 }
255
256 return ( effectiveMaxZoom >= 0 ) ? effectiveMaxZoom : defaultMaxZoom;
257}
258
259QVariantMap QgsProcessingParameterTileExtentMaxZoomList::regionToVariantMap( const QgsTileExtentMaxZoomRegion &region )
260{
261 QVariantMap map;
262 const QString regionExtentString = u"%1,%3,%2,%4 [%5]"_s.arg(
267 region.extent.crs().authid()
268 );
269
270 map.insert( u"extent"_s, regionExtentString );
271 map.insert( u"max_zoom"_s, region.maxZoom );
272 return map;
273}
274
275QgsTileExtentMaxZoomRegion QgsProcessingParameterTileExtentMaxZoomList::regionFromVariantMap( const QVariantMap &map, QgsProcessingContext &context ) const
276{
277 QgsTileExtentMaxZoomRegion region;
278 region.maxZoom = map.value( u"max_zoom"_s, 0 ).toInt();
279
280 const QgsCoordinateReferenceSystem crs = QgsProcessingParameters::parameterAsExtentCrs( this, map.value( "extent" ), context );
281 const QgsRectangle rect = QgsProcessingParameters::parameterAsExtent( this, map.value( "extent" ), context );
282 region.extent = QgsReferencedRectangle( rect, crs );
283
284 return region;
285}
@ Optional
Parameter is optional.
Definition qgis.h:4008
Represents a coordinate reference system (CRS).
Contains information about the context in which a processing algorithm is executed.
QVariant defaultValue() const
Returns the default value for the parameter.
Qgis::ProcessingParameterFlags mFlags
Parameter flags.
QString description() const
Returns the description for the parameter.
QgsProcessingParameterDefinition(const QString &name, const QString &description=QString(), const QVariant &defaultValue=QVariant(), bool optional=false, const QString &help=QString())
Constructor for QgsProcessingParameterDefinition.
QString name() const
Returns the name of the parameter.
QList< QgsTileExtentMaxZoomRegion > parameterAsRegionList(const QVariant &variant, QgsProcessingContext &context) const
Converts a parameter variant value to a list of QgsTileExtentMaxZoomRegion objects.
QString valueAsPythonString(const QVariant &value, QgsProcessingContext &context) const override
Returns a string version of the parameter input value, which is suitable for use as an input paramete...
QString valueAsString(const QVariant &value, QgsProcessingContext &context, bool &ok) const override
Returns a string version of the parameter input value (if possible).
QString type() const override
Unique parameter type name.
bool checkValueIsAcceptable(const QVariant &input, QgsProcessingContext *context=nullptr) const override
Checks whether the specified input value is acceptable for the parameter.
static QVariant toVariant(const QList< QgsTileExtentMaxZoomRegion > &regions)
Converts a list of regions to variant value.
static QString typeName()
Returns the type name for the parameter class.
QgsProcessingParameterTileExtentMaxZoomList(const QString &name, const QString &description=QString(), const QVariant &defaultValue=QVariant(), bool optional=false)
Constructor for QgsProcessingParameterTileExtentMaxZoomList.
QgsProcessingParameterTileExtentMaxZoomList * clone() const override
Creates a clone of the parameter definition.
QVariant valueAsJsonObject(const QVariant &value, QgsProcessingContext &context) const override
Returns a version of the parameter input value, which is suitable for use in a JSON object.
QgsTileExtentMaxZoomRegion regionFromVariant(const QVariant &variant, QgsProcessingContext &context) const
Converts a variant to a region value.
static int maxZoomForTile(const QgsRectangle &tileExtent, const QList< QgsTileExtentMaxZoomRegion > &regions, int defaultMaxZoom)
Evaluates the effective maximum zoom level for a given tileExtent.
static QgsRectangle parameterAsExtent(const QgsProcessingParameterDefinition *definition, const QVariantMap &parameters, QgsProcessingContext &context, const QgsCoordinateReferenceSystem &crs=QgsCoordinateReferenceSystem())
Evaluates the parameter with matching definition to a rectangular extent.
static QgsCoordinateReferenceSystem parameterAsExtentCrs(const QgsProcessingParameterDefinition *definition, const QVariantMap &parameters, QgsProcessingContext &context)
Returns the coordinate reference system associated with an extent parameter value.
A rectangle specified with double values.
double xMinimum
double yMinimum
double xMaximum
double yMaximum
QgsCoordinateReferenceSystem crs() const
Returns the associated coordinate reference system, or an invalid CRS if no reference system is set.
A QgsRectangle with associated coordinate reference system.
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
Definition qgis.h:7600
Represents a spatial region paired with a custom maximum zoom level.
int maxZoom
Maximum zoom level applied within this extent.
QgsReferencedRectangle extent
Bounding box extent and associated CRS.