Skip to content

Commit 959d1e9

Browse files
committedMay 22, 2018
Avoid some unnecessary geometry clones during map to pixel
simplification
1 parent c1661de commit 959d1e9

File tree

2 files changed

+19
-17
lines changed

2 files changed

+19
-17
lines changed
 

‎src/core/qgsmaptopixelgeometrysimplifier.cpp

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ bool QgsMapToPixelSimplifier::equalSnapToGrid( double x1, double y1, double x2,
6868
//////////////////////////////////////////////////////////////////////////////////////////////
6969

7070
//! Generalize the WKB-geometry using the BBOX of the original geometry
71-
static QgsGeometry generalizeWkbGeometryByBoundingBox(
71+
static std::unique_ptr< QgsAbstractGeometry > generalizeWkbGeometryByBoundingBox(
7272
QgsWkbTypes::Type wkbType,
7373
const QgsAbstractGeometry &geometry,
7474
const QgsRectangle &envelope,
@@ -81,7 +81,7 @@ static QgsGeometry generalizeWkbGeometryByBoundingBox(
8181

8282
if ( geometry.nCoordinates() <= minimumSize )
8383
{
84-
return QgsGeometry( geometry.clone() );
84+
return std::unique_ptr< QgsAbstractGeometry >( geometry.clone() );
8585
}
8686

8787
const double x1 = envelope.xMinimum();
@@ -92,7 +92,7 @@ static QgsGeometry generalizeWkbGeometryByBoundingBox(
9292
// Write the generalized geometry
9393
if ( geometryType == QgsWkbTypes::LineString && !isRing )
9494
{
95-
return QgsGeometry( qgis::make_unique< QgsLineString >( QVector<double>() << x1 << x2, QVector<double>() << y1 << y2 ) );
95+
return qgis::make_unique< QgsLineString >( QVector<double>() << x1 << x2, QVector<double>() << y1 << y2 );
9696
}
9797
else
9898
{
@@ -108,17 +108,17 @@ static QgsGeometry generalizeWkbGeometryByBoundingBox(
108108
<< y2
109109
<< y1 );
110110
if ( geometryType == QgsWkbTypes::LineString )
111-
return QgsGeometry( std::move( ext ) );
111+
return ext;
112112
else
113113
{
114114
std::unique_ptr< QgsPolygon > polygon = qgis::make_unique< QgsPolygon >();
115115
polygon->setExteriorRing( ext.release() );
116-
return QgsGeometry( std::move( polygon ) );
116+
return polygon;
117117
}
118118
}
119119
}
120120

121-
QgsGeometry QgsMapToPixelSimplifier::simplifyGeometry( int simplifyFlags,
121+
std::unique_ptr< QgsAbstractGeometry > QgsMapToPixelSimplifier::simplifyGeometry( int simplifyFlags,
122122
SimplifyAlgorithm simplifyAlgorithm,
123123
const QgsAbstractGeometry &geometry, double map2pixelTol,
124124
bool isaLinearRing )
@@ -292,7 +292,7 @@ QgsGeometry QgsMapToPixelSimplifier::simplifyGeometry( int simplifyFlags,
292292
// Bad luck! The simplified geometry is invalid and approximation by bounding box
293293
// would create artifacts due to long segments.
294294
// We will return the original geometry
295-
return QgsGeometry( geometry.clone() );
295+
return std::unique_ptr< QgsAbstractGeometry >( geometry.clone() );
296296
}
297297
}
298298

@@ -305,20 +305,21 @@ QgsGeometry QgsMapToPixelSimplifier::simplifyGeometry( int simplifyFlags,
305305
}
306306
}
307307

308-
return QgsGeometry( output.release() );
308+
return output;
309309
}
310310
else if ( flatType == QgsWkbTypes::Polygon )
311311
{
312312
const QgsPolygon &srcPolygon = dynamic_cast<const QgsPolygon &>( geometry );
313313
std::unique_ptr<QgsPolygon> polygon( new QgsPolygon() );
314-
polygon->setExteriorRing( qgsgeometry_cast<QgsCurve *>( simplifyGeometry( simplifyFlags, simplifyAlgorithm, *srcPolygon.exteriorRing(), map2pixelTol, true ).constGet()->clone() ) );
314+
std::unique_ptr<QgsAbstractGeometry> extRing = simplifyGeometry( simplifyFlags, simplifyAlgorithm, *srcPolygon.exteriorRing(), map2pixelTol, true );
315+
polygon->setExteriorRing( qgsgeometry_cast<QgsCurve *>( extRing.release() ) );
315316
for ( int i = 0; i < srcPolygon.numInteriorRings(); ++i )
316317
{
317318
const QgsCurve *sub = srcPolygon.interiorRing( i );
318-
std::unique_ptr< QgsCurve > ring( qgsgeometry_cast<QgsCurve *>( simplifyGeometry( simplifyFlags, simplifyAlgorithm, *sub, map2pixelTol, true ).constGet()->clone() ) );
319-
polygon->addInteriorRing( ring.release() );
319+
std::unique_ptr< QgsAbstractGeometry > ring = simplifyGeometry( simplifyFlags, simplifyAlgorithm, *sub, map2pixelTol, true );
320+
polygon->addInteriorRing( qgsgeometry_cast<QgsCurve *>( ring.release() ) );
320321
}
321-
return QgsGeometry( polygon.release() );
322+
return polygon;
322323
}
323324
else if ( QgsWkbTypes::isMultiType( flatType ) )
324325
{
@@ -328,11 +329,12 @@ QgsGeometry QgsMapToPixelSimplifier::simplifyGeometry( int simplifyFlags,
328329
for ( int i = 0; i < numGeoms; ++i )
329330
{
330331
const QgsAbstractGeometry *sub = srcCollection.geometryN( i );
331-
collection->addGeometry( simplifyGeometry( simplifyFlags, simplifyAlgorithm, *sub, map2pixelTol, false ).constGet()->clone() );
332+
std::unique_ptr< QgsAbstractGeometry > part = simplifyGeometry( simplifyFlags, simplifyAlgorithm, *sub, map2pixelTol, false );
333+
collection->addGeometry( part.release() );
332334
}
333-
return QgsGeometry( collection.release() );
335+
return collection;
334336
}
335-
return QgsGeometry( geometry.clone() );
337+
return std::unique_ptr< QgsAbstractGeometry >( geometry.clone() );
336338
}
337339

338340
//////////////////////////////////////////////////////////////////////////////////////////////
@@ -378,5 +380,5 @@ QgsGeometry QgsMapToPixelSimplifier::simplify( const QgsGeometry &geometry ) con
378380
return geometry;
379381
}
380382

381-
return simplifyGeometry( mSimplifyFlags, mSimplifyAlgorithm, *geometry.constGet(), mTolerance, false );
383+
return QgsGeometry( simplifyGeometry( mSimplifyFlags, mSimplifyAlgorithm, *geometry.constGet(), mTolerance, false ) );
382384
}

‎src/core/qgsmaptopixelgeometrysimplifier.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class CORE_EXPORT QgsMapToPixelSimplifier : public QgsAbstractGeometrySimplifier
5858

5959
private:
6060
//! Simplify the geometry using the specified tolerance
61-
static QgsGeometry simplifyGeometry( int simplifyFlags, SimplifyAlgorithm simplifyAlgorithm, const QgsAbstractGeometry &geometry, double map2pixelTol, bool isaLinearRing );
61+
static std::unique_ptr<QgsAbstractGeometry> simplifyGeometry( int simplifyFlags, SimplifyAlgorithm simplifyAlgorithm, const QgsAbstractGeometry &geometry, double map2pixelTol, bool isaLinearRing );
6262

6363
protected:
6464
//! Current simplification flags

1 commit comments

Comments
 (1)

slarosa commented on May 22, 2018

@slarosa
Member

hi @nyalldawson, building now on mac I am getting the following:

[  0%] Building CXX object src/core/CMakeFiles/qgis_core.dir/qgsmaptopixelgeometrysimplifier.cpp.o
/Users/slarosa/dev/qgis-src/QGIS/src/core/qgsmaptopixelgeometrysimplifier.cpp:111:14: error: no viable conversion from returned value of type 'unique_ptr<QgsLineString>' to function return type 'unique_ptr<QgsAbstractGeometry>'
      return ext;
             ^~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2553:29: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'std::unique_ptr<QgsLineString>' to 'const std::__1::unique_ptr<QgsAbstractGeometry, std::__1::default_delete<QgsAbstractGeometry> > &' for 1st argument
class _LIBCPP_TYPE_VIS_ONLY unique_ptr
                            ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2582:49: note: candidate constructor not viable: no known conversion from 'std::unique_ptr<QgsLineString>' to 'nullptr_t' for 1st argument
    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT
                                                ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2609:31: note: candidate constructor not viable: no known conversion from 'std::unique_ptr<QgsLineString>' to 'std::__1::unique_ptr<QgsAbstractGeometry, std::__1::default_delete<QgsAbstractGeometry> > &&' for 1st argument
    _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT
                              ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2613:9: note: candidate constructor [with _Up = QgsLineString, _Ep = std::__1::default_delete<QgsLineString>] not viable: no known conversion from 'std::unique_ptr<QgsLineString>' to 'unique_ptr<QgsLineString, std::__1::default_delete<QgsLineString> > &&' for 1st argument
        unique_ptr(unique_ptr<_Up, _Ep>&& __u,
        ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2628:35: note: candidate template ignored: could not match 'auto_ptr' against 'unique_ptr'
        _LIBCPP_INLINE_VISIBILITY unique_ptr(auto_ptr<_Up>&& __p,
                                  ^
/Users/slarosa/dev/qgis-src/QGIS/src/core/qgsmaptopixelgeometrysimplifier.cpp:116:14: error: no viable conversion from returned value of type 'unique_ptr<QgsPolygon>' to function return type 'unique_ptr<QgsAbstractGeometry>'
      return polygon;
             ^~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2553:29: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'std::unique_ptr<QgsPolygon>' to 'const std::__1::unique_ptr<QgsAbstractGeometry, std::__1::default_delete<QgsAbstractGeometry> > &' for 1st argument
class _LIBCPP_TYPE_VIS_ONLY unique_ptr
                            ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2582:49: note: candidate constructor not viable: no known conversion from 'std::unique_ptr<QgsPolygon>' to 'nullptr_t' for 1st argument
    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT
                                                ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2609:31: note: candidate constructor not viable: no known conversion from 'std::unique_ptr<QgsPolygon>' to 'std::__1::unique_ptr<QgsAbstractGeometry, std::__1::default_delete<QgsAbstractGeometry> > &&' for 1st argument
    _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT
                              ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2613:9: note: candidate constructor [with _Up = QgsPolygon, _Ep = std::__1::default_delete<QgsPolygon>] not viable: no known conversion from 'std::unique_ptr<QgsPolygon>' to 'unique_ptr<QgsPolygon, std::__1::default_delete<QgsPolygon> > &&' for 1st argument
        unique_ptr(unique_ptr<_Up, _Ep>&& __u,
        ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2628:35: note: candidate template ignored: could not match 'auto_ptr' against 'unique_ptr'
        _LIBCPP_INLINE_VISIBILITY unique_ptr(auto_ptr<_Up>&& __p,
                                  ^
/Users/slarosa/dev/qgis-src/QGIS/src/core/qgsmaptopixelgeometrysimplifier.cpp:308:12: error: no viable conversion from returned value of type 'unique_ptr<QgsCurve>' to function return type 'unique_ptr<QgsAbstractGeometry>'
    return output;
           ^~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2553:29: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'std::unique_ptr<QgsCurve>' to 'const std::__1::unique_ptr<QgsAbstractGeometry, std::__1::default_delete<QgsAbstractGeometry> > &' for 1st argument
class _LIBCPP_TYPE_VIS_ONLY unique_ptr
                            ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2582:49: note: candidate constructor not viable: no known conversion from 'std::unique_ptr<QgsCurve>' to 'nullptr_t' for 1st argument
    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT
                                                ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2609:31: note: candidate constructor not viable: no known conversion from 'std::unique_ptr<QgsCurve>' to 'std::__1::unique_ptr<QgsAbstractGeometry, std::__1::default_delete<QgsAbstractGeometry> > &&' for 1st argument
    _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT
                              ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2613:9: note: candidate constructor [with _Up = QgsCurve, _Ep = std::__1::default_delete<QgsCurve>] not viable: no known conversion from 'std::unique_ptr<QgsCurve>' to 'unique_ptr<QgsCurve, std::__1::default_delete<QgsCurve> > &&' for 1st argument
        unique_ptr(unique_ptr<_Up, _Ep>&& __u,
        ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2628:35: note: candidate template ignored: could not match 'auto_ptr' against 'unique_ptr'
        _LIBCPP_INLINE_VISIBILITY unique_ptr(auto_ptr<_Up>&& __p,
                                  ^
/Users/slarosa/dev/qgis-src/QGIS/src/core/qgsmaptopixelgeometrysimplifier.cpp:322:12: error: no viable conversion from returned value of type 'unique_ptr<QgsPolygon>' to function return type 'unique_ptr<QgsAbstractGeometry>'
    return polygon;
           ^~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2553:29: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'std::unique_ptr<QgsPolygon>' to 'const std::__1::unique_ptr<QgsAbstractGeometry, std::__1::default_delete<QgsAbstractGeometry> > &' for 1st argument
class _LIBCPP_TYPE_VIS_ONLY unique_ptr
                            ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2582:49: note: candidate constructor not viable: no known conversion from 'std::unique_ptr<QgsPolygon>' to 'nullptr_t' for 1st argument
    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT
                                                ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2609:31: note: candidate constructor not viable: no known conversion from 'std::unique_ptr<QgsPolygon>' to 'std::__1::unique_ptr<QgsAbstractGeometry, std::__1::default_delete<QgsAbstractGeometry> > &&' for 1st argument
    _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT
                              ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2613:9: note: candidate constructor [with _Up = QgsPolygon, _Ep = std::__1::default_delete<QgsPolygon>] not viable: no known conversion from 'std::unique_ptr<QgsPolygon>' to 'unique_ptr<QgsPolygon, std::__1::default_delete<QgsPolygon> > &&' for 1st argument
        unique_ptr(unique_ptr<_Up, _Ep>&& __u,
        ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2628:35: note: candidate template ignored: could not match 'auto_ptr' against 'unique_ptr'
        _LIBCPP_INLINE_VISIBILITY unique_ptr(auto_ptr<_Up>&& __p,
                                  ^
/Users/slarosa/dev/qgis-src/QGIS/src/core/qgsmaptopixelgeometrysimplifier.cpp:335:12: error: no viable conversion from returned value of type 'unique_ptr<QgsGeometryCollection>' to function return type 'unique_ptr<QgsAbstractGeometry>'
    return collection;
           ^~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2553:29: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'std::unique_ptr<QgsGeometryCollection>' to 'const std::__1::unique_ptr<QgsAbstractGeometry, std::__1::default_delete<QgsAbstractGeometry> > &' for 1st argument
class _LIBCPP_TYPE_VIS_ONLY unique_ptr
                            ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2582:49: note: candidate constructor not viable: no known conversion from 'std::unique_ptr<QgsGeometryCollection>' to 'nullptr_t' for 1st argument
    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT
                                                ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2609:31: note: candidate constructor not viable: no known conversion from 'std::unique_ptr<QgsGeometryCollection>' to 'std::__1::unique_ptr<QgsAbstractGeometry, std::__1::default_delete<QgsAbstractGeometry> > &&' for 1st argument
    _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT
                              ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2613:9: note: candidate constructor [with _Up = QgsGeometryCollection, _Ep = std::__1::default_delete<QgsGeometryCollection>] not viable: no known conversion from 'std::unique_ptr<QgsGeometryCollection>' to 'unique_ptr<QgsGeometryCollection, std::__1::default_delete<QgsGeometryCollection> > &&' for 1st argument
        unique_ptr(unique_ptr<_Up, _Ep>&& __u,
        ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2628:35: note: candidate template ignored: could not match 'auto_ptr' against 'unique_ptr'
        _LIBCPP_INLINE_VISIBILITY unique_ptr(auto_ptr<_Up>&& __p,
                                  ^
5 errors generated.
make[2]: *** [src/core/CMakeFiles/qgis_core.dir/qgsmaptopixelgeometrysimplifier.cpp.o] Error 1
make[1]: *** [src/core/CMakeFiles/qgis_core.dir/all] Error 2
make: *** [all] Error 2

Is the error related to those changes?

Please sign in to comment.