QGIS API Documentation 3.99.0-Master (09f76ad7019)
Loading...
Searching...
No Matches
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
22#include <QString>
23#include <QUrl>
24
25using namespace Qt::StringLiterals;
26
28
29
30QString QgsWriteVectorTilesBaseAlgorithm::group() const
31{
32 return QObject::tr( "Vector tiles" );
33}
34
35QString QgsWriteVectorTilesBaseAlgorithm::groupId() const
36{
37 return u"vectortiles"_s;
38}
39
40QString QgsWriteVectorTilesBaseAlgorithm::shortHelpString() const
41{
42 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." );
43}
44
45QString QgsWriteVectorTilesBaseAlgorithm::shortDescription() const
46{
47 return QObject::tr( "Exports one or more vector layers to vector tiles." );
48}
49
50void QgsWriteVectorTilesBaseAlgorithm::addBaseParameters()
51{
52 addParameter( new QgsProcessingParameterVectorTileWriterLayers( u"LAYERS"_s, QObject::tr( "Input layers" ) ) );
53
54 addParameter( new QgsProcessingParameterNumber( u"MIN_ZOOM"_s, QObject::tr( "Minimum zoom level" ), Qgis::ProcessingNumberParameterType::Integer, 0, false, 0, 24 ) );
55 addParameter( new QgsProcessingParameterNumber( u"MAX_ZOOM"_s, QObject::tr( "Maximum zoom level" ), Qgis::ProcessingNumberParameterType::Integer, 3, false, 0, 24 ) );
56
57 // optional extent
58 addParameter( new QgsProcessingParameterExtent( u"EXTENT"_s, QObject::tr( "Extent" ), QVariant(), true ) );
59}
60
61QVariantMap QgsWriteVectorTilesBaseAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
62{
63 const int minZoom = parameterAsInt( parameters, u"MIN_ZOOM"_s, context );
64 const int maxZoom = parameterAsInt( parameters, u"MAX_ZOOM"_s, context );
65
66 const QVariant layersVariant = parameters.value( parameterDefinition( u"LAYERS"_s )->name() );
67 const QList<QgsVectorTileWriter::Layer> layers = QgsProcessingParameterVectorTileWriterLayers::parameterAsLayers( layersVariant, context );
68
69 for ( const QgsVectorTileWriter::Layer &layer : layers )
70 {
71 if ( !layer.layer() )
72 throw QgsProcessingException( QObject::tr( "Unknown input layer" ) );
73 }
74
76 QVariantMap outputs;
77 prepareWriter( writer, parameters, context, outputs );
78
79 writer.setMinZoom( minZoom );
80 writer.setMaxZoom( maxZoom );
81 writer.setLayers( layers );
82 writer.setTransformContext( context.transformContext() );
83
84 if ( parameters.contains( u"EXTENT"_s ) )
85 {
86 const QgsRectangle extent = parameterAsExtent( parameters, u"EXTENT"_s, context, QgsCoordinateReferenceSystem( "EPSG:3857" ) );
87 writer.setExtent( extent );
88 }
89
90 const bool res = writer.writeTiles( feedback );
91
92 if ( !res )
93 throw QgsProcessingException( QObject::tr( "Failed to write vector tiles: " ) + writer.errorMessage() );
94
95 return outputs;
96}
97
98//
99// QgsWriteVectorTilesXyzAlgorithm
100//
101
102QString QgsWriteVectorTilesXyzAlgorithm::name() const
103{
104 return u"writevectortiles_xyz"_s;
105}
106
107QString QgsWriteVectorTilesXyzAlgorithm::displayName() const
108{
109 return QObject::tr( "Write Vector Tiles (XYZ)" );
110}
111
112QStringList QgsWriteVectorTilesXyzAlgorithm::tags() const
113{
114 return QObject::tr( "xyz,vector,tiles" ).split( ',' );
115}
116
117QgsProcessingAlgorithm *QgsWriteVectorTilesXyzAlgorithm::createInstance() const
118{
119 return new QgsWriteVectorTilesXyzAlgorithm();
120}
121
122void QgsWriteVectorTilesXyzAlgorithm::initAlgorithm( const QVariantMap & )
123{
124 addParameter( new QgsProcessingParameterFolderDestination( u"OUTPUT_DIRECTORY"_s, QObject::tr( "Output directory" ) ) );
125 addParameter( new QgsProcessingParameterString( u"XYZ_TEMPLATE"_s, QObject::tr( "File template" ), u"{z}/{x}/{y}.pbf"_s ) );
126
127 addBaseParameters();
128}
129
130void QgsWriteVectorTilesXyzAlgorithm::prepareWriter( QgsVectorTileWriter &writer, const QVariantMap &parameters, QgsProcessingContext &context, QVariantMap &outputs )
131{
132 const QString outputDir = parameterAsString( parameters, u"OUTPUT_DIRECTORY"_s, context );
133 const QString xyzTemplate = parameterAsString( parameters, u"XYZ_TEMPLATE"_s, context );
134 QgsDataSourceUri dsUri;
135 dsUri.setParam( u"type"_s, u"xyz"_s );
136 dsUri.setParam( u"url"_s, QUrl::fromLocalFile( outputDir + "/" + xyzTemplate ).toString() );
137 const QString uri = dsUri.encodedUri();
138
139 writer.setDestinationUri( uri );
140
141 outputs.insert( u"OUTPUT_DIRECTORY"_s, outputDir );
142}
143
144//
145// QgsWriteVectorTilesMbtilesAlgorithm
146//
147
148QString QgsWriteVectorTilesMbtilesAlgorithm::name() const
149{
150 return u"writevectortiles_mbtiles"_s;
151}
152
153QString QgsWriteVectorTilesMbtilesAlgorithm::displayName() const
154{
155 return QObject::tr( "Write Vector Tiles (MBTiles)" );
156}
157
158QStringList QgsWriteVectorTilesMbtilesAlgorithm::tags() const
159{
160 return QObject::tr( "mbtiles,vector" ).split( ',' );
161}
162
163QgsProcessingAlgorithm *QgsWriteVectorTilesMbtilesAlgorithm::createInstance() const
164{
165 return new QgsWriteVectorTilesMbtilesAlgorithm();
166}
167
168void QgsWriteVectorTilesMbtilesAlgorithm::initAlgorithm( const QVariantMap & )
169{
170 addParameter( new QgsProcessingParameterVectorTileDestination( u"OUTPUT"_s, QObject::tr( "Destination MBTiles" ) ) );
171
172 addBaseParameters();
173
174 // optional metadata for MBTiles
175 addParameter( new QgsProcessingParameterString( u"META_NAME"_s, QObject::tr( "Metadata: Name" ), QVariant(), false, true ) );
176 addParameter( new QgsProcessingParameterString( u"META_DESCRIPTION"_s, QObject::tr( "Metadata: Description" ), QVariant(), false, true ) );
177 addParameter( new QgsProcessingParameterString( u"META_ATTRIBUTION"_s, QObject::tr( "Metadata: Attribution" ), QVariant(), false, true ) );
178 addParameter( new QgsProcessingParameterString( u"META_VERSION"_s, QObject::tr( "Metadata: Version" ), QVariant(), false, true ) );
179 auto metaTypeParam = std::make_unique<QgsProcessingParameterString>( u"META_TYPE"_s, QObject::tr( "Metadata: Type" ), QVariant(), false, true );
180 metaTypeParam->setMetadata( { { u"widget_wrapper"_s, QVariantMap( { { u"value_hints"_s, QStringList() << u"overlay"_s << u"baselayer"_s } } ) }
181 } );
182 addParameter( metaTypeParam.release() );
183 addParameter( new QgsProcessingParameterString( u"META_CENTER"_s, QObject::tr( "Metadata: Center" ), QVariant(), false, true ) );
184}
185
186void QgsWriteVectorTilesMbtilesAlgorithm::prepareWriter( QgsVectorTileWriter &writer, const QVariantMap &parameters, QgsProcessingContext &context, QVariantMap &outputs )
187{
188 const QString outputFile = parameterAsFileOutput( parameters, u"OUTPUT"_s, context );
189 QgsDataSourceUri dsUri;
190 dsUri.setParam( u"type"_s, u"mbtiles"_s );
191 dsUri.setParam( u"url"_s, outputFile );
192 const QString uri = dsUri.encodedUri();
193
194 writer.setDestinationUri( uri );
195
196 const QString metaName = parameterAsString( parameters, u"META_NAME"_s, context );
197 const QString metaDescription = parameterAsString( parameters, u"META_DESCRIPTION"_s, context );
198 const QString metaAttribution = parameterAsString( parameters, u"META_ATTRIBUTION"_s, context );
199 const QString metaVersion = parameterAsString( parameters, u"META_VERSION"_s, context );
200 const QString metaType = parameterAsString( parameters, u"META_TYPE"_s, context );
201 const QString metaCenter = parameterAsString( parameters, u"META_CENTER"_s, context );
202
203 QVariantMap meta;
204 if ( !metaName.isEmpty() )
205 meta["name"] = metaName;
206 if ( !metaDescription.isEmpty() )
207 meta["description"] = metaDescription;
208 if ( !metaAttribution.isEmpty() )
209 meta["attribution"] = metaAttribution;
210 if ( !metaVersion.isEmpty() )
211 meta["version"] = metaVersion;
212 if ( !metaType.isEmpty() )
213 meta["type"] = metaType;
214 if ( !metaCenter.isEmpty() )
215 meta["center"] = metaCenter;
216
217 writer.setMetadata( meta );
218
219 outputs.insert( u"OUTPUT"_s, outputFile );
220}
221
222
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.