Add method to set QgsFeature geometry directly from QgsAbstractGeometry

Allows

    feat.setGeometry(QgsPoint(1,2))

instead of the more obscure

    feat.setGeometry(QgsGeometry(QgsPoint(1,2)))
This commit is contained in:
Nyall Dawson 2018-11-20 16:16:21 +10:00
parent 17e58738b8
commit e21ea25c66
5 changed files with 59 additions and 3 deletions

View File

@ -13,7 +13,6 @@
class QgsFeature
{
%Docstring
@ -329,6 +328,21 @@ Set the feature's geometry. The feature will be valid after.
.. seealso:: :py:func:`clearGeometry`
%End
void setGeometry( QgsAbstractGeometry *geometry /Transfer/ );
%Docstring
Set the feature's ``geometry``. Ownership of the geometry is transferred to the feature.
The feature will be made valid after calling this method.
.. seealso:: :py:func:`geometry`
.. seealso:: :py:func:`clearGeometry`
.. versionadded:: 3.6
%End
%MethodCode
sipCpp->setGeometry( std::unique_ptr< QgsAbstractGeometry>( a0 ) );
%End
void clearGeometry();
%Docstring
Removes any geometry associated with the feature.

View File

@ -141,6 +141,13 @@ void QgsFeature::setGeometry( const QgsGeometry &geometry )
d->valid = true;
}
void QgsFeature::setGeometry( std::unique_ptr<QgsAbstractGeometry> geometry )
{
d.detach();
d->geometry = QgsGeometry( std::move( geometry ) );
d->valid = true;
}
void QgsFeature::clearGeometry()
{
setGeometry( QgsGeometry() );

View File

@ -30,12 +30,13 @@ email : sherman at mrcc.com
#include "qgsattributes.h"
#include "qgsfields.h"
#include "qgsfeatureid.h"
#include <memory>
class QgsFeature;
class QgsFeaturePrivate;
class QgsField;
class QgsGeometry;
class QgsRectangle;
class QgsAbstractGeometry;
/***************************************************************************
@ -345,6 +346,22 @@ class CORE_EXPORT QgsFeature
*/
void setGeometry( const QgsGeometry &geometry );
/**
* Set the feature's \a geometry. Ownership of the geometry is transferred to the feature.
* The feature will be made valid after calling this method.
* \see geometry()
* \see clearGeometry()
* \since QGIS 3.6
*/
#ifndef SIP_RUN
void setGeometry( std::unique_ptr< QgsAbstractGeometry > geometry );
#else
void setGeometry( QgsAbstractGeometry *geometry SIP_TRANSFER );
% MethodCode
sipCpp->setGeometry( std::unique_ptr< QgsAbstractGeometry>( a0 ) );
% End
#endif
/**
* Removes any geometry associated with the feature.
* \see setGeometry()

View File

@ -306,6 +306,13 @@ void TestQgsFeature::geometry()
QCOMPARE( copy.geometry().asWkb(), geomByRef.asWkb() );
QCOMPARE( feature.geometry().asWkb(), mGeometry.asWkb() );
//setGeometry using abstract geom
copy = feature;
QCOMPARE( copy.geometry().asWkb(), mGeometry.asWkb() );
copy.setGeometry( qgis::make_unique< QgsPoint >( 5, 6 ) );
QCOMPARE( copy.geometry().asWkt(), QStringLiteral( "Point (5 6)" ) );
QCOMPARE( feature.geometry().asWkb(), mGeometry.asWkb() );
//clearGeometry
QgsFeature geomFeature;
geomFeature.setGeometry( QgsGeometry( mGeometry2 ) );

View File

@ -15,7 +15,14 @@ __revision__ = '$Format:%H$'
import qgis # NOQA
import os
from qgis.core import QgsFeature, QgsGeometry, QgsPointXY, QgsVectorLayer, NULL, QgsFields, QgsField
from qgis.core import (QgsFeature,
QgsPoint,
QgsGeometry,
QgsPointXY,
QgsVectorLayer,
NULL,
QgsFields,
QgsField)
from qgis.testing import start_app, unittest
from utilities import unitTestDataPath
@ -138,6 +145,10 @@ class TestQgsFeature(unittest.TestCase):
myMessage = '\nExpected: %s\nGot: %s' % (myExpectedGeometry, myGeometry)
assert myGeometry is not None, myMessage
# set from QgsAbstractGeometry
feat.setGeometry(QgsPoint(12, 34))
self.assertEqual(feat.geometry().asWkt(), 'Point (12 34)')
if __name__ == '__main__':
unittest.main()