Skip to content

Commit 5f6dfae

Browse files
committedAug 14, 2016
Remove QgsGeometry pointers from QgsGeometryAnalyzer
1 parent 6d82cd6 commit 5f6dfae

File tree

2 files changed

+45
-54
lines changed

2 files changed

+45
-54
lines changed
 

‎src/analysis/vector/qgsgeometryanalyzer.cpp

Lines changed: 41 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -347,14 +347,14 @@ QList<double> QgsGeometryAnalyzer::simpleMeasure( QgsGeometry& mpGeometry )
347347
list.append( measure.measureArea( mpGeometry ) );
348348
if ( mpGeometry.type() == QgsWkbTypes::PolygonGeometry )
349349
{
350-
perim = perimeterMeasure( &mpGeometry, measure );
350+
perim = perimeterMeasure( mpGeometry, measure );
351351
list.append( perim );
352352
}
353353
}
354354
return list;
355355
}
356356

357-
double QgsGeometryAnalyzer::perimeterMeasure( QgsGeometry* geometry, QgsDistanceArea& measure )
357+
double QgsGeometryAnalyzer::perimeterMeasure( const QgsGeometry& geometry, QgsDistanceArea& measure )
358358
{
359359
return measure.measurePerimeter( geometry );
360360
}
@@ -520,7 +520,6 @@ bool QgsGeometryAnalyzer::convexHull( QgsVectorLayer* layer, const QString& shap
520520
++jt;
521521
}
522522
QList<double> values;
523-
// QgsGeometry* tmpGeometry = 0;
524523
if ( dissolveGeometry.isEmpty() )
525524
{
526525
QgsDebugMsg( "no dissolved geometry - should not happen" );
@@ -615,7 +614,7 @@ bool QgsGeometryAnalyzer::dissolve( QgsVectorLayer* layer, const QString& shapef
615614
}
616615
}
617616

618-
QgsGeometry *dissolveGeometry = nullptr; //dissolve geometry
617+
QgsGeometry dissolveGeometry; //dissolve geometry
619618
QMultiMap<QString, QgsFeatureId>::const_iterator jt = map.constBegin();
620619
QgsFeature outputFeature;
621620
while ( jt != map.constEnd() )
@@ -653,7 +652,7 @@ bool QgsGeometryAnalyzer::dissolve( QgsVectorLayer* layer, const QString& shapef
653652
outputFeature.setAttributes( currentFeature.attributes() );
654653
first = false;
655654
}
656-
dissolveFeature( currentFeature, processedFeatures, &dissolveGeometry );
655+
dissolveGeometry = dissolveFeature( currentFeature, dissolveGeometry );
657656
++processedFeatures;
658657
}
659658
++jt;
@@ -686,38 +685,33 @@ bool QgsGeometryAnalyzer::dissolve( QgsVectorLayer* layer, const QString& shapef
686685
outputFeature.setAttributes( currentFeature.attributes() );
687686
first = false;
688687
}
689-
dissolveFeature( currentFeature, processedFeatures, &dissolveGeometry );
688+
dissolveGeometry = dissolveFeature( currentFeature, dissolveGeometry );
690689
++processedFeatures;
691690
++jt;
692691
}
693692
}
694-
outputFeature.setGeometry( *dissolveGeometry );
695-
delete dissolveGeometry;
693+
outputFeature.setGeometry( dissolveGeometry );
696694
vWriter.addFeature( outputFeature );
697695
}
698696
return true;
699697
}
700698

701-
void QgsGeometryAnalyzer::dissolveFeature( QgsFeature& f, int nProcessedFeatures, QgsGeometry** dissolveGeometry )
699+
QgsGeometry QgsGeometryAnalyzer::dissolveFeature( const QgsFeature& f, const QgsGeometry& dissolveInto )
702700
{
703701
if ( !f.hasGeometry() )
704702
{
705-
return;
703+
return dissolveInto;
706704
}
707705

708706
QgsGeometry featureGeometry = f.geometry();
709707

710-
if ( nProcessedFeatures == 0 )
708+
if ( dissolveInto.isEmpty() )
711709
{
712-
int geomSize = featureGeometry.wkbSize();
713-
*dissolveGeometry = new QgsGeometry();
714-
unsigned char* wkb = new unsigned char[geomSize];
715-
memcpy( wkb, featureGeometry.asWkb(), geomSize );
716-
( *dissolveGeometry )->fromWkb( wkb, geomSize );
710+
return featureGeometry;
717711
}
718712
else
719713
{
720-
**dissolveGeometry = ( *dissolveGeometry )->combine( featureGeometry );
714+
return dissolveInto.combine( featureGeometry );
721715
}
722716
}
723717

@@ -744,7 +738,7 @@ bool QgsGeometryAnalyzer::buffer( QgsVectorLayer* layer, const QString& shapefil
744738

745739
QgsVectorFileWriter vWriter( shapefileName, dp->encoding(), layer->fields(), outputType, crs );
746740
QgsFeature currentFeature;
747-
QgsGeometry *dissolveGeometry = nullptr; //dissolve geometry (if dissolve enabled)
741+
QgsGeometry dissolveGeometry; //dissolve geometry (if dissolve enabled)
748742

749743
//take only selection
750744
if ( onlySelectedFeatures )
@@ -773,7 +767,7 @@ bool QgsGeometryAnalyzer::buffer( QgsVectorLayer* layer, const QString& shapefil
773767
{
774768
continue;
775769
}
776-
bufferFeature( currentFeature, processedFeatures, &vWriter, dissolve, *dissolveGeometry, bufferDistance, bufferDistanceField );
770+
bufferFeature( currentFeature, processedFeatures, &vWriter, dissolve, dissolveGeometry, bufferDistance, bufferDistanceField );
777771
++processedFeatures;
778772
}
779773

@@ -804,7 +798,7 @@ bool QgsGeometryAnalyzer::buffer( QgsVectorLayer* layer, const QString& shapefil
804798
{
805799
break;
806800
}
807-
bufferFeature( currentFeature, processedFeatures, &vWriter, dissolve, *dissolveGeometry, bufferDistance, bufferDistanceField );
801+
bufferFeature( currentFeature, processedFeatures, &vWriter, dissolve, dissolveGeometry, bufferDistance, bufferDistanceField );
808802
++processedFeatures;
809803
}
810804
if ( p )
@@ -816,13 +810,12 @@ bool QgsGeometryAnalyzer::buffer( QgsVectorLayer* layer, const QString& shapefil
816810
if ( dissolve )
817811
{
818812
QgsFeature dissolveFeature;
819-
if ( !dissolveGeometry )
813+
if ( dissolveGeometry.isEmpty() )
820814
{
821815
QgsDebugMsg( "no dissolved geometry - should not happen" );
822816
return false;
823817
}
824-
dissolveFeature.setGeometry( *dissolveGeometry );
825-
delete dissolveGeometry;
818+
dissolveFeature.setGeometry( dissolveGeometry );
826819
vWriter.addFeature( dissolveFeature );
827820
}
828821
return true;
@@ -977,7 +970,7 @@ bool QgsGeometryAnalyzer::eventLayer( QgsVectorLayer* lineLayer, QgsVectorLayer*
977970
if ( !lrsGeom.isEmpty() )
978971
{
979972
++nOutputFeatures;
980-
addEventLayerFeature( fet, &lrsGeom, featureIdIt->geometry(), fileWriter, memoryProviderFeatures, offsetField, offsetScale, forceSingleGeometry );
973+
addEventLayerFeature( fet, lrsGeom, featureIdIt->geometry(), fileWriter, memoryProviderFeatures, offsetField, offsetScale, forceSingleGeometry );
981974
}
982975
}
983976
if ( nOutputFeatures < 1 )
@@ -999,39 +992,41 @@ bool QgsGeometryAnalyzer::eventLayer( QgsVectorLayer* lineLayer, QgsVectorLayer*
999992
return true;
1000993
}
1001994

1002-
void QgsGeometryAnalyzer::addEventLayerFeature( QgsFeature& feature, QgsGeometry* geom, const QgsGeometry& lineGeom, QgsVectorFileWriter* fileWriter, QgsFeatureList& memoryFeatures,
995+
void QgsGeometryAnalyzer::addEventLayerFeature( QgsFeature& feature, const QgsGeometry& geom, const QgsGeometry& lineGeom, QgsVectorFileWriter* fileWriter, QgsFeatureList& memoryFeatures,
1003996
int offsetField, double offsetScale, bool forceSingleType )
1004997
{
1005-
if ( !geom )
998+
if ( geom.isEmpty() )
1006999
{
10071000
return;
10081001
}
10091002

10101003
QList<QgsGeometry> geomList;
10111004
if ( forceSingleType )
10121005
{
1013-
geomList = geom->asGeometryCollection();
1006+
geomList = geom.asGeometryCollection();
10141007
}
10151008
else
10161009
{
1017-
geomList.push_back( *geom );
1010+
geomList.push_back( geom );
10181011
}
10191012

10201013
QList<QgsGeometry>::iterator geomIt = geomList.begin();
10211014
for ( ; geomIt != geomList.end(); ++geomIt )
10221015
{
10231016
//consider offset
1017+
QgsGeometry newGeom = *geomIt;
10241018
if ( offsetField >= 0 )
10251019
{
10261020
double offsetVal = feature.attribute( offsetField ).toDouble();
10271021
offsetVal *= offsetScale;
1028-
if ( !createOffsetGeometry( &( *geomIt ), lineGeom, offsetVal ) )
1022+
newGeom = createOffsetGeometry( *geomIt, lineGeom, offsetVal );
1023+
if ( newGeom.isEmpty() )
10291024
{
10301025
continue;
10311026
}
10321027
}
10331028

1034-
feature.setGeometry( *geomIt );
1029+
feature.setGeometry( newGeom );
10351030
if ( fileWriter )
10361031
{
10371032
fileWriter->addFeature( feature );
@@ -1041,57 +1036,52 @@ void QgsGeometryAnalyzer::addEventLayerFeature( QgsFeature& feature, QgsGeometry
10411036
memoryFeatures << feature;
10421037
}
10431038
}
1044-
1045-
if ( forceSingleType )
1046-
{
1047-
delete geom;
1048-
}
10491039
}
10501040

1051-
bool QgsGeometryAnalyzer::createOffsetGeometry( QgsGeometry* geom, const QgsGeometry& lineGeom, double offset )
1041+
QgsGeometry QgsGeometryAnalyzer::createOffsetGeometry( const QgsGeometry& geom, const QgsGeometry& lineGeom, double offset )
10521042
{
10531043
if ( !geom || lineGeom.isEmpty() )
10541044
{
1055-
return false;
1045+
return QgsGeometry();
10561046
}
10571047

10581048
QList<QgsGeometry> inputGeomList;
10591049

1060-
if ( geom->isMultipart() )
1050+
if ( geom.isMultipart() )
10611051
{
1062-
inputGeomList = geom->asGeometryCollection();
1052+
inputGeomList = geom.asGeometryCollection();
10631053
}
10641054
else
10651055
{
1066-
inputGeomList.push_back( *geom );
1056+
inputGeomList.push_back( geom );
10671057
}
10681058

10691059
QList<GEOSGeometry*> outputGeomList;
10701060
QList<QgsGeometry>::const_iterator inputGeomIt = inputGeomList.constBegin();
10711061
GEOSContextHandle_t geosctxt = QgsGeometry::getGEOSHandler();
10721062
for ( ; inputGeomIt != inputGeomList.constEnd(); ++inputGeomIt )
10731063
{
1074-
if ( geom->type() == QgsWkbTypes::LineGeometry )
1064+
if ( geom.type() == QgsWkbTypes::LineGeometry )
10751065
{
10761066
//geos 3.3 needed for line offsets
10771067
#if defined(GEOS_VERSION_MAJOR) && defined(GEOS_VERSION_MINOR) && \
10781068
((GEOS_VERSION_MAJOR>3) || ((GEOS_VERSION_MAJOR==3) && (GEOS_VERSION_MINOR>=3)))
10791069
GEOSGeometry* offsetGeom = GEOSOffsetCurve_r( geosctxt, ( *inputGeomIt ).asGeos(), -offset, 8 /*quadSegments*/, 0 /*joinStyle*/, 5.0 /*mitreLimit*/ );
10801070
if ( !offsetGeom || !GEOSisValid_r( geosctxt, offsetGeom ) )
10811071
{
1082-
return false;
1072+
return QgsGeometry();
10831073
}
10841074
if ( !GEOSisValid_r( geosctxt, offsetGeom ) || GEOSGeomTypeId_r( geosctxt, offsetGeom ) != GEOS_LINESTRING || GEOSGeomGetNumPoints_r( geosctxt, offsetGeom ) < 1 )
10851075
{
10861076
GEOSGeom_destroy_r( geosctxt, offsetGeom );
1087-
return false;
1077+
return QgsGeometry();
10881078
}
10891079
outputGeomList.push_back( offsetGeom );
10901080
#else
10911081
outputGeomList.push_back( GEOSGeom_clone_r( geosctxt, ( *inputGeomIt )->asGeos() ) );
10921082
#endif
10931083
}
1094-
else if ( geom->type() == QgsWkbTypes::PointGeometry )
1084+
else if ( geom.type() == QgsWkbTypes::PointGeometry )
10951085
{
10961086
QgsPoint p = ( *inputGeomIt ).asPoint();
10971087
p = createPointOffset( p.x(), p.y(), offset, lineGeom );
@@ -1103,12 +1093,13 @@ bool QgsGeometryAnalyzer::createOffsetGeometry( QgsGeometry* geom, const QgsGeom
11031093
}
11041094
}
11051095

1106-
if ( !geom->isMultipart() )
1096+
QgsGeometry outGeometry;
1097+
if ( !geom.isMultipart() )
11071098
{
11081099
GEOSGeometry* outputGeom = outputGeomList.at( 0 );
11091100
if ( outputGeom )
11101101
{
1111-
geom->fromGeos( outputGeom );
1102+
outGeometry.fromGeos( outputGeom );
11121103
}
11131104
}
11141105
else
@@ -1119,18 +1110,18 @@ bool QgsGeometryAnalyzer::createOffsetGeometry( QgsGeometry* geom, const QgsGeom
11191110
geomArray[i] = outputGeomList.at( i );
11201111
}
11211112
GEOSGeometry* collection = nullptr;
1122-
if ( geom->type() == QgsWkbTypes::PointGeometry )
1113+
if ( geom.type() == QgsWkbTypes::PointGeometry )
11231114
{
11241115
collection = GEOSGeom_createCollection_r( geosctxt, GEOS_MULTIPOINT, geomArray, outputGeomList.size() );
11251116
}
1126-
else if ( geom->type() == QgsWkbTypes::LineGeometry )
1117+
else if ( geom.type() == QgsWkbTypes::LineGeometry )
11271118
{
11281119
collection = GEOSGeom_createCollection_r( geosctxt, GEOS_MULTILINESTRING, geomArray, outputGeomList.size() );
11291120
}
1130-
geom->fromGeos( collection );
1121+
outGeometry.fromGeos( collection );
11311122
delete[] geomArray;
11321123
}
1133-
return true;
1124+
return outGeometry;
11341125
}
11351126

11361127
QgsPoint QgsGeometryAnalyzer::createPointOffset( double x, double y, double dist, const QgsGeometry& lineGeom ) const

‎src/analysis/vector/qgsgeometryanalyzer.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class ANALYSIS_EXPORT QgsGeometryAnalyzer
128128
private:
129129

130130
QList<double> simpleMeasure( QgsGeometry& geometry );
131-
double perimeterMeasure( QgsGeometry* geometry, QgsDistanceArea& measure );
131+
double perimeterMeasure( const QgsGeometry& geometry, QgsDistanceArea& measure );
132132
/** Helper function to simplify an individual feature*/
133133
void simplifyFeature( QgsFeature& f, QgsVectorFileWriter* vfw, double tolerance );
134134
/** Helper function to get the cetroid of an individual feature*/
@@ -139,16 +139,16 @@ class ANALYSIS_EXPORT QgsGeometryAnalyzer
139139
/** Helper function to get the convex hull of feature(s)*/
140140
void convexFeature( QgsFeature& f, int nProcessedFeatures, QgsGeometry& dissolveGeometry );
141141
/** Helper function to dissolve feature(s)*/
142-
void dissolveFeature( QgsFeature& f, int nProcessedFeatures, QgsGeometry** dissolveGeometry );
142+
QgsGeometry dissolveFeature( const QgsFeature& f, const QgsGeometry& dissolveInto );
143143

144144
//helper functions for event layer
145-
void addEventLayerFeature( QgsFeature& feature, QgsGeometry* geom, const QgsGeometry& lineGeom, QgsVectorFileWriter* fileWriter, QgsFeatureList& memoryFeatures, int offsetField = -1, double offsetScale = 1.0,
145+
void addEventLayerFeature( QgsFeature& feature, const QgsGeometry& geom, const QgsGeometry& lineGeom, QgsVectorFileWriter* fileWriter, QgsFeatureList& memoryFeatures, int offsetField = -1, double offsetScale = 1.0,
146146
bool forceSingleType = false );
147147
/** Create geometry offset relative to line geometry.
148148
@param geom the geometry to modify
149149
@param lineGeom the line geometry to which the feature is referenced
150150
@param offset the offset value in layer unit. Negative values mean offset towards left, positive values offset to the right side*/
151-
bool createOffsetGeometry( QgsGeometry* geom, const QgsGeometry& lineGeom, double offset );
151+
QgsGeometry createOffsetGeometry( const QgsGeometry& geom, const QgsGeometry& lineGeom, double offset );
152152
QgsPoint createPointOffset( double x, double y, double dist, const QgsGeometry& lineGeom ) const;
153153
QgsConstWkbPtr locateBetweenWkbString( QgsConstWkbPtr ptr, QgsMultiPolyline& result, double fromMeasure, double toMeasure );
154154
QgsConstWkbPtr locateAlongWkbString( QgsConstWkbPtr ptr, QgsMultiPoint& result, double measure );

0 commit comments

Comments
 (0)
Please sign in to comment.