QGIS API Documentation 3.43.0-Master (e01d6d7c4c0)
qgsalgorithmwritevectortiles.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsalgorithmwritevectortiles.h
3 ---------------------
4 Date : April 2020
5 Copyright : (C) 2020 by Martin Dobias
6 Email : wonder dot sk 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#include "qgsvectorlayer.h"
20#include "qgsvectortilewriter.h"
21#include <QUrl>
22
24
25
26QString QgsWriteVectorTilesBaseAlgorithm::group() const
27{
28 return QObject::tr( "Vector tiles" );
29}
30
31QString QgsWriteVectorTilesBaseAlgorithm::groupId() const
32{
33 return QStringLiteral( "vectortiles" );
34}
35
36QString QgsWriteVectorTilesBaseAlgorithm::shortHelpString() const
37{
38 return QObject::tr( "This algorithm exports one or more vector layers to vector tiles - a data format optimized for fast map rendering and small data size." );
39}
40
41QString QgsWriteVectorTilesBaseAlgorithm::shortDescription() const
42{
43 return QObject::tr( "Exports one or more vector layers to vector tiles." );
44}
45
46void QgsWriteVectorTilesBaseAlgorithm::addBaseParameters()
47{
48 addParameter( new QgsProcessingParameterVectorTileWriterLayers( QStringLiteral( "LAYERS" ), QObject::tr( "Input layers" ) ) );
49
50 addParameter( new QgsProcessingParameterNumber( QStringLiteral( "MIN_ZOOM" ), QObject::tr( "Minimum zoom level" ), Qgis::ProcessingNumberParameterType::Integer, 0, false, 0, 24 ) );
51 addParameter( new QgsProcessingParameterNumber( QStringLiteral( "MAX_ZOOM" ), QObject::tr( "Maximum zoom level" ), Qgis::ProcessingNumberParameterType::Integer, 3, false, 0, 24 ) );
52
53 // optional extent
54 addParameter( new QgsProcessingParameterExtent( QStringLiteral( "EXTENT" ), QObject::tr( "Extent" ), QVariant(), true ) );
55}
56
57QVariantMap QgsWriteVectorTilesBaseAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
58{
59 const int minZoom = parameterAsInt( parameters, QStringLiteral( "MIN_ZOOM" ), context );
60 const int maxZoom = parameterAsInt( parameters, QStringLiteral( "MAX_ZOOM" ), context );
61
62 const QVariant layersVariant = parameters.value( parameterDefinition( QStringLiteral( "LAYERS" ) )->name() );
63 const QList<QgsVectorTileWriter::Layer> layers = QgsProcessingParameterVectorTileWriterLayers::parameterAsLayers( layersVariant, context );
64
65 for ( const QgsVectorTileWriter::Layer &layer : layers )
66 {
67 if ( !layer.layer() )
68 throw QgsProcessingException( QObject::tr( "Unknown input layer" ) );
69 }
70
72 QVariantMap outputs;
73 prepareWriter( writer, parameters, context, outputs );
74
75 writer.setMinZoom( minZoom );
76 writer.setMaxZoom( maxZoom );
77 writer.setLayers( layers );
78 writer.setTransformContext( context.transformContext() );
79
80 if ( parameters.contains( QStringLiteral( "EXTENT" ) ) )
81 {
82 const QgsRectangle extent = parameterAsExtent( parameters, QStringLiteral( "EXTENT" ), context, QgsCoordinateReferenceSystem( "EPSG:3857" ) );
83 writer.setExtent( extent );
84 }
85
86 const bool res = writer.writeTiles( feedback );
87
88 if ( !res )
89 throw QgsProcessingException( QObject::tr( "Failed to write vector tiles: " ) + writer.errorMessage() );
90
91 return outputs;
92}
93
94//
95// QgsWriteVectorTilesXyzAlgorithm
96//
97
98QString QgsWriteVectorTilesXyzAlgorithm::name() const
99{
100 return QStringLiteral( "writevectortiles_xyz" );
101}
102
103QString QgsWriteVectorTilesXyzAlgorithm::displayName() const
104{
105 return QObject::tr( "Write Vector Tiles (XYZ)" );
106}
107
108QStringList QgsWriteVectorTilesXyzAlgorithm::tags() const
109{
110 return QObject::tr( "xyz,vector,tiles" ).split( ',' );
111}
112
113QgsProcessingAlgorithm *QgsWriteVectorTilesXyzAlgorithm::createInstance() const
114{
115 return new QgsWriteVectorTilesXyzAlgorithm();
116}
117
118void QgsWriteVectorTilesXyzAlgorithm::initAlgorithm( const QVariantMap & )
119{
120 addParameter( new QgsProcessingParameterFolderDestination( QStringLiteral( "OUTPUT_DIRECTORY" ), QObject::tr( "Output directory" ) ) );
121 addParameter( new QgsProcessingParameterString( QStringLiteral( "XYZ_TEMPLATE" ), QObject::tr( "File template" ), QStringLiteral( "{z}/{x}/{y}.pbf" ) ) );
122
123 addBaseParameters();
124}
125
126void QgsWriteVectorTilesXyzAlgorithm::prepareWriter( QgsVectorTileWriter &writer, const QVariantMap &parameters, QgsProcessingContext &context, QVariantMap &outputs )
127{
128 const QString outputDir = parameterAsString( parameters, QStringLiteral( "OUTPUT_DIRECTORY" ), context );
129 const QString xyzTemplate = parameterAsString( parameters, QStringLiteral( "XYZ_TEMPLATE" ), context );
130 QgsDataSourceUri dsUri;
131 dsUri.setParam( QStringLiteral( "type" ), QStringLiteral( "xyz" ) );
132 dsUri.setParam( QStringLiteral( "url" ), QUrl::fromLocalFile( outputDir + "/" + xyzTemplate ).toString() );
133 const QString uri = dsUri.encodedUri();
134
135 writer.setDestinationUri( uri );
136
137 outputs.insert( QStringLiteral( "OUTPUT_DIRECTORY" ), outputDir );
138}
139
140//
141// QgsWriteVectorTilesMbtilesAlgorithm
142//
143
144QString QgsWriteVectorTilesMbtilesAlgorithm::name() const
145{
146 return QStringLiteral( "writevectortiles_mbtiles" );
147}
148
149QString QgsWriteVectorTilesMbtilesAlgorithm::displayName() const
150{
151 return QObject::tr( "Write Vector Tiles (MBTiles)" );
152}
153
154QStringList QgsWriteVectorTilesMbtilesAlgorithm::tags() const
155{
156 return QObject::tr( "mbtiles,vector" ).split( ',' );
157}
158
159QgsProcessingAlgorithm *QgsWriteVectorTilesMbtilesAlgorithm::createInstance() const
160{
161 return new QgsWriteVectorTilesMbtilesAlgorithm();
162}
163
164void QgsWriteVectorTilesMbtilesAlgorithm::initAlgorithm( const QVariantMap & )
165{
166 addParameter( new QgsProcessingParameterVectorTileDestination( QStringLiteral( "OUTPUT" ), QObject::tr( "Destination MBTiles" ) ) );
167
168 addBaseParameters();
169
170 // optional metadata for MBTiles
171 addParameter( new QgsProcessingParameterString( QStringLiteral( "META_NAME" ), QObject::tr( "Metadata: Name" ), QVariant(), false, true ) );
172 addParameter( new QgsProcessingParameterString( QStringLiteral( "META_DESCRIPTION" ), QObject::tr( "Metadata: Description" ), QVariant(), false, true ) );
173 addParameter( new QgsProcessingParameterString( QStringLiteral( "META_ATTRIBUTION" ), QObject::tr( "Metadata: Attribution" ), QVariant(), false, true ) );
174 addParameter( new QgsProcessingParameterString( QStringLiteral( "META_VERSION" ), QObject::tr( "Metadata: Version" ), QVariant(), false, true ) );
175 auto metaTypeParam = std::make_unique<QgsProcessingParameterString>( QStringLiteral( "META_TYPE" ), QObject::tr( "Metadata: Type" ), QVariant(), false, true );
176 metaTypeParam->setMetadata( { { QStringLiteral( "widget_wrapper" ), QVariantMap( { { QStringLiteral( "value_hints" ), QStringList() << QStringLiteral( "overlay" ) << QStringLiteral( "baselayer" ) } } ) }
177 } );
178 addParameter( metaTypeParam.release() );
179 addParameter( new QgsProcessingParameterString( QStringLiteral( "META_CENTER" ), QObject::tr( "Metadata: Center" ), QVariant(), false, true ) );
180}
181
182void QgsWriteVectorTilesMbtilesAlgorithm::prepareWriter( QgsVectorTileWriter &writer, const QVariantMap &parameters, QgsProcessingContext &context, QVariantMap &outputs )
183{
184 const QString outputFile = parameterAsFileOutput( parameters, QStringLiteral( "OUTPUT" ), context );
185 QgsDataSourceUri dsUri;
186 dsUri.setParam( QStringLiteral( "type" ), QStringLiteral( "mbtiles" ) );
187 dsUri.setParam( QStringLiteral( "url" ), outputFile );
188 const QString uri = dsUri.encodedUri();
189
190 writer.setDestinationUri( uri );
191
192 const QString metaName = parameterAsString( parameters, QStringLiteral( "META_NAME" ), context );
193 const QString metaDescription = parameterAsString( parameters, QStringLiteral( "META_DESCRIPTION" ), context );
194 const QString metaAttribution = parameterAsString( parameters, QStringLiteral( "META_ATTRIBUTION" ), context );
195 const QString metaVersion = parameterAsString( parameters, QStringLiteral( "META_VERSION" ), context );
196 const QString metaType = parameterAsString( parameters, QStringLiteral( "META_TYPE" ), context );
197 const QString metaCenter = parameterAsString( parameters, QStringLiteral( "META_CENTER" ), context );
198
199 QVariantMap meta;
200 if ( !metaName.isEmpty() )
201 meta["name"] = metaName;
202 if ( !metaDescription.isEmpty() )
203 meta["description"] = metaDescription;
204 if ( !metaAttribution.isEmpty() )
205 meta["attribution"] = metaAttribution;
206 if ( !metaVersion.isEmpty() )
207 meta["version"] = metaVersion;
208 if ( !metaType.isEmpty() )
209 meta["type"] = metaType;
210 if ( !metaCenter.isEmpty() )
211 meta["center"] = metaCenter;
212
213 writer.setMetadata( meta );
214
215 outputs.insert( QStringLiteral( "OUTPUT" ), outputFile );
216}
217
218
Represents a coordinate reference system (CRS).
Stores the component parts of a data source URI (e.g.
QByteArray encodedUri() const
Returns the complete encoded URI as a byte array.
void setParam(const QString &key, const QString &value)
Sets a generic parameter value on the URI.
Abstract base class for processing algorithms.
Contains information about the context in which a processing algorithm is executed.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
A rectangular map extent parameter for processing algorithms.
A folder destination parameter, for specifying the destination path for a folder created by the algor...
A numeric parameter for processing algorithms.
A string parameter for processing algorithms.
A vector tile layer destination parameter, for specifying the destination path for a vector tile laye...
A parameter for Processing algorithms that need a list of input vector layers for writing of vector t...
static QList< QgsVectorTileWriter::Layer > parameterAsLayers(const QVariant &layersVariant, QgsProcessingContext &context)
Converts a QVariant value (a QVariantList) to a list of input layers.
A rectangle specified with double values.
Configuration of a single input vector layer to be included in the output.
Takes care of writing vector tiles.
QString errorMessage() const
Returns error message related to the previous call to writeTiles().
void setMaxZoom(int maxZoom)
Sets the maximum zoom level of tiles. Allowed values are in interval [0,24].
void setDestinationUri(const QString &uri)
Sets where and how the vector tiles will be written.
void setTransformContext(const QgsCoordinateTransformContext &transformContext)
Sets coordinate transform context for transforms between layers and tile matrix CRS.
void setExtent(const QgsRectangle &extent)
Sets extent of vector tile output.
bool writeTiles(QgsFeedback *feedback=nullptr)
Writes vector tiles according to the configuration.
void setLayers(const QList< QgsVectorTileWriter::Layer > &layers)
Sets vector layers and their configuration for output of vector tiles.
void setMinZoom(int minZoom)
Sets the minimum zoom level of tiles. Allowed values are in interval [0,24].
void setMetadata(const QVariantMap &metadata)
Sets that will be written to the output dataset. See class description for more on metadata support.