@@ -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
11361127QgsPoint QgsGeometryAnalyzer::createPointOffset ( double x, double y, double dist, const QgsGeometry& lineGeom ) const
0 commit comments