QGIS API Documentation 4.3.0-Master (0d5b841b09e)
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 QGS_MARK_ALGORITHM_SOURCE
133
134 const QString outputDir = parameterAsString( parameters, u"OUTPUT_DIRECTORY"_s, context );
135 const QString xyzTemplate = parameterAsString( parameters, u"XYZ_TEMPLATE"_s, context );
136 QgsDataSourceUri dsUri;
137 dsUri.setParam( u"type"_s, u"xyz"_s );
138 dsUri.setParam( u"url"_s, QUrl::fromLocalFile( outputDir + "/" + xyzTemplate ).toString() );
139 const QString uri = dsUri.encodedUri();
140
141 writer.setDestinationUri( uri );
142
143 outputs.insert( u"OUTPUT_DIRECTORY"_s, outputDir );
144}
145
146//
147// QgsWriteVectorTilesMbtilesAlgorithm
148//
149
150QString QgsWriteVectorTilesMbtilesAlgorithm::name() const
151{
152 return u"writevectortiles_mbtiles"_s;
153}
154
155QString QgsWriteVectorTilesMbtilesAlgorithm::displayName() const
156{
157 return QObject::tr( "Write Vector Tiles (MBTiles)" );
158}
159
160QStringList QgsWriteVectorTilesMbtilesAlgorithm::tags() const
161{
162 return QObject::tr( "mbtiles,vector" ).split( ',' );
163}
164
165QgsProcessingAlgorithm *QgsWriteVectorTilesMbtilesAlgorithm::createInstance() const
166{
167 return new QgsWriteVectorTilesMbtilesAlgorithm();
168}
169
170void QgsWriteVectorTilesMbtilesAlgorithm::initAlgorithm( const QVariantMap & )
171{
172 addParameter( new QgsProcessingParameterVectorTileDestination( u"OUTPUT"_s, QObject::tr( "Destination MBTiles" ) ) );
173
174 addBaseParameters();
175
176 // optional metadata for MBTiles
177 addParameter( new QgsProcessingParameterString( u"META_NAME"_s, QObject::tr( "Metadata: Name" ), QVariant(), false, true ) );
178 addParameter( new QgsProcessingParameterString( u"META_DESCRIPTION"_s, QObject::tr( "Metadata: Description" ), QVariant(), false, true ) );
179 addParameter( new QgsProcessingParameterString( u"META_ATTRIBUTION"_s, QObject::tr( "Metadata: Attribution" ), QVariant(), false, true ) );
180 addParameter( new QgsProcessingParameterString( u"META_VERSION"_s, QObject::tr( "Metadata: Version" ), QVariant(), false, true ) );
181 auto metaTypeParam = std::make_unique<QgsProcessingParameterString>( u"META_TYPE"_s, QObject::tr( "Metadata: Type" ), QVariant(), false, true );
182 metaTypeParam->setMetadata( { { u"widget_wrapper"_s, QVariantMap( { { u"value_hints"_s, QStringList() << u"overlay"_s << u"baselayer"_s } } ) } } );
183 addParameter( metaTypeParam.release() );
184 addParameter( new QgsProcessingParameterString( u"META_CENTER"_s, QObject::tr( "Metadata: Center" ), QVariant(), false, true ) );
185}
186
187void QgsWriteVectorTilesMbtilesAlgorithm::prepareWriter( QgsVectorTileWriter &writer, const QVariantMap &parameters, QgsProcessingContext &context, QVariantMap &outputs )
188{
189 QGS_MARK_ALGORITHM_SOURCE
190
191 const QString outputFile = parameterAsFileOutput( parameters, u"OUTPUT"_s, context );
192 QgsDataSourceUri dsUri;
193 dsUri.setParam( u"type"_s, u"mbtiles"_s );
194 dsUri.setParam( u"url"_s, outputFile );
195 const QString uri = dsUri.encodedUri();
196
197 writer.setDestinationUri( uri );
198
199 const QString metaName = parameterAsString( parameters, u"META_NAME"_s, context );
200 const QString metaDescription = parameterAsString( parameters, u"META_DESCRIPTION"_s, context );
201 const QString metaAttribution = parameterAsString( parameters, u"META_ATTRIBUTION"_s, context );
202 const QString metaVersion = parameterAsString( parameters, u"META_VERSION"_s, context );
203 const QString metaType = parameterAsString( parameters, u"META_TYPE"_s, context );
204 const QString metaCenter = parameterAsString( parameters, u"META_CENTER"_s, context );
205
206 QVariantMap meta;
207 if ( !metaName.isEmpty() )
208 meta["name"] = metaName;
209 if ( !metaDescription.isEmpty() )
210 meta["description"] = metaDescription;
211 if ( !metaAttribution.isEmpty() )
212 meta["attribution"] = metaAttribution;
213 if ( !metaVersion.isEmpty() )
214 meta["version"] = metaVersion;
215 if ( !metaType.isEmpty() )
216 meta["type"] = metaType;
217 if ( !metaCenter.isEmpty() )
218 meta["center"] = metaCenter;
219
220 writer.setMetadata( meta );
221
222 outputs.insert( u"OUTPUT"_s, outputFile );
223}
224
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.