Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add QgsGeometry::wkbSize()
  • Loading branch information
rouault authored and nyalldawson committed Oct 18, 2020
1 parent 1b6191d commit 7ac4b51
Show file tree
Hide file tree
Showing 27 changed files with 148 additions and 39 deletions.
Expand Up @@ -196,6 +196,15 @@ Sets the geometry from a WKT string.
typedef QFlags<QgsAbstractGeometry::WkbFlag> WkbFlags;


virtual int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const = 0;
%Docstring
Returns the length of the QByteArray returned by :py:func:`~QgsAbstractGeometry.asWkb`

The optional ``flags`` argument specifies flags controlling WKB export behavior

.. versionadded:: 3.16
%End

virtual QByteArray asWkb( WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const = 0;
%Docstring
Returns a WKB representation of the geometry.
Expand Down
2 changes: 2 additions & 0 deletions python/core/auto_generated/geometry/qgscircularstring.sip.in
Expand Up @@ -71,6 +71,8 @@ to ``p2`` will be used (i.e. winding the other way around the circle).
virtual bool fromWkt( const QString &wkt );


virtual int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;

virtual QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;

virtual QString asWkt( int precision = 17 ) const;
Expand Down
2 changes: 2 additions & 0 deletions python/core/auto_generated/geometry/qgscompoundcurve.sip.in
Expand Up @@ -42,6 +42,8 @@ Compound curve geometry type
virtual bool fromWkt( const QString &wkt );


virtual int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;

virtual QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;

virtual QString asWkt( int precision = 17 ) const;
Expand Down
2 changes: 2 additions & 0 deletions python/core/auto_generated/geometry/qgscurvepolygon.sip.in
Expand Up @@ -46,6 +46,8 @@ Curve polygon geometry type
virtual bool fromWkt( const QString &wkt );


virtual int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;

virtual QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;

virtual QString asWkt( int precision = 17 ) const;
Expand Down
9 changes: 9 additions & 0 deletions python/core/auto_generated/geometry/qgsgeometry.sip.in
Expand Up @@ -1552,6 +1552,15 @@ is null, a ValueError will be raised.



int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;
%Docstring
Returns the length of the QByteArray returned by :py:func:`~QgsGeometry.asWkb`

The optional ``flags`` argument specifies flags controlling WKB export behavior

.. versionadded:: 3.16
%End

QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;
%Docstring
Export the geometry to WKB
Expand Down
Expand Up @@ -162,6 +162,9 @@ An IndexError will be raised if no geometry with the specified index exists.

virtual bool fromWkt( const QString &wkt );


virtual int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;

virtual QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;

virtual QString asWkt( int precision = 17 ) const;
Expand Down
2 changes: 2 additions & 0 deletions python/core/auto_generated/geometry/qgslinestring.sip.in
Expand Up @@ -438,6 +438,8 @@ If ``useZValues`` is ``True`` then z values will also be considered when testing
virtual bool fromWkt( const QString &wkt );


virtual int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;

virtual QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;

virtual QString asWkt( int precision = 17 ) const;
Expand Down
2 changes: 2 additions & 0 deletions python/core/auto_generated/geometry/qgspoint.sip.in
Expand Up @@ -369,6 +369,8 @@ Example

virtual bool fromWkt( const QString &wkt );

virtual int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;

virtual QByteArray asWkb( QgsAbstractGeometry::WkbFlags = QgsAbstractGeometry::WkbFlags() ) const;

virtual QString asWkt( int precision = 17 ) const;
Expand Down
2 changes: 2 additions & 0 deletions python/core/auto_generated/geometry/qgspolygon.sip.in
Expand Up @@ -46,6 +46,8 @@ Ownership of ``exterior`` and ``rings`` is transferred to the polygon.

virtual bool fromWkb( QgsConstWkbPtr &wkb );

virtual int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;

virtual QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;

virtual QgsPolygon *surfaceToPolygon() const /Factory/;
Expand Down
9 changes: 9 additions & 0 deletions src/core/geometry/qgsabstractgeometry.h
Expand Up @@ -252,6 +252,15 @@ class CORE_EXPORT QgsAbstractGeometry
};
Q_DECLARE_FLAGS( WkbFlags, WkbFlag )

/**
* Returns the length of the QByteArray returned by asWkb()
*
* The optional \a flags argument specifies flags controlling WKB export behavior
*
* \since QGIS 3.16
*/
virtual int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const = 0;

/**
* Returns a WKB representation of the geometry.
*
Expand Down
8 changes: 6 additions & 2 deletions src/core/geometry/qgscircularstring.cpp
Expand Up @@ -329,13 +329,17 @@ bool QgsCircularString::fromWkt( const QString &wkt )
return true;
}

QByteArray QgsCircularString::asWkb( WkbFlags ) const
int QgsCircularString::wkbSize( QgsAbstractGeometry::WkbFlags ) const
{
int binarySize = sizeof( char ) + sizeof( quint32 ) + sizeof( quint32 );
binarySize += numPoints() * ( 2 + is3D() + isMeasure() ) * sizeof( double );
return binarySize;
}

QByteArray QgsCircularString::asWkb( WkbFlags flags ) const
{
QByteArray wkbArray;
wkbArray.resize( binarySize );
wkbArray.resize( QgsCircularString::wkbSize( flags ) );
QgsWkbPtr wkb( wkbArray );
wkb << static_cast<char>( QgsApplication::endian() );
wkb << static_cast<quint32>( wkbType() );
Expand Down
1 change: 1 addition & 0 deletions src/core/geometry/qgscircularstring.h
Expand Up @@ -75,6 +75,7 @@ class CORE_EXPORT QgsCircularString: public QgsCurve
bool fromWkb( QgsConstWkbPtr &wkb ) override;
bool fromWkt( const QString &wkt ) override;

int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override;
QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override;
QString asWkt( int precision = 17 ) const override;
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
Expand Down
18 changes: 9 additions & 9 deletions src/core/geometry/qgscompoundcurve.cpp
Expand Up @@ -227,27 +227,27 @@ bool QgsCompoundCurve::fromWkt( const QString &wkt )
return true;
}

QByteArray QgsCompoundCurve::asWkb( WkbFlags flags ) const
int QgsCompoundCurve::wkbSize( QgsAbstractGeometry::WkbFlags flags ) const
{
int binarySize = sizeof( char ) + sizeof( quint32 ) + sizeof( quint32 );
QVector<QByteArray> wkbForCurves;
wkbForCurves.reserve( mCurves.size() );
for ( const QgsCurve *curve : mCurves )
{
QByteArray wkbForCurve = curve->asWkb( flags );
binarySize += wkbForCurve.length();
wkbForCurves << wkbForCurve;
binarySize += curve->wkbSize( flags );
}
return binarySize;
}

QByteArray QgsCompoundCurve::asWkb( WkbFlags flags ) const
{
QByteArray wkbArray;
wkbArray.resize( binarySize );
wkbArray.resize( QgsCompoundCurve::wkbSize( flags ) );
QgsWkbPtr wkb( wkbArray );
wkb << static_cast<char>( QgsApplication::endian() );
wkb << static_cast<quint32>( wkbType() );
wkb << static_cast<quint32>( mCurves.size() );
for ( const QByteArray &wkbForCurve : qgis::as_const( wkbForCurves ) )
for ( const QgsCurve *curve : mCurves )
{
wkb << wkbForCurve;
wkb << curve->asWkb( flags );
}
return wkbArray;
}
Expand Down
1 change: 1 addition & 0 deletions src/core/geometry/qgscompoundcurve.h
Expand Up @@ -46,6 +46,7 @@ class CORE_EXPORT QgsCompoundCurve: public QgsCurve
bool fromWkb( QgsConstWkbPtr &wkb ) override;
bool fromWkt( const QString &wkt ) override;

int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override;
QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override;
QString asWkt( int precision = 17 ) const override;
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
Expand Down
28 changes: 15 additions & 13 deletions src/core/geometry/qgscurvepolygon.cpp
Expand Up @@ -288,33 +288,35 @@ QgsRectangle QgsCurvePolygon::calculateBoundingBox() const
return QgsRectangle();
}

QByteArray QgsCurvePolygon::asWkb( WkbFlags flags ) const
int QgsCurvePolygon::wkbSize( QgsAbstractGeometry::WkbFlags flags ) const
{
int binarySize = sizeof( char ) + sizeof( quint32 ) + sizeof( quint32 );
QVector<QByteArray> wkbForRings;
wkbForRings.reserve( 1 + mInteriorRings.size() );
if ( mExteriorRing )
{
QByteArray wkb( mExteriorRing->asWkb( flags ) );
binarySize += wkb.length();
wkbForRings << wkb;
binarySize += mExteriorRing->wkbSize( flags );
}
for ( const QgsCurve *curve : mInteriorRings )
{
QByteArray wkb( curve->asWkb( flags ) );
binarySize += wkb.length();
wkbForRings << wkb;
binarySize += curve->wkbSize( flags );
}
return binarySize;
}

QByteArray QgsCurvePolygon::asWkb( WkbFlags flags ) const
{
QByteArray wkbArray;
wkbArray.resize( binarySize );
wkbArray.resize( QgsCurvePolygon::wkbSize( flags ) );
QgsWkbPtr wkbPtr( wkbArray );
wkbPtr << static_cast<char>( QgsApplication::endian() );
wkbPtr << static_cast<quint32>( wkbType() );
wkbPtr << static_cast<quint32>( wkbForRings.count() );
for ( const QByteArray &wkb : qgis::as_const( wkbForRings ) )
wkbPtr << static_cast<quint32>( ( mExteriorRing ? 1 : 0 ) + mInteriorRings.size() );
if ( mExteriorRing )
{
wkbPtr << mExteriorRing->asWkb( flags );
}
for ( const QgsCurve *curve : mInteriorRings )
{
wkbPtr << wkb;
wkbPtr << curve->asWkb( flags );
}
return wkbArray;
}
Expand Down
1 change: 1 addition & 0 deletions src/core/geometry/qgscurvepolygon.h
Expand Up @@ -51,6 +51,7 @@ class CORE_EXPORT QgsCurvePolygon: public QgsSurface
bool fromWkb( QgsConstWkbPtr &wkb ) override;
bool fromWkt( const QString &wkt ) override;

int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override;
QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override;
QString asWkt( int precision = 17 ) const override;
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
Expand Down
5 changes: 5 additions & 0 deletions src/core/geometry/qgsgeometry.cpp
Expand Up @@ -2504,6 +2504,11 @@ QVector<QgsPointXY> QgsGeometry::randomPointsInPolygon( int count, unsigned long
}
///@endcond

int QgsGeometry::wkbSize( QgsAbstractGeometry::WkbFlags flags ) const
{
return d->geometry ? d->geometry->wkbSize( flags ) : 0;
}

QByteArray QgsGeometry::asWkb( QgsAbstractGeometry::WkbFlags flags ) const
{
return d->geometry ? d->geometry->asWkb( flags ) : QByteArray();
Expand Down
9 changes: 9 additions & 0 deletions src/core/geometry/qgsgeometry.h
Expand Up @@ -1583,6 +1583,15 @@ class CORE_EXPORT QgsGeometry
#endif
///@endcond

/**
* Returns the length of the QByteArray returned by asWkb()
*
* The optional \a flags argument specifies flags controlling WKB export behavior
*
* \since QGIS 3.16
*/
int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const;

/**
* Export the geometry to WKB
*
Expand Down
32 changes: 23 additions & 9 deletions src/core/geometry/qgsgeometrycollection.cpp
Expand Up @@ -369,29 +369,43 @@ bool QgsGeometryCollection::fromWkt( const QString &wkt )
<< new QgsMultiCurve << new QgsMultiSurface, QStringLiteral( "GeometryCollection" ) );
}

QByteArray QgsGeometryCollection::asWkb( WkbFlags flags ) const
int QgsGeometryCollection::wkbSize( QgsAbstractGeometry::WkbFlags flags ) const
{
int binarySize = sizeof( char ) + sizeof( quint32 ) + sizeof( quint32 );
QVector<QByteArray> wkbForGeometries;
for ( const QgsAbstractGeometry *geom : mGeometries )
{
if ( geom )
{
QByteArray wkb( geom->asWkb( flags ) );
binarySize += wkb.length();
wkbForGeometries << wkb;
binarySize += geom->wkbSize( flags );
}
}

return binarySize;
}

QByteArray QgsGeometryCollection::asWkb( WkbFlags flags ) const
{
int countNonNull = 0;
for ( const QgsAbstractGeometry *geom : mGeometries )
{
if ( geom )
{
countNonNull ++;
}
}

QByteArray wkbArray;
wkbArray.resize( binarySize );
wkbArray.resize( QgsGeometryCollection::wkbSize( flags ) );
QgsWkbPtr wkb( wkbArray );
wkb << static_cast<char>( QgsApplication::endian() );
wkb << static_cast<quint32>( wkbType() );
wkb << static_cast<quint32>( wkbForGeometries.count() );
for ( const QByteArray &wkbForGeometry : qgis::as_const( wkbForGeometries ) )
wkb << static_cast<quint32>( countNonNull );
for ( const QgsAbstractGeometry *geom : mGeometries )
{
wkb << wkbForGeometry;
if ( geom )
{
wkb << geom->asWkb( flags );
}
}
return wkbArray;
}
Expand Down
2 changes: 2 additions & 0 deletions src/core/geometry/qgsgeometrycollection.h
Expand Up @@ -186,6 +186,8 @@ class CORE_EXPORT QgsGeometryCollection: public QgsAbstractGeometry

bool fromWkb( QgsConstWkbPtr &wkb ) override;
bool fromWkt( const QString &wkt ) override;

int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override;
QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override;
QString asWkt( int precision = 17 ) const override;
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
Expand Down
8 changes: 6 additions & 2 deletions src/core/geometry/qgslinestring.cpp
Expand Up @@ -490,13 +490,17 @@ bool QgsLineString::fromWkt( const QString &wkt )
return true;
}

QByteArray QgsLineString::asWkb( WkbFlags ) const
int QgsLineString::wkbSize( QgsAbstractGeometry::WkbFlags ) const
{
int binarySize = sizeof( char ) + sizeof( quint32 ) + sizeof( quint32 );
binarySize += numPoints() * ( 2 + is3D() + isMeasure() ) * sizeof( double );
return binarySize;
}

QByteArray QgsLineString::asWkb( WkbFlags flags ) const
{
QByteArray wkbArray;
wkbArray.resize( binarySize );
wkbArray.resize( QgsLineString::wkbSize( flags ) );
QgsWkbPtr wkb( wkbArray );
wkb << static_cast<char>( QgsApplication::endian() );
wkb << static_cast<quint32>( wkbType() );
Expand Down
1 change: 1 addition & 0 deletions src/core/geometry/qgslinestring.h
Expand Up @@ -603,6 +603,7 @@ class CORE_EXPORT QgsLineString: public QgsCurve
bool fromWkb( QgsConstWkbPtr &wkb ) override;
bool fromWkt( const QString &wkt ) override;

int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override;
QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override;
QString asWkt( int precision = 17 ) const override;
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
Expand Down
8 changes: 6 additions & 2 deletions src/core/geometry/qgspoint.cpp
Expand Up @@ -230,13 +230,17 @@ bool QgsPoint::fromWkt( const QString &wkt )
* See details in QEP #17
****************************************************************************/

QByteArray QgsPoint::asWkb( WkbFlags ) const
int QgsPoint::wkbSize( WkbFlags ) const
{
int binarySize = sizeof( char ) + sizeof( quint32 );
binarySize += ( 2 + is3D() + isMeasure() ) * sizeof( double );
return binarySize;
}

QByteArray QgsPoint::asWkb( WkbFlags flags ) const
{
QByteArray wkbArray;
wkbArray.resize( binarySize );
wkbArray.resize( QgsPoint::wkbSize( flags ) );
QgsWkbPtr wkb( wkbArray );
wkb << static_cast<char>( QgsApplication::endian() );
wkb << static_cast<quint32>( wkbType() );
Expand Down
1 change: 1 addition & 0 deletions src/core/geometry/qgspoint.h
Expand Up @@ -490,6 +490,7 @@ class CORE_EXPORT QgsPoint: public QgsAbstractGeometry
void clear() override;
bool fromWkb( QgsConstWkbPtr &wkb ) override;
bool fromWkt( const QString &wkt ) override;
int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override;
QByteArray asWkb( QgsAbstractGeometry::WkbFlags = QgsAbstractGeometry::WkbFlags() ) const override;
QString asWkt( int precision = 17 ) const override;
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
Expand Down

0 comments on commit 7ac4b51

Please sign in to comment.