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