remove PyNames for QgsGeometry::compare methods

single python method with some MethodCode to dispatch to proper cpp methods.
This commit is contained in:
Denis Rouzaud 2017-04-30 11:17:13 +02:00
parent b0d4a4c201
commit a86f5ea52d
7 changed files with 262 additions and 50 deletions

View File

@ -1185,45 +1185,123 @@ Ring 0 is outer ring and can't be deleted.
:rtype: QgsPolygon
%End
static bool compare( const QgsPolyline &p1, const QgsPolyline &p2,
double epsilon = 4 * DBL_EPSILON ) /PyName=comparePolylines/;
%Docstring
Compares two polylines for equality within a specified tolerance.
\param p1 first polyline
\param p2 second polyline
\param epsilon maximum difference for coordinates between the polylines
:return: true if polylines have the same number of points and all
points are equal within the specified tolerance
.. versionadded:: 2.9
:rtype: bool
%End
static bool compare( const QgsPolygon &p1, const QgsPolygon &p2,
double epsilon = 4 * DBL_EPSILON ) /PyName=comparePolygons/;
static bool compare( PyObject *obj1, PyObject *obj2, double epsilon = 4 * DBL_EPSILON );
%Docstring
Compares two polygons for equality within a specified tolerance.
\param p1 first polygon
\param p2 second polygon
\param epsilon maximum difference for coordinates between the polygons
:return: true if polygons have the same number of rings, and each ring has the same
number of points and all points are equal within the specified tolerance
.. versionadded:: 2.9
:rtype: bool
%End
static bool compare( const QgsMultiPolygon &p1, const QgsMultiPolygon &p2,
double epsilon = 4 * DBL_EPSILON ) /PyName=compareMultiPolygons/;
%Docstring
Compares two multipolygons for equality within a specified tolerance.
\param p1 first multipolygon
\param p2 second multipolygon
\param epsilon maximum difference for coordinates between the multipolygons
:return: true if multipolygons have the same number of polygons, the polygons have the same number
of rings, and each ring has the same number of points and all points are equal within the specified
Compares two geometry objects for equality within a specified tolerance.
The objects can be of type QgsPolyline, QgsPolygon or QgsMultiPolygon.
The 2 types should match.
\param p1 first geometry object
\param p2 second geometry object
\param epsilon maximum difference for coordinates between the objects
:return: true if objects are
- polylines and have the same number of points and all
points are equal within the specified tolerance
- polygons and have the same number of points and all
points are equal within the specified tolerance
- multipolygons and have the same number of polygons, the polygons have the same number
of rings, and each ring has the same number of points and all points are equal
within the specified
tolerance
.. versionadded:: 2.9
:rtype: bool
%End
%MethodCode
{
sipRes = false;
int state0;
int state1;
int sipIsErr = 0;
if ( PyList_Check( a0 ) && PyList_Check( a1 ) &&
PyList_GET_SIZE( a0 ) && PyList_GET_SIZE( a1 ) )
{
PyObject *o0 = PyList_GetItem( a0, 0 );
PyObject *o1 = PyList_GetItem( a1, 0 );
if ( o0 && o1 )
{
// compare polyline - polyline
if ( sipCanConvertToType( o0, sipType_QgsPoint, SIP_NOT_NONE ) &&
sipCanConvertToType( o1, sipType_QgsPoint, SIP_NOT_NONE ) &&
sipCanConvertToType( a0, sipType_QVector_0100QgsPoint, SIP_NOT_NONE ) &&
sipCanConvertToType( a1, sipType_QVector_0100QgsPoint, SIP_NOT_NONE ) )
{
QgsPolyline *p0;
QgsPolyline *p1;
p0 = reinterpret_cast<QgsPolyline *>( sipConvertToType( a0, sipType_QVector_0100QgsPoint, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
p1 = reinterpret_cast<QgsPolyline *>( sipConvertToType( a1, sipType_QVector_0100QgsPoint, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
if ( sipIsErr )
{
sipReleaseType( p0, sipType_QVector_0100QgsPoint, state0 );
sipReleaseType( p1, sipType_QVector_0100QgsPoint, state1 );
}
else
{
sipRes = QgsGeometry::compare( *p0, *p1, a2 );
}
}
else if ( PyList_Check( o0 ) && PyList_Check( o1 ) &&
PyList_GET_SIZE( o0 ) && PyList_GET_SIZE( o1 ) )
{
PyObject *oo0 = PyList_GetItem( o0, 0 );
PyObject *oo1 = PyList_GetItem( o1, 0 );
if ( oo0 && oo1 )
{
// compare polygon - polygon
if ( sipCanConvertToType( oo0, sipType_QgsPoint, SIP_NOT_NONE ) &&
sipCanConvertToType( oo1, sipType_QgsPoint, SIP_NOT_NONE ) &&
sipCanConvertToType( a0, sipType_QVector_0600QVector_0100QgsPoint, SIP_NOT_NONE ) &&
sipCanConvertToType( a1, sipType_QVector_0600QVector_0100QgsPoint, SIP_NOT_NONE ) )
{
QgsPolygon *p0;
QgsPolygon *p1;
p0 = reinterpret_cast<QgsPolygon *>( sipConvertToType( a0, sipType_QVector_0600QVector_0100QgsPoint, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
p1 = reinterpret_cast<QgsPolygon *>( sipConvertToType( a1, sipType_QVector_0600QVector_0100QgsPoint, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
if ( sipIsErr )
{
sipReleaseType( p0, sipType_QVector_0600QVector_0100QgsPoint, state0 );
sipReleaseType( p1, sipType_QVector_0600QVector_0100QgsPoint, state1 );
}
else
{
sipRes = QgsGeometry::compare( *p0, *p1, a2 );
}
}
else if ( PyList_Check( oo0 ) && PyList_Check( oo1 ) &&
PyList_GET_SIZE( oo0 ) && PyList_GET_SIZE( oo1 ) )
{
PyObject *ooo0 = PyList_GetItem( oo0, 0 );
PyObject *ooo1 = PyList_GetItem( oo1, 0 );
if ( ooo0 && ooo1 )
{
// compare multipolygon - multipolygon
if ( sipCanConvertToType( ooo0, sipType_QgsPoint, SIP_NOT_NONE ) &&
sipCanConvertToType( ooo1, sipType_QgsPoint, SIP_NOT_NONE ) &&
sipCanConvertToType( a0, sipType_QVector_0600QVector_0600QVector_0100QgsPoint, SIP_NOT_NONE ) &&
sipCanConvertToType( a1, sipType_QVector_0600QVector_0600QVector_0100QgsPoint, SIP_NOT_NONE ) )
{
QgsMultiPolygon *p0;
QgsMultiPolygon *p1;
p0 = reinterpret_cast<QgsMultiPolygon *>( sipConvertToType( a0, sipType_QVector_0600QVector_0600QVector_0100QgsPoint, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
p1 = reinterpret_cast<QgsMultiPolygon *>( sipConvertToType( a1, sipType_QVector_0600QVector_0600QVector_0100QgsPoint, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
if ( sipIsErr )
{
sipReleaseType( p0, sipType_QVector_0600QVector_0600QVector_0100QgsPoint, state0 );
sipReleaseType( p1, sipType_QVector_0600QVector_0600QVector_0100QgsPoint, state1 );
}
else
{
sipRes = QgsGeometry::compare( *p0, *p1, a2 );
}
}
}
}
}
}
}
}
}
%End
QgsGeometry smooth( const unsigned int iterations = 1, const double offset = 0.25,
double minimumDistance = -1.0, double maxAngle = 180.0 ) const;

View File

@ -42,7 +42,7 @@ done < <(
${GP}sed -n -r 's/^%Include (.*\.sip)/core\/\1/p' python/core/core.sip
${GP}sed -n -r 's/^%Include (.*\.sip)/gui\/\1/p' python/gui/gui.sip
${GP}sed -n -r 's/^%Include (.*\.sip)/analysis\/\1/p' python/analysis/analysis.sip
${GP}sed -n -r 's/^%Include (.*\.sip)/server\/\1/p' python/analysis/server.sip
${GP}sed -n -r 's/^%Include (.*\.sip)/server\/\1/p' python/server/server.sip
)
echo " => $count files sipified!"

View File

@ -1042,6 +1042,8 @@ class CORE_EXPORT QgsGeometry
*/
static QgsPolygon createPolygonFromQPolygonF( const QPolygonF &polygon ) SIP_FACTORY;
#ifndef SIP_RUN
/** Compares two polylines for equality within a specified tolerance.
* \param p1 first polyline
* \param p2 second polyline
@ -1051,7 +1053,7 @@ class CORE_EXPORT QgsGeometry
* \since QGIS 2.9
*/
static bool compare( const QgsPolyline &p1, const QgsPolyline &p2,
double epsilon = 4 * std::numeric_limits<double>::epsilon() SIP_PYARGDEFAULT( 4 * DBL_EPSILON ) ) SIP_PYNAME( comparePolylines );
double epsilon = 4 * std::numeric_limits<double>::epsilon() );
/** Compares two polygons for equality within a specified tolerance.
* \param p1 first polygon
@ -1062,7 +1064,7 @@ class CORE_EXPORT QgsGeometry
* \since QGIS 2.9
*/
static bool compare( const QgsPolygon &p1, const QgsPolygon &p2,
double epsilon = 4 * std::numeric_limits<double>::epsilon() SIP_PYARGDEFAULT( 4 * DBL_EPSILON ) ) SIP_PYNAME( comparePolygons );
double epsilon = 4 * std::numeric_limits<double>::epsilon() );
/** Compares two multipolygons for equality within a specified tolerance.
* \param p1 first multipolygon
@ -1074,7 +1076,124 @@ class CORE_EXPORT QgsGeometry
* \since QGIS 2.9
*/
static bool compare( const QgsMultiPolygon &p1, const QgsMultiPolygon &p2,
double epsilon = 4 * std::numeric_limits<double>::epsilon() SIP_PYARGDEFAULT( 4 * DBL_EPSILON ) ) SIP_PYNAME( compareMultiPolygons );
double epsilon = 4 * std::numeric_limits<double>::epsilon() );
#else
/** Compares two geometry objects for equality within a specified tolerance.
* The objects can be of type QgsPolyline, QgsPolygon or QgsMultiPolygon.
* The 2 types should match.
* \param p1 first geometry object
* \param p2 second geometry object
* \param epsilon maximum difference for coordinates between the objects
* \returns true if objects are
* - polylines and have the same number of points and all
* points are equal within the specified tolerance
* - polygons and have the same number of points and all
* points are equal within the specified tolerance
* - multipolygons and have the same number of polygons, the polygons have the same number
* of rings, and each ring has the same number of points and all points are equal
* within the specified
* tolerance
* \since QGIS 2.9
*/
static bool compare( PyObject *obj1, PyObject *obj2, double epsilon = 4 * DBL_EPSILON );
% MethodCode
{
sipRes = false;
int state0;
int state1;
int sipIsErr = 0;
if ( PyList_Check( a0 ) && PyList_Check( a1 ) &&
PyList_GET_SIZE( a0 ) && PyList_GET_SIZE( a1 ) )
{
PyObject *o0 = PyList_GetItem( a0, 0 );
PyObject *o1 = PyList_GetItem( a1, 0 );
if ( o0 && o1 )
{
// compare polyline - polyline
if ( sipCanConvertToType( o0, sipType_QgsPoint, SIP_NOT_NONE ) &&
sipCanConvertToType( o1, sipType_QgsPoint, SIP_NOT_NONE ) &&
sipCanConvertToType( a0, sipType_QVector_0100QgsPoint, SIP_NOT_NONE ) &&
sipCanConvertToType( a1, sipType_QVector_0100QgsPoint, SIP_NOT_NONE ) )
{
QgsPolyline *p0;
QgsPolyline *p1;
p0 = reinterpret_cast<QgsPolyline *>( sipConvertToType( a0, sipType_QVector_0100QgsPoint, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
p1 = reinterpret_cast<QgsPolyline *>( sipConvertToType( a1, sipType_QVector_0100QgsPoint, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
if ( sipIsErr )
{
sipReleaseType( p0, sipType_QVector_0100QgsPoint, state0 );
sipReleaseType( p1, sipType_QVector_0100QgsPoint, state1 );
}
else
{
sipRes = QgsGeometry::compare( *p0, *p1, a2 );
}
}
else if ( PyList_Check( o0 ) && PyList_Check( o1 ) &&
PyList_GET_SIZE( o0 ) && PyList_GET_SIZE( o1 ) )
{
PyObject *oo0 = PyList_GetItem( o0, 0 );
PyObject *oo1 = PyList_GetItem( o1, 0 );
if ( oo0 && oo1 )
{
// compare polygon - polygon
if ( sipCanConvertToType( oo0, sipType_QgsPoint, SIP_NOT_NONE ) &&
sipCanConvertToType( oo1, sipType_QgsPoint, SIP_NOT_NONE ) &&
sipCanConvertToType( a0, sipType_QVector_0600QVector_0100QgsPoint, SIP_NOT_NONE ) &&
sipCanConvertToType( a1, sipType_QVector_0600QVector_0100QgsPoint, SIP_NOT_NONE ) )
{
QgsPolygon *p0;
QgsPolygon *p1;
p0 = reinterpret_cast<QgsPolygon *>( sipConvertToType( a0, sipType_QVector_0600QVector_0100QgsPoint, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
p1 = reinterpret_cast<QgsPolygon *>( sipConvertToType( a1, sipType_QVector_0600QVector_0100QgsPoint, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
if ( sipIsErr )
{
sipReleaseType( p0, sipType_QVector_0600QVector_0100QgsPoint, state0 );
sipReleaseType( p1, sipType_QVector_0600QVector_0100QgsPoint, state1 );
}
else
{
sipRes = QgsGeometry::compare( *p0, *p1, a2 );
}
}
else if ( PyList_Check( oo0 ) && PyList_Check( oo1 ) &&
PyList_GET_SIZE( oo0 ) && PyList_GET_SIZE( oo1 ) )
{
PyObject *ooo0 = PyList_GetItem( oo0, 0 );
PyObject *ooo1 = PyList_GetItem( oo1, 0 );
if ( ooo0 && ooo1 )
{
// compare multipolygon - multipolygon
if ( sipCanConvertToType( ooo0, sipType_QgsPoint, SIP_NOT_NONE ) &&
sipCanConvertToType( ooo1, sipType_QgsPoint, SIP_NOT_NONE ) &&
sipCanConvertToType( a0, sipType_QVector_0600QVector_0600QVector_0100QgsPoint, SIP_NOT_NONE ) &&
sipCanConvertToType( a1, sipType_QVector_0600QVector_0600QVector_0100QgsPoint, SIP_NOT_NONE ) )
{
QgsMultiPolygon *p0;
QgsMultiPolygon *p1;
p0 = reinterpret_cast<QgsMultiPolygon *>( sipConvertToType( a0, sipType_QVector_0600QVector_0600QVector_0100QgsPoint, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
p1 = reinterpret_cast<QgsMultiPolygon *>( sipConvertToType( a1, sipType_QVector_0600QVector_0600QVector_0100QgsPoint, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
if ( sipIsErr )
{
sipReleaseType( p0, sipType_QVector_0600QVector_0600QVector_0100QgsPoint, state0 );
sipReleaseType( p1, sipType_QVector_0600QVector_0600QVector_0100QgsPoint, state1 );
}
else
{
sipRes = QgsGeometry::compare( *p0, *p1, a2 );
}
}
}
}
}
}
}
}
}
% End
#endif
/** Smooths a geometry by rounding off corners using the Chaikin algorithm. This operation
* roughly doubles the number of vertices in a geometry.

View File

@ -711,7 +711,7 @@ class ProviderTestCase(object):
QgsRectangle(-71.123, 66.33, -65.32, 78.3))
provider_extent = QgsGeometry.fromRect(self.provider.extent())
self.assertTrue(QgsGeometry.comparePolylines(provider_extent.asPolygon()[0], reference.asPolygon()[0], 0.00001))
self.assertTrue(QgsGeometry.compare(provider_extent.asPolygon()[0], reference.asPolygon()[0], 0.00001))
def testUnique(self):
self.assertEqual(set(self.provider.uniqueValues(1)), set([-200, 100, 200, 300, 400]))

View File

@ -191,7 +191,7 @@ class TestPyQgsOGRProviderGpkg(unittest.TestCase):
self.assertTrue(vl.commitChanges())
reference = QgsGeometry.fromRect(QgsRectangle(0.5, 0.0, 1.0, 1.0))
provider_extent = QgsGeometry.fromRect(vl.extent())
self.assertTrue(QgsGeometry.comparePolylines(provider_extent.asPolygon()[0], reference.asPolygon()[0], 0.00001),
self.assertTrue(QgsGeometry.compare(provider_extent.asPolygon()[0], reference.asPolygon()[0], 0.00001),
provider_extent.asPolygon()[0])
# Test deleting a geometry that touches the bbox
@ -200,7 +200,7 @@ class TestPyQgsOGRProviderGpkg(unittest.TestCase):
self.assertTrue(vl.commitChanges())
reference = QgsGeometry.fromRect(QgsRectangle(0.5, 0.0, 1.0, 0.5))
provider_extent = QgsGeometry.fromRect(vl.extent())
self.assertTrue(QgsGeometry.comparePolylines(provider_extent.asPolygon()[0], reference.asPolygon()[0], 0.00001),
self.assertTrue(QgsGeometry.compare(provider_extent.asPolygon()[0], reference.asPolygon()[0], 0.00001),
provider_extent.asPolygon()[0])
def testSelectSubsetString(self):

View File

@ -408,7 +408,7 @@ class TestPyQgsWFSProvider(unittest.TestCase, ProviderTestCase):
self.assertEqual(vl.featureCount(), 0)
reference = QgsGeometry.fromRect(QgsRectangle(400000.0, 5400000.0, 450000.0, 5500000.0))
vl_extent = QgsGeometry.fromRect(vl.extent())
assert QgsGeometry.comparePolylines(vl_extent.asPolygon()[0], reference.asPolygon()[0], 0.00001), 'Expected {}, got {}'.format(reference.exportToWkt(), vl_extent.exportToWkt())
assert QgsGeometry.compare(vl_extent.asPolygon()[0], reference.asPolygon()[0], 0.00001), 'Expected {}, got {}'.format(reference.exportToWkt(), vl_extent.exportToWkt())
with open(sanitize(endpoint, '?SERVICE=WFS&REQUEST=GetFeature&VERSION=1.0.0&TYPENAME=my:typename&SRSNAME=EPSG:32631'), 'wb') as f:
f.write("""
@ -651,7 +651,7 @@ class TestPyQgsWFSProvider(unittest.TestCase, ProviderTestCase):
reference = QgsGeometry.fromRect(QgsRectangle(399999.9999999680439942, 5399338.9090830031782389, 449999.9999999987776391, 5500658.0448500607162714))
vl_extent = QgsGeometry.fromRect(vl.extent())
assert QgsGeometry.comparePolylines(vl_extent.asPolygon()[0], reference.asPolygon()[0], 0.00001), 'Expected {}, got {}'.format(reference.exportToWkt(), vl_extent.exportToWkt())
assert QgsGeometry.compare(vl_extent.asPolygon()[0], reference.asPolygon()[0], 0.00001), 'Expected {}, got {}'.format(reference.exportToWkt(), vl_extent.exportToWkt())
def testWFST10(self):
"""Test WFS-T 1.0 (read-write)"""
@ -2016,7 +2016,7 @@ class TestPyQgsWFSProvider(unittest.TestCase, ProviderTestCase):
reference = QgsGeometry.fromRect(QgsRectangle(2, 49, 2, 49))
vl_extent = QgsGeometry.fromRect(vl.extent())
assert QgsGeometry.comparePolylines(vl_extent.asPolygon()[0], reference.asPolygon()[0], 0.00001), 'Expected {}, got {}'.format(reference.exportToWkt(), vl_extent.exportToWkt())
assert QgsGeometry.compare(vl_extent.asPolygon()[0], reference.asPolygon()[0], 0.00001), 'Expected {}, got {}'.format(reference.exportToWkt(), vl_extent.exportToWkt())
# Same with restrictToRequestBBOX=1
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='2.0.0' restrictToRequestBBOX=1", 'test', 'WFS')
@ -2157,7 +2157,7 @@ class TestPyQgsWFSProvider(unittest.TestCase, ProviderTestCase):
# Extent before downloading features
reference = QgsGeometry.fromRect(QgsRectangle(243900.3520259926444851, 4427769.1559739429503679, 1525592.3040170343592763, 5607994.6020106188952923))
vl_extent = QgsGeometry.fromRect(vl.extent())
assert QgsGeometry.comparePolylines(vl_extent.asPolygon()[0], reference.asPolygon()[0], 0.00001), 'Expected {}, got {}'.format(reference.exportToWkt(), vl_extent.exportToWkt())
assert QgsGeometry.compare(vl_extent.asPolygon()[0], reference.asPolygon()[0], 0.00001), 'Expected {}, got {}'.format(reference.exportToWkt(), vl_extent.exportToWkt())
# Download all features
features = [f for f in vl.getFeatures()]
@ -2165,7 +2165,7 @@ class TestPyQgsWFSProvider(unittest.TestCase, ProviderTestCase):
reference = QgsGeometry.fromRect(QgsRectangle(500000, 4500000, 510000, 4510000))
vl_extent = QgsGeometry.fromRect(vl.extent())
assert QgsGeometry.comparePolylines(vl_extent.asPolygon()[0], reference.asPolygon()[0], 0.00001), 'Expected {}, got {}'.format(reference.exportToWkt(), vl_extent.exportToWkt())
assert QgsGeometry.compare(vl_extent.asPolygon()[0], reference.asPolygon()[0], 0.00001), 'Expected {}, got {}'.format(reference.exportToWkt(), vl_extent.exportToWkt())
self.assertEqual(features[0]['intfield'], 1)
self.assertEqual(features[1]['intfield'], 2)

View File

@ -340,7 +340,7 @@ class TestQgsGeometry(unittest.TestCase):
"""Test we can simplify a complex geometry.
Note: there is a ticket related to this issue here:
https://issues.qgis.org/issues/4189
http://hub.qgis.org/issues/4189
Backstory: Ole Nielson pointed out an issue to me
(Tim Sutton) where simplify ftools was dropping
@ -1671,7 +1671,7 @@ class TestQgsGeometry(unittest.TestCase):
assert compareWkt(expWkt, wkt), "convertToType failed: from multiline to polygon. Expected:\n%s\nGot:\n%s\n" % (expWkt, wkt)
def testRegression13053(self):
""" See https://issues.qgis.org/issues/13053 """
""" See http://hub.qgis.org/issues/13053 """
p = QgsGeometry.fromWkt('MULTIPOLYGON(((62.0 18.0, 62.0 19.0, 63.0 19.0, 63.0 18.0, 62.0 18.0)), ((63.0 19.0, 63.0 20.0, 64.0 20.0, 64.0 19.0, 63.0 19.0)))')
assert p is not None
@ -1680,7 +1680,7 @@ class TestQgsGeometry(unittest.TestCase):
assert compareWkt(expWkt, wkt), "testRegression13053 failed: mismatch Expected:\n%s\nGot:\n%s\n" % (expWkt, wkt)
def testRegression13055(self):
""" See https://issues.qgis.org/issues/13055
""" See http://hub.qgis.org/issues/13055
Testing that invalid WKT with z values but not using PolygonZ is still parsed
by QGIS.
"""
@ -1692,7 +1692,7 @@ class TestQgsGeometry(unittest.TestCase):
assert compareWkt(expWkt, wkt), "testRegression13055 failed: mismatch Expected:\n%s\nGot:\n%s\n" % (expWkt, wkt)
def testRegression13274(self):
""" See https://issues.qgis.org/issues/13274
""" See http://hub.qgis.org/issues/13274
Testing that two combined linestrings produce another line string if possible
"""
a = QgsGeometry.fromWkt('LineString (0 0, 1 0)')
@ -1711,7 +1711,7 @@ class TestQgsGeometry(unittest.TestCase):
wkt = g.exportToWkt()
assert compareWkt(expWkt, wkt), "testReshape failed: mismatch Expected:\n%s\nGot:\n%s\n" % (expWkt, wkt)
# Test reshape a geometry involving the first/last vertex (https://issues.qgis.org/issues/14443)
# Test reshape a geometry involving the first/last vertex (http://hub.qgis.org/issues/14443)
g.reshapeGeometry([QgsPoint(0.5, 1), QgsPoint(0, 0.5)])
expWkt = 'Polygon ((0 0.5, 0 0, 1 0, 1 0.5, 0.5 1, 0 0.5))'
@ -4114,6 +4114,21 @@ class TestQgsGeometry(unittest.TestCase):
self.assertTrue(compareWkt(result, exp, 0.00001),
"centroid: mismatch using QgsAbstractGeometry methods Input {} \n Expected:\n{}\nGot:\n{}\n".format(t[0], exp, result))
def testCompare(self):
lp = [QgsPoint(1, 1), QgsPoint(2, 2), QgsPoint(1, 2), QgsPoint(1, 1)]
lp2 = [QgsPoint(1, 1.0000001), QgsPoint(2, 2), QgsPoint(1, 2), QgsPoint(1, 1)]
self.assertTrue(QgsGeometry.compare(lp, lp)) # line-line
self.assertTrue(QgsGeometry.compare([lp], [lp])) # pylygon-polygon
self.assertTrue(QgsGeometry.compare([[lp]], [[lp]])) # multipyolygon-multipolygon
# handling empty values
self.assertFalse(QgsGeometry.compare(None, None))
self.assertFalse(QgsGeometry.compare(lp, [])) # line-line
self.assertFalse(QgsGeometry.compare([lp], [[]])) # pylygon-polygon
self.assertFalse(QgsGeometry.compare([[lp]], [[[]]])) # multipolygon-multipolygon
# tolerance
self.assertFalse(QgsGeometry.compare(lp, lp2))
self.assertTrue(QgsGeometry.compare(lp, lp2, 1e-6))
if __name__ == '__main__':
unittest.main()