Skip to content

Commit d3a54ee

Browse files
committedJun 10, 2020
Add flags to control geometry to WKB export behavior
With initial flag to force conversion of triangle types to polygons
1 parent 61e7a5f commit d3a54ee

26 files changed

+87
-32
lines changed
 

‎python/core/auto_generated/geometry/qgsabstractgeometry.sip.in

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,10 +189,19 @@ Sets the geometry from a WKT string.
189189
%End
190190

191191

192-
virtual QByteArray asWkb() const = 0;
192+
enum WkbFlag
193+
{
194+
FlagExportTrianglesAsPolygons,
195+
};
196+
typedef QFlags<QgsAbstractGeometry::WkbFlag> WkbFlags;
197+
198+
199+
virtual QByteArray asWkb( WkbFlags flags = 0 ) const = 0;
193200
%Docstring
194201
Returns a WKB representation of the geometry.
195202

203+
The optional ``flags`` argument specifies flags controlling WKB export behavior (since QGIS 3.14).
204+
196205
.. seealso:: :py:func:`asWkt`
197206

198207
.. seealso:: :py:func:`asGml2`
@@ -991,6 +1000,9 @@ Returns next part of the geometry (undefined behavior if hasNext() returns ``Fal
9911000

9921001
};
9931002

1003+
QFlags<QgsAbstractGeometry::WkbFlag> operator|(QgsAbstractGeometry::WkbFlag f1, QFlags<QgsAbstractGeometry::WkbFlag> f2);
1004+
1005+
9941006
/************************************************************************
9951007
* This file has been generated automatically from *
9961008
* *

‎python/core/auto_generated/geometry/qgscircularstring.sip.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ to ``p2`` will be used (i.e. winding the other way around the circle).
7171
virtual bool fromWkt( const QString &wkt );
7272

7373

74-
virtual QByteArray asWkb() const;
74+
virtual QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = 0 ) const;
7575

7676
virtual QString asWkt( int precision = 17 ) const;
7777

‎python/core/auto_generated/geometry/qgscompoundcurve.sip.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ Compound curve geometry type
4242
virtual bool fromWkt( const QString &wkt );
4343

4444

45-
virtual QByteArray asWkb() const;
45+
virtual QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = 0 ) const;
4646

4747
virtual QString asWkt( int precision = 17 ) const;
4848

‎python/core/auto_generated/geometry/qgscurvepolygon.sip.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ Curve polygon geometry type
4646
virtual bool fromWkt( const QString &wkt );
4747

4848

49-
virtual QByteArray asWkb() const;
49+
virtual QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = 0 ) const;
5050

5151
virtual QString asWkt( int precision = 17 ) const;
5252

‎python/core/auto_generated/geometry/qgsgeometry.sip.in

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1522,10 +1522,12 @@ is null, a ValueError will be raised.
15221522

15231523

15241524

1525-
QByteArray asWkb() const;
1525+
QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = 0 ) const;
15261526
%Docstring
15271527
Export the geometry to WKB
15281528

1529+
The optional ``flags`` argument specifies flags controlling WKB export behavior (since QGIS 3.14).
1530+
15291531
.. versionadded:: 3.0
15301532
%End
15311533

‎python/core/auto_generated/geometry/qgsgeometrycollection.sip.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ An IndexError will be raised if no geometry with the specified index exists.
154154

155155
virtual bool fromWkt( const QString &wkt );
156156

157-
virtual QByteArray asWkb() const;
157+
virtual QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = 0 ) const;
158158

159159
virtual QString asWkt( int precision = 17 ) const;
160160

‎python/core/auto_generated/geometry/qgslinestring.sip.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ segment in the line.
424424
virtual bool fromWkt( const QString &wkt );
425425

426426

427-
virtual QByteArray asWkb() const;
427+
virtual QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = 0 ) const;
428428

429429
virtual QString asWkt( int precision = 17 ) const;
430430

‎python/core/auto_generated/geometry/qgspoint.sip.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ M value is preserved.
367367

368368
virtual bool fromWkt( const QString &wkt );
369369

370-
virtual QByteArray asWkb() const;
370+
virtual QByteArray asWkb( QgsAbstractGeometry::WkbFlags = 0 ) const;
371371

372372
virtual QString asWkt( int precision = 17 ) const;
373373

‎python/core/auto_generated/geometry/qgspolygon.sip.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ Ownership of ``exterior`` and ``rings`` is transferred to the polygon.
4141

4242
virtual bool fromWkb( QgsConstWkbPtr &wkb );
4343

44-
virtual QByteArray asWkb() const;
44+
virtual QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = 0 ) const;
4545

4646
virtual QgsPolygon *surfaceToPolygon() const /Factory/;
4747

‎src/core/geometry/qgsabstractgeometry.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,15 +238,28 @@ class CORE_EXPORT QgsAbstractGeometry
238238

239239
//export
240240

241+
/**
242+
* WKB export flags.
243+
* \since QGIS 3.14
244+
*/
245+
enum WkbFlag
246+
{
247+
FlagExportTrianglesAsPolygons = 1 << 0, //!< Triangles should be exported as polygon geometries
248+
};
249+
Q_DECLARE_FLAGS( WkbFlags, WkbFlag )
250+
241251
/**
242252
* Returns a WKB representation of the geometry.
253+
*
254+
* The optional \a flags argument specifies flags controlling WKB export behavior (since QGIS 3.14).
255+
*
243256
* \see asWkt
244257
* \see asGml2
245258
* \see asGml3
246259
* \see asJson()
247260
* \since QGIS 3.0
248261
*/
249-
virtual QByteArray asWkb() const = 0;
262+
virtual QByteArray asWkb( WkbFlags flags = nullptr ) const = 0;
250263

251264
/**
252265
* Returns a WKT representation of the geometry.
@@ -1234,4 +1247,6 @@ class CORE_EXPORT QgsGeometryConstPartIterator
12341247

12351248
};
12361249

1250+
Q_DECLARE_OPERATORS_FOR_FLAGS( QgsAbstractGeometry::WkbFlags )
1251+
12371252
#endif //QGSABSTRACTGEOMETRYV2

‎src/core/geometry/qgscircularstring.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ bool QgsCircularString::fromWkt( const QString &wkt )
321321
return true;
322322
}
323323

324-
QByteArray QgsCircularString::asWkb() const
324+
QByteArray QgsCircularString::asWkb( WkbFlags ) const
325325
{
326326
int binarySize = sizeof( char ) + sizeof( quint32 ) + sizeof( quint32 );
327327
binarySize += numPoints() * ( 2 + is3D() + isMeasure() ) * sizeof( double );

‎src/core/geometry/qgscircularstring.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class CORE_EXPORT QgsCircularString: public QgsCurve
7575
bool fromWkb( QgsConstWkbPtr &wkb ) override;
7676
bool fromWkt( const QString &wkt ) override;
7777

78-
QByteArray asWkb() const override;
78+
QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = nullptr ) const override;
7979
QString asWkt( int precision = 17 ) const override;
8080
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
8181
QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;

‎src/core/geometry/qgscompoundcurve.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,14 +224,14 @@ bool QgsCompoundCurve::fromWkt( const QString &wkt )
224224
return true;
225225
}
226226

227-
QByteArray QgsCompoundCurve::asWkb() const
227+
QByteArray QgsCompoundCurve::asWkb( WkbFlags flags ) const
228228
{
229229
int binarySize = sizeof( char ) + sizeof( quint32 ) + sizeof( quint32 );
230230
QVector<QByteArray> wkbForCurves;
231231
wkbForCurves.reserve( mCurves.size() );
232232
for ( const QgsCurve *curve : mCurves )
233233
{
234-
QByteArray wkbForCurve = curve->asWkb();
234+
QByteArray wkbForCurve = curve->asWkb( flags );
235235
binarySize += wkbForCurve.length();
236236
wkbForCurves << wkbForCurve;
237237
}

‎src/core/geometry/qgscompoundcurve.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class CORE_EXPORT QgsCompoundCurve: public QgsCurve
4646
bool fromWkb( QgsConstWkbPtr &wkb ) override;
4747
bool fromWkt( const QString &wkt ) override;
4848

49-
QByteArray asWkb() const override;
49+
QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = nullptr ) const override;
5050
QString asWkt( int precision = 17 ) const override;
5151
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
5252
QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;

‎src/core/geometry/qgscurvepolygon.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -285,20 +285,20 @@ QgsRectangle QgsCurvePolygon::calculateBoundingBox() const
285285
return QgsRectangle();
286286
}
287287

288-
QByteArray QgsCurvePolygon::asWkb() const
288+
QByteArray QgsCurvePolygon::asWkb( WkbFlags flags ) const
289289
{
290290
int binarySize = sizeof( char ) + sizeof( quint32 ) + sizeof( quint32 );
291291
QVector<QByteArray> wkbForRings;
292292
wkbForRings.reserve( 1 + mInteriorRings.size() );
293293
if ( mExteriorRing )
294294
{
295-
QByteArray wkb( mExteriorRing->asWkb() );
295+
QByteArray wkb( mExteriorRing->asWkb( flags ) );
296296
binarySize += wkb.length();
297297
wkbForRings << wkb;
298298
}
299299
for ( const QgsCurve *curve : mInteriorRings )
300300
{
301-
QByteArray wkb( curve->asWkb() );
301+
QByteArray wkb( curve->asWkb( flags ) );
302302
binarySize += wkb.length();
303303
wkbForRings << wkb;
304304
}

‎src/core/geometry/qgscurvepolygon.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class CORE_EXPORT QgsCurvePolygon: public QgsSurface
5151
bool fromWkb( QgsConstWkbPtr &wkb ) override;
5252
bool fromWkt( const QString &wkt ) override;
5353

54-
QByteArray asWkb() const override;
54+
QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = nullptr ) const override;
5555
QString asWkt( int precision = 17 ) const override;
5656
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
5757
QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;

‎src/core/geometry/qgsgeometry.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2507,9 +2507,9 @@ QVector<QgsPointXY> QgsGeometry::randomPointsInPolygon( int count, unsigned long
25072507
}
25082508
///@endcond
25092509

2510-
QByteArray QgsGeometry::asWkb() const
2510+
QByteArray QgsGeometry::asWkb( QgsAbstractGeometry::WkbFlags flags ) const
25112511
{
2512-
return d->geometry ? d->geometry->asWkb() : QByteArray();
2512+
return d->geometry ? d->geometry->asWkb( flags ) : QByteArray();
25132513
}
25142514

25152515
QVector<QgsGeometry> QgsGeometry::asGeometryCollection() const

‎src/core/geometry/qgsgeometry.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1544,9 +1544,12 @@ class CORE_EXPORT QgsGeometry
15441544

15451545
/**
15461546
* Export the geometry to WKB
1547+
*
1548+
* The optional \a flags argument specifies flags controlling WKB export behavior (since QGIS 3.14).
1549+
*
15471550
* \since QGIS 3.0
15481551
*/
1549-
QByteArray asWkb() const;
1552+
QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = nullptr ) const;
15501553

15511554
/**
15521555
* Exports the geometry to WKT

‎src/core/geometry/qgsgeometrycollection.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -357,15 +357,15 @@ bool QgsGeometryCollection::fromWkt( const QString &wkt )
357357
<< new QgsMultiCurve << new QgsMultiSurface, QStringLiteral( "GeometryCollection" ) );
358358
}
359359

360-
QByteArray QgsGeometryCollection::asWkb() const
360+
QByteArray QgsGeometryCollection::asWkb( WkbFlags flags ) const
361361
{
362362
int binarySize = sizeof( char ) + sizeof( quint32 ) + sizeof( quint32 );
363363
QVector<QByteArray> wkbForGeometries;
364364
for ( const QgsAbstractGeometry *geom : mGeometries )
365365
{
366366
if ( geom )
367367
{
368-
QByteArray wkb( geom->asWkb() );
368+
QByteArray wkb( geom->asWkb( flags ) );
369369
binarySize += wkb.length();
370370
wkbForGeometries << wkb;
371371
}

‎src/core/geometry/qgsgeometrycollection.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ class CORE_EXPORT QgsGeometryCollection: public QgsAbstractGeometry
179179

180180
bool fromWkb( QgsConstWkbPtr &wkb ) override;
181181
bool fromWkt( const QString &wkt ) override;
182-
QByteArray asWkb() const override;
182+
QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = nullptr ) const override;
183183
QString asWkt( int precision = 17 ) const override;
184184
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
185185
QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;

‎src/core/geometry/qgslinestring.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ bool QgsLineString::fromWkt( const QString &wkt )
441441
return true;
442442
}
443443

444-
QByteArray QgsLineString::asWkb() const
444+
QByteArray QgsLineString::asWkb( WkbFlags ) const
445445
{
446446
int binarySize = sizeof( char ) + sizeof( quint32 ) + sizeof( quint32 );
447447
binarySize += numPoints() * ( 2 + is3D() + isMeasure() ) * sizeof( double );

‎src/core/geometry/qgslinestring.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,7 @@ class CORE_EXPORT QgsLineString: public QgsCurve
588588
bool fromWkb( QgsConstWkbPtr &wkb ) override;
589589
bool fromWkt( const QString &wkt ) override;
590590

591-
QByteArray asWkb() const override;
591+
QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = nullptr ) const override;
592592
QString asWkt( int precision = 17 ) const override;
593593
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
594594
QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;

‎src/core/geometry/qgspoint.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ bool QgsPoint::fromWkt( const QString &wkt )
209209
* See details in QEP #17
210210
****************************************************************************/
211211

212-
QByteArray QgsPoint::asWkb() const
212+
QByteArray QgsPoint::asWkb( WkbFlags ) const
213213
{
214214
int binarySize = sizeof( char ) + sizeof( quint32 );
215215
binarySize += ( 2 + is3D() + isMeasure() ) * sizeof( double );

‎src/core/geometry/qgspoint.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ class CORE_EXPORT QgsPoint: public QgsAbstractGeometry
489489
void clear() override;
490490
bool fromWkb( QgsConstWkbPtr &wkb ) override;
491491
bool fromWkt( const QString &wkt ) override;
492-
QByteArray asWkb() const override;
492+
QByteArray asWkb( QgsAbstractGeometry::WkbFlags = nullptr ) const override;
493493
QString asWkt( int precision = 17 ) const override;
494494
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
495495
QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;

‎src/core/geometry/qgspolygon.cpp

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ bool QgsPolygon::fromWkb( QgsConstWkbPtr &wkbPtr )
121121
return true;
122122
}
123123

124-
QByteArray QgsPolygon::asWkb() const
124+
QByteArray QgsPolygon::asWkb( QgsAbstractGeometry::WkbFlags flags ) const
125125
{
126126
int binarySize = sizeof( char ) + sizeof( quint32 ) + sizeof( quint32 );
127127

@@ -139,7 +139,30 @@ QByteArray QgsPolygon::asWkb() const
139139
wkbArray.resize( binarySize );
140140
QgsWkbPtr wkb( wkbArray );
141141
wkb << static_cast<char>( QgsApplication::endian() );
142-
wkb << static_cast<quint32>( wkbType() );
142+
143+
QgsWkbTypes::Type type = wkbType();
144+
if ( flags & FlagExportTrianglesAsPolygons )
145+
{
146+
switch ( type )
147+
{
148+
case QgsWkbTypes::Triangle:
149+
type = QgsWkbTypes::Polygon;
150+
break;
151+
case QgsWkbTypes::TriangleZ:
152+
type = QgsWkbTypes::PolygonZ;
153+
break;
154+
case QgsWkbTypes::TriangleM:
155+
type = QgsWkbTypes::PolygonM;
156+
break;
157+
case QgsWkbTypes::TriangleZM:
158+
type = QgsWkbTypes::PolygonZM;
159+
break;
160+
default:
161+
break;
162+
}
163+
}
164+
wkb << static_cast<quint32>( type );
165+
143166
wkb << static_cast<quint32>( ( nullptr != mExteriorRing ) + mInteriorRings.size() );
144167
if ( mExteriorRing )
145168
{

‎src/core/geometry/qgspolygon.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class CORE_EXPORT QgsPolygon: public QgsCurvePolygon
4848
QgsPolygon *clone() const override SIP_FACTORY;
4949
void clear() override;
5050
bool fromWkb( QgsConstWkbPtr &wkb ) override;
51-
QByteArray asWkb() const override;
51+
QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = nullptr ) const override;
5252
QgsPolygon *surfaceToPolygon() const override SIP_FACTORY;
5353

5454
/**

0 commit comments

Comments
 (0)
Please sign in to comment.