Skip to content

Commit 0e55b3b

Browse files
committed
Fix loading of curved multitypes
1 parent 4c1ba46 commit 0e55b3b

23 files changed

+123
-57
lines changed

python/core/geometry/qgsabstractgeometryv2.sip

+4
Original file line numberDiff line numberDiff line change
@@ -112,4 +112,8 @@ class QgsAbstractGeometryV2
112112
/**Length for linear geometries,perimeter for area geometries*/
113113
virtual double length() const;
114114
virtual double area() const;
115+
116+
virtual bool hasCurvedSegments() const;
117+
/**Returns a geometry without curves. Caller takes ownership*/
118+
virtual QgsAbstractGeometryV2* segmentize() const /Factory/;
115119
};

python/core/geometry/qgscircularstringv2.sip

+1
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,5 @@ class QgsCircularStringV2: public QgsCurveV2
5252
bool pointAt( int i, QgsPointV2& vertex, QgsVertexId::VertexType& type ) const;
5353

5454
void sumUpArea( double& sum ) const;
55+
bool hasCurvedSegments() const;
5556
};

python/core/geometry/qgscompoundcurvev2.sip

+2
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,6 @@ class QgsCompoundCurveV2: public QgsCurveV2
5858
bool pointAt( int i, QgsPointV2& vertex, QgsVertexId::VertexType& type ) const;
5959

6060
void sumUpArea( double& sum ) const;
61+
62+
bool hasCurvedSegments() const;
6163
};

python/core/geometry/qgscurvepolygonv2.sip

+3
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,7 @@ class QgsCurvePolygonV2: public QgsSurfaceV2
5959
virtual void coordinateSequence( QList< QList< QList< QgsPointV2 > > >& coord /Out/ ) const;
6060
double closestSegment( const QgsPointV2& pt, QgsPointV2& segmentPt, QgsVertexId& vertexAfter, bool* leftOf, double epsilon ) const;
6161
bool nextVertex( QgsVertexId& id, QgsPointV2& vertex ) const;
62+
63+
bool hasCurvedSegments() const;
64+
QgsAbstractGeometryV2* segmentize() const /Factory/;
6265
};

python/core/geometry/qgscurvev2.sip

+3
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,7 @@ class QgsCurveV2: public QgsAbstractGeometryV2
2323
virtual void coordinateSequence( QList< QList< QList< QgsPointV2 > > >& coord /Out/ ) const;
2424
virtual bool nextVertex( QgsVertexId& id, QgsPointV2& vertex ) const;
2525
virtual bool pointAt( int i, QgsPointV2& vertex, QgsVertexId::VertexType& type ) const = 0;
26+
27+
/**Returns a geometry without curves. Caller takes ownership*/
28+
QgsAbstractGeometryV2* segmentize() const /Factory/;
2629
};

python/core/geometry/qgsgeometrycollectionv2.sip

+2
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,6 @@ class QgsGeometryCollectionV2: public QgsAbstractGeometryV2
4949

5050
virtual double length() const;
5151
virtual double area() const;
52+
53+
bool hasCurvedSegments() const;
5254
};

python/core/geometry/qgsmulticurvev2.sip

+2
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,6 @@ class QgsMultiCurveV2: public QgsGeometryCollectionV2
2020

2121
/**Adds a geometry and takes ownership. Returns true in case of success*/
2222
virtual bool addGeometry( QgsAbstractGeometryV2* g );
23+
/**Returns a geometry without curves. Caller takes ownership*/
24+
QgsAbstractGeometryV2* segmentize() const /Factory/;
2325
};

python/core/geometry/qgsmultisurfacev2.sip

+3
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,7 @@ class QgsMultiSurfaceV2: public QgsGeometryCollectionV2
1919

2020
/**Adds a geometry and takes ownership. Returns true in case of success*/
2121
virtual bool addGeometry( QgsAbstractGeometryV2* g );
22+
23+
/**Returns a geometry without curves. Caller takes ownership*/
24+
QgsAbstractGeometryV2* segmentize() const /Factory/;
2225
};

src/core/geometry/qgsabstractgeometryv2.h

+3
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@ class CORE_EXPORT QgsAbstractGeometryV2
131131

132132
bool isEmpty() const;
133133

134+
virtual bool hasCurvedSegments() const { return false; }
135+
/**Returns a geometry without curves. Caller takes ownership*/
136+
virtual QgsAbstractGeometryV2* segmentize() const { return clone(); }
134137

135138
protected:
136139
QgsWKBTypes::Type mWkbType;

src/core/geometry/qgscircularstringv2.h

+2
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ class CORE_EXPORT QgsCircularStringV2: public QgsCurveV2
7272

7373
void sumUpArea( double& sum ) const override;
7474

75+
bool hasCurvedSegments() const override { return true; }
76+
7577
private:
7678
QVector<double> mX;
7779
QVector<double> mY;

src/core/geometry/qgscompoundcurvev2.cpp

+14-18
Original file line numberDiff line numberDiff line change
@@ -333,24 +333,7 @@ QgsLineStringV2* QgsCompoundCurveV2::curveToLine() const
333333
line->append( currentLine );
334334
delete currentLine;
335335
}
336-
#if 0
337-
if ( curveIt == mCurves.constBegin() )
338-
{
339-
line = ( *curveIt )->curveToLine();
340-
if ( !line )
341-
{
342-
return 0;
343-
}
344-
}
345-
else
346-
{
347-
currentLine = ( *curveIt )->curveToLine();
348-
line->append( currentLine );
349-
delete currentLine;
350-
}
351-
}
352-
#endif //0
353-
return line;
336+
return line;
354337
}
355338

356339
const QgsCurveV2* QgsCompoundCurveV2::curveAt( int i ) const
@@ -568,3 +551,16 @@ void QgsCompoundCurveV2::close()
568551
addVertex( startPoint() );
569552
}
570553

554+
bool QgsCompoundCurveV2::hasCurvedSegments() const
555+
{
556+
QList< QgsCurveV2* >::const_iterator curveIt = mCurves.constBegin();
557+
for ( ; curveIt != mCurves.constEnd(); ++curveIt )
558+
{
559+
if (( *curveIt )->hasCurvedSegments() )
560+
{
561+
return true;
562+
}
563+
}
564+
return false;
565+
}
566+

src/core/geometry/qgscompoundcurvev2.h

+2
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ class CORE_EXPORT QgsCompoundCurveV2: public QgsCurveV2
7878
/**Appends first point if not already closed*/
7979
void close();
8080

81+
bool hasCurvedSegments() const override;
82+
8183
private:
8284
QList< QgsCurveV2* > mCurves;
8385
/**Turns a vertex id for the compound curve into one or more ids for the subcurves

src/core/geometry/qgscurvepolygonv2.cpp

+23
Original file line numberDiff line numberDiff line change
@@ -636,3 +636,26 @@ bool QgsCurvePolygonV2::deleteVertex( const QgsVertexId& vId )
636636
}
637637
return success;
638638
}
639+
640+
bool QgsCurvePolygonV2::hasCurvedSegments() const
641+
{
642+
if ( mExteriorRing && mExteriorRing->hasCurvedSegments() )
643+
{
644+
return true;
645+
}
646+
647+
QList<QgsCurveV2*>::const_iterator it = mInteriorRings.constBegin();
648+
for ( ; it != mInteriorRings.constEnd(); ++it )
649+
{
650+
if (( *it )->hasCurvedSegments() )
651+
{
652+
return true;
653+
}
654+
}
655+
return false;
656+
}
657+
658+
QgsAbstractGeometryV2* QgsCurvePolygonV2::segmentize() const
659+
{
660+
return toPolygon();
661+
}

src/core/geometry/qgscurvepolygonv2.h

+3
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ class CORE_EXPORT QgsCurvePolygonV2: public QgsSurfaceV2
8080
double closestSegment( const QgsPointV2& pt, QgsPointV2& segmentPt, QgsVertexId& vertexAfter, bool* leftOf, double epsilon ) const override;
8181
bool nextVertex( QgsVertexId& id, QgsPointV2& vertex ) const override;
8282

83+
bool hasCurvedSegments() const override;
84+
QgsAbstractGeometryV2* segmentize() const override;
85+
8386
protected:
8487

8588
QgsCurveV2* mExteriorRing;

src/core/geometry/qgscurvev2.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
***************************************************************************/
1717

1818
#include "qgscurvev2.h"
19+
#include "qgslinestringv2.h"
1920

2021
QgsCurveV2::QgsCurveV2(): QgsAbstractGeometryV2()
2122
{}
@@ -79,3 +80,8 @@ double QgsCurveV2::area() const
7980
sumUpArea( area );
8081
return qAbs( area );
8182
}
83+
84+
QgsAbstractGeometryV2* QgsCurveV2::segmentize() const
85+
{
86+
return curveToLine();
87+
}

src/core/geometry/qgscurvev2.h

+3
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ class CORE_EXPORT QgsCurveV2: public QgsAbstractGeometryV2
4646
virtual void coordinateSequence( QList< QList< QList< QgsPointV2 > > >& coord ) const override;
4747
virtual bool nextVertex( QgsVertexId& id, QgsPointV2& vertex ) const override;
4848
virtual bool pointAt( int i, QgsPointV2& vertex, QgsVertexId::VertexType& type ) const = 0;
49+
50+
/**Returns a geometry without curves. Caller takes ownership*/
51+
QgsAbstractGeometryV2* segmentize() const override;
4952
};
5053

5154
#endif // QGSCURVEV2_H

src/core/geometry/qgsgeometry.cpp

+5-39
Original file line numberDiff line numberDiff line change
@@ -1485,42 +1485,10 @@ void QgsGeometry::convertToStraightSegment()
14851485
}
14861486

14871487
detach();
1488-
QgsWKBTypes::Type flatGeomType = QgsWKBTypes::flatType( d->geometry->wkbType() );
1489-
if ( flatGeomType == QgsWKBTypes::CompoundCurve || flatGeomType == QgsWKBTypes::CircularString )
1490-
{
1491-
QgsCurveV2* curve = dynamic_cast<QgsCurveV2*>( d->geometry );
1492-
if ( !curve )
1493-
{
1494-
return ;
1495-
}
1496-
d->geometry = curve->curveToLine();
1497-
removeWkbGeos();
1498-
delete curve;
1499-
}
1500-
else if ( flatGeomType == QgsWKBTypes::CurvePolygon )
1501-
{
1502-
QgsCurvePolygonV2* curvePolygon = dynamic_cast<QgsCurvePolygonV2*>( d->geometry );
1503-
if ( !curvePolygon )
1504-
{
1505-
return;
1506-
}
1507-
d->geometry = curvePolygon->toPolygon();
1508-
removeWkbGeos();
1509-
delete curvePolygon;
1510-
}
1511-
else //no segmentation needed
1512-
{
1513-
return;
1514-
}
1515-
1516-
//compoundcurve / circularstring /multicurve ?
1517-
1518-
//curve polygon / multisurface?
1519-
delete[] mWkb;
1520-
mWkb = 0;
1521-
mWkbSize = 0;
1522-
GEOSGeom_destroy( mGeos );
1523-
mGeos = 0;
1488+
QgsAbstractGeometryV2* straightGeom = d->geometry->segmentize();
1489+
delete d->geometry;
1490+
d->geometry = straightGeom;
1491+
removeWkbGeos();
15241492
}
15251493

15261494
bool QgsGeometry::requiresConversionToStraightSegments() const
@@ -1530,9 +1498,7 @@ bool QgsGeometry::requiresConversionToStraightSegments() const
15301498
return false;
15311499
}
15321500

1533-
QgsWKBTypes::Type flatGeomType = QgsWKBTypes::flatType( d->geometry->wkbType() );
1534-
return ( flatGeomType == QgsWKBTypes::CompoundCurve || flatGeomType == QgsWKBTypes::CircularString
1535-
|| flatGeomType == QgsWKBTypes::CurvePolygon );
1501+
return d->geometry->hasCurvedSegments();
15361502
}
15371503

15381504
int QgsGeometry::transform( const QgsCoordinateTransform& ct )

src/core/geometry/qgsgeometrycollectionv2.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -446,3 +446,16 @@ bool QgsGeometryCollectionV2::fromCollectionWkt( const QString &wkt, const QList
446446
qDeleteAll( subtypes );
447447
return true;
448448
}
449+
450+
bool QgsGeometryCollectionV2::hasCurvedSegments() const
451+
{
452+
QVector< QgsAbstractGeometryV2* >::const_iterator it = mGeometries.constBegin();
453+
for ( ; it != mGeometries.constEnd(); ++it )
454+
{
455+
if (( *it )->hasCurvedSegments() )
456+
{
457+
return true;
458+
}
459+
}
460+
return false;
461+
}

src/core/geometry/qgsgeometrycollectionv2.h

+2
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ class CORE_EXPORT QgsGeometryCollectionV2: public QgsAbstractGeometryV2
7070
virtual double length() const override;
7171
virtual double area() const override;
7272

73+
bool hasCurvedSegments() const override;
74+
7375
protected:
7476
QVector< QgsAbstractGeometryV2* > mGeometries;
7577
void removeGeometries();

src/core/geometry/qgsmulticurvev2.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,14 @@ bool QgsMultiCurveV2::addGeometry( QgsAbstractGeometryV2* g )
106106
setZMTypeFromSubGeometry( g, QgsWKBTypes::MultiCurve );
107107
return QgsGeometryCollectionV2::addGeometry( g );
108108
}
109+
110+
QgsAbstractGeometryV2* QgsMultiCurveV2::segmentize() const
111+
{
112+
QgsMultiCurveV2* c = new QgsMultiCurveV2();
113+
QVector< QgsAbstractGeometryV2* >::const_iterator geomIt = mGeometries.constBegin();
114+
for ( ; geomIt != mGeometries.constEnd(); ++geomIt )
115+
{
116+
c->addGeometry(( *geomIt )->segmentize() );
117+
}
118+
return c;
119+
}

src/core/geometry/qgsmulticurvev2.h

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ class CORE_EXPORT QgsMultiCurveV2: public QgsGeometryCollectionV2
3636

3737
/**Adds a geometry and takes ownership. Returns true in case of success*/
3838
virtual bool addGeometry( QgsAbstractGeometryV2* g ) override;
39+
/**Returns a geometry without curves. Caller takes ownership*/
40+
QgsAbstractGeometryV2* segmentize() const override;
3941
};
4042

4143
#endif // QGSMULTICURVEV2_H

src/core/geometry/qgsmultisurfacev2.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -126,3 +126,14 @@ bool QgsMultiSurfaceV2::addGeometry( QgsAbstractGeometryV2* g )
126126
setZMTypeFromSubGeometry( g, QgsWKBTypes::MultiSurface );
127127
return QgsGeometryCollectionV2::addGeometry( g );
128128
}
129+
130+
QgsAbstractGeometryV2* QgsMultiSurfaceV2::segmentize() const
131+
{
132+
QgsMultiSurfaceV2* c = new QgsMultiSurfaceV2();
133+
QVector< QgsAbstractGeometryV2* >::const_iterator geomIt = mGeometries.constBegin();
134+
for ( ; geomIt != mGeometries.constEnd(); ++geomIt )
135+
{
136+
c->addGeometry(( *geomIt )->segmentize() );
137+
}
138+
return c;
139+
}

src/core/geometry/qgsmultisurfacev2.h

+3
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ class CORE_EXPORT QgsMultiSurfaceV2: public QgsGeometryCollectionV2
3636

3737
/**Adds a geometry and takes ownership. Returns true in case of success*/
3838
virtual bool addGeometry( QgsAbstractGeometryV2* g ) override;
39+
40+
/**Returns a geometry without curves. Caller takes ownership*/
41+
QgsAbstractGeometryV2* segmentize() const override;
3942
};
4043

4144
#endif // QGSMULTISURFACEV2_H

0 commit comments

Comments
 (0)