QGIS API Documentation 4.1.0-Master (5bf3c20f3c9)
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 addParameter( metaTypeParam.release() );
182 addParameter( new QgsProcessingParameterString( u"META_CENTER"_s, QObject::tr( "Metadata: Center" ), QVariant(), false, true ) );
183}
184
185void QgsWriteVectorTilesMbtilesAlgorithm::prepareWriter( QgsVectorTileWriter &writer, const QVariantMap &parameters, QgsProcessingContext &context, QVariantMap &outputs )
186{
187 const QString outputFile = parameterAsFileOutput( parameters, u"OUTPUT"_s, context );
188 QgsDataSourceUri dsUri;
189 dsUri.setParam( u"type"_s, u"mbtiles"_s );
190 dsUri.setParam( u"url"_s, outputFile );
191 const QString uri = dsUri.encodedUri();
192
193 writer.setDestinationUri( uri );
194
195 const QString metaName = parameterAsString( parameters, u"META_NAME"_s, context );
196 const QString metaDescription = parameterAsString( parameters, u"META_DESCRIPTION"_s, context );
197 const QString metaAttribution = parameterAsString( parameters, u"META_ATTRIBUTION"_s, context );
198 const QString metaVersion = parameterAsString( parameters, u"META_VERSION"_s, context );
199 const QString metaType = parameterAsString( parameters, u"META_TYPE"_s, context );
200 const QString metaCenter = parameterAsString( parameters, u"META_CENTER"_s, context );
201
202 QVariantMap meta;
203 if ( !metaName.isEmpty() )
204 meta["name"] = metaName;
205 if ( !metaDescription.isEmpty() )
206 meta["description"] = metaDescription;
207 if ( !metaAttribution.isEmpty() )
208 meta["attribution"] = metaAttribution;
209 if ( !metaVersion.isEmpty() )
210 meta["version"] = metaVersion;
211 if ( !metaType.isEmpty() )
212 meta["type"] = metaType;
213 if ( !metaCenter.isEmpty() )
214 meta["center"] = metaCenter;
215
216 writer.setMetadata( meta );
217
218 outputs.insert( u"OUTPUT"_s, outputFile );
219}
220
221
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.