/
qgsjsonutils.h
304 lines (257 loc) · 11.2 KB
/
qgsjsonutils.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
/***************************************************************************
qgsjsonutils.h
-------------
Date : May 206
Copyright : (C) 2016 Nyall Dawson
Email : nyall dot dawson at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSJSONUTILS_H
#define QGSJSONUTILS_H
#include "qgis_core.h"
#include "qgsfeature.h"
#include "qgscoordinatereferencesystem.h"
#include "qgscoordinatetransform.h"
#include "qgsfields.h"
#include <QPointer>
class QTextCodec;
/**
* \ingroup core
* \class QgsJsonExporter
* \brief Handles exporting QgsFeature features to GeoJSON features.
*
* Note that geometries will be automatically reprojected to WGS84 to match GeoJSON spec
* if either the source vector layer or source CRS is set.
* \since QGIS 2.16
*/
class CORE_EXPORT QgsJsonExporter
{
public:
/**
* Constructor for QgsJsonExporter.
* \param vectorLayer associated vector layer (required for related attribute export)
* \param precision maximum number of decimal places to use for geometry coordinates,
* the RFC 7946 GeoJSON specification recommends limiting coordinate precision to 6
*/
QgsJsonExporter( QgsVectorLayer *vectorLayer = nullptr, int precision = 6 );
/**
* Sets the maximum number of decimal places to use in geometry coordinates.
* The RFC 7946 GeoJSON specification recommends limiting coordinate precision to 6
* \param precision number of decimal places
* \see precision()
*/
void setPrecision( int precision ) { mPrecision = precision; }
/**
* Returns the maximum number of decimal places to use in geometry coordinates.
* \see setPrecision()
*/
int precision() const { return mPrecision; }
/**
* Sets whether to include geometry in the JSON exports.
* \param includeGeometry set to false to prevent geometry inclusion
* \see includeGeometry()
*/
void setIncludeGeometry( bool includeGeometry ) { mIncludeGeometry = includeGeometry; }
/**
* Returns whether geometry will be included in the JSON exports.
* \see setIncludeGeometry()
*/
bool includeGeometry() const { return mIncludeGeometry; }
/**
* Sets whether to include layer's name in the JSON exports.
* \param includeName set to false to prevent name inclusion
* \see includeName()
* \since QGIS 3.6
*/
void setIncludeName( bool includeName ) { mIncludeName = includeName; }
/**
* Returns whether layer's name will be included in the JSON exports.
* \see setIncludeName()
* \since QGIS 3.6
*/
bool includeName() const { return mIncludeName; }
/**
* Sets whether to include attributes in the JSON exports.
* \param includeAttributes set to false to prevent attribute inclusion
* \see includeAttributes()
*/
void setIncludeAttributes( bool includeAttributes ) { mIncludeAttributes = includeAttributes; }
/**
* Returns whether attributes will be included in the JSON exports.
* \see setIncludeAttributes()
*/
bool includeAttributes() const { return mIncludeAttributes; }
/**
* Sets whether to include attributes of features linked via references in the JSON exports.
* \param includeRelated set to true to include attributes for any related child features
* within the exported properties element.
* \note associated vector layer must be set with setVectorLayer()
* \see includeRelated()
*/
void setIncludeRelated( bool includeRelated ) { mIncludeRelatedAttributes = includeRelated; }
/**
* Returns whether attributes of related (child) features will be included in the JSON exports.
* \see setIncludeRelated()
*/
bool includeRelated() const { return mIncludeRelatedAttributes; }
/**
* Sets the associated vector layer (required for related attribute export). This will automatically
* update the sourceCrs() to match.
* \param vectorLayer vector layer
* \see vectorLayer()
*/
void setVectorLayer( QgsVectorLayer *vectorLayer );
/**
* Returns the associated vector layer, if set.
* \see setVectorLayer()
*/
QgsVectorLayer *vectorLayer() const;
/**
* Sets the source CRS for feature geometries. The source CRS must be set if geometries are to be
* correctly automatically reprojected to WGS 84, to match GeoJSON specifications.
* \param crs source CRS for input feature geometries
* \note the source CRS will be overwritten when a vector layer is specified via setVectorLayer()
* \see sourceCrs()
*/
void setSourceCrs( const QgsCoordinateReferenceSystem &crs );
/**
* Returns the source CRS for feature geometries. The source CRS must be set if geometries are to be
* correctly automatically reprojected to WGS 84, to match GeoJSON specifications.
* \see setSourceCrs()
*/
QgsCoordinateReferenceSystem sourceCrs() const;
/**
* Sets the list of attributes to include in the JSON exports.
* \param attributes list of attribute indexes, or an empty list to include all
* attributes
* \see attributes()
* \see setExcludedAttributes()
* \note Attributes excluded via setExcludedAttributes() take precedence over
* attributes specified by this method.
*/
void setAttributes( const QgsAttributeList &attributes ) { mAttributeIndexes = attributes; }
/**
* Returns the list of attributes which will be included in the JSON exports, or
* an empty list if all attributes will be included.
* \see setAttributes()
* \see excludedAttributes()
* \note Attributes excluded via excludedAttributes() take precedence over
* attributes returned by this method.
*/
QgsAttributeList attributes() const { return mAttributeIndexes; }
/**
* Sets a list of attributes to specifically exclude from the JSON exports. Excluded attributes
* take precedence over attributes included via setAttributes().
* \param attributes list of attribute indexes to exclude
* \see excludedAttributes()
* \see setAttributes()
*/
void setExcludedAttributes( const QgsAttributeList &attributes ) { mExcludedAttributeIndexes = attributes; }
/**
* Returns a list of attributes which will be specifically excluded from the JSON exports. Excluded attributes
* take precedence over attributes included via attributes().
* \see setExcludedAttributes()
* \see attributes()
*/
QgsAttributeList excludedAttributes() const { return mExcludedAttributeIndexes; }
/**
* Returns a GeoJSON string representation of a feature.
* \param feature feature to convert
* \param extraProperties map of extra attributes to include in feature's properties
* \param id optional ID to use as GeoJSON feature's ID instead of input feature's ID. If omitted, feature's
* ID is used.
* \returns GeoJSON string
* \see exportFeatures()
*/
QString exportFeature( const QgsFeature &feature,
const QVariantMap &extraProperties = QVariantMap(),
const QVariant &id = QVariant() ) const;
/**
* Returns a GeoJSON string representation of a list of features (feature collection).
* \param features features to convert
* \returns GeoJSON string
* \see exportFeature()
*/
QString exportFeatures( const QgsFeatureList &features ) const;
private:
//! Maximum number of decimal places for geometry coordinates
int mPrecision;
/**
* List of attribute indexes to include in export, or empty list to include all attributes
* \see mExcludedAttributeIndexes
*/
QgsAttributeList mAttributeIndexes;
//! List of attribute indexes to exclude from export
QgsAttributeList mExcludedAttributeIndexes;
//! Whether to include geometry in JSON export
bool mIncludeGeometry = true;
//! Whether to include attributes in JSON export
bool mIncludeAttributes = true;
//! Whether to include attributes from related features in JSON export
bool mIncludeRelatedAttributes = false;
//! Associated vector layer. Required for related attribute export.
QPointer< QgsVectorLayer > mLayer;
QgsCoordinateReferenceSystem mCrs;
QgsCoordinateTransform mTransform;
bool mIncludeName = false;
};
/**
* \ingroup core
* \class QgsJsonUtils
* \brief Helper utilities for working with JSON and GeoJSON conversions.
* \since QGIS 2.16
*/
class CORE_EXPORT QgsJsonUtils
{
public:
/**
* Attempts to parse a GeoJSON string to a collection of features.
* \param string GeoJSON string to parse
* \param fields fields collection to use for parsed features
* \param encoding text encoding
* \returns list of parsed features, or an empty list if no features could be parsed
* \see stringToFields()
* \note this function is a wrapper around QgsOgrUtils::stringToFeatureList()
*/
static QgsFeatureList stringToFeatureList( const QString &string, const QgsFields &fields, QTextCodec *encoding );
/**
* Attempts to retrieve the fields from a GeoJSON string representing a collection of features.
* \param string GeoJSON string to parse
* \param encoding text encoding
* \returns retrieved fields collection, or an empty list if no fields could be determined from the string
* \see stringToFeatureList()
* \note this function is a wrapper around QgsOgrUtils::stringToFields()
*/
static QgsFields stringToFields( const QString &string, QTextCodec *encoding );
/**
* Encodes a value to a JSON string representation, adding appropriate quotations and escaping
* where required.
* \param value value to encode
* \returns encoded value
*/
static QString encodeValue( const QVariant &value );
/**
* Exports all attributes from a QgsFeature as a JSON map type.
* \param feature feature to export
* \param layer optional associated vector layer. If specified, this allows
* richer export utilising settings like the layer's fields widget configuration.
* \param attributeWidgetCaches optional widget configuration cache. Can be used
* to speed up exporting the attributes for multiple features from the same layer.
*/
static QString exportAttributes( const QgsFeature &feature, QgsVectorLayer *layer = nullptr,
const QVector<QVariant> &attributeWidgetCaches = QVector<QVariant>() );
/**
* Parse a simple array (depth=1).
* \param json the JSON to parse
* \param type the type of the elements
* \since QGIS 3.0
*/
static QVariantList parseArray( const QString &json, QVariant::Type type );
};
#endif // QGSJSONUTILS_H