bool QgsGeometryAnalyzer::centroids( QgsVectorLayer* layer, const QString& shapefileName, bool onlySelectedFeatures, QProgressDialog* p ) { if ( !layer ) { QgsDebugMsg( "No layer passed to centroids" ); return false; } QgsVectorDataProvider* dp = layer->dataProvider(); if ( !dp ) { QgsDebugMsg( "No data provider for layer passed to centroids" ); return false; } QgsWkbTypes::Type outputType = QgsWkbTypes::Point; QgsCoordinateReferenceSystem crs = layer->crs(); QgsVectorFileWriter vWriter( shapefileName, dp->encoding(), layer->fields(), outputType, crs ); QgsFeature currentFeature; //take only selection if ( onlySelectedFeatures ) { //use QgsVectorLayer::featureAtId const QgsFeatureIds selection = layer->selectedFeaturesIds(); if ( p ) { p->setMaximum( selection.size() ); } int processedFeatures = 0; QgsFeatureIds::const_iterator it = selection.constBegin(); for ( ; it != selection.constEnd(); ++it ) { if ( p ) { p->setValue( processedFeatures ); } if ( p && p->wasCanceled() ) { break; } if ( !layer->getFeatures( QgsFeatureRequest().setFilterFid( *it ) ).nextFeature( currentFeature ) ) { continue; } centroidFeature( currentFeature, &vWriter ); ++processedFeatures; } if ( p ) { p->setValue( selection.size() ); } } //take all features else { QgsFeatureIterator fit = layer->getFeatures( QgsFeatureRequest().setSubsetOfAttributes( QgsAttributeList() ) ); int featureCount = layer->featureCount(); if ( p ) { p->setMaximum( featureCount ); } int processedFeatures = 0; while ( fit.nextFeature( currentFeature ) ) { if ( p ) { p->setValue( processedFeatures ); } if ( p && p->wasCanceled() ) { break; } centroidFeature( currentFeature, &vWriter ); ++processedFeatures; } if ( p ) { p->setValue( featureCount ); } } return true; }
bool QgsGeometryAnalyzer::centroids( QgsVectorLayer* layer, const QString& shapefileName, bool onlySelectedFeatures, QProgressDialog* p ) { if ( !layer ) { return false; } QgsVectorDataProvider* dp = layer->dataProvider(); if ( !dp ) { return false; } QGis::WkbType outputType = QGis::WKBPoint; const QgsCoordinateReferenceSystem crs = layer->crs(); QgsVectorFileWriter vWriter( shapefileName, dp->encoding(), dp->fields(), outputType, &crs ); QgsFeature currentFeature; //take only selection if ( onlySelectedFeatures ) { //use QgsVectorLayer::featureAtId const QgsFeatureIds selection = layer->selectedFeaturesIds(); if ( p ) { p->setMaximum( selection.size() ); } int processedFeatures = 0; QgsFeatureIds::const_iterator it = selection.constBegin(); for ( ; it != selection.constEnd(); ++it ) { if ( p ) { p->setValue( processedFeatures ); } if ( p && p->wasCanceled() ) { break; } if ( !layer->featureAtId( *it, currentFeature, true, true ) ) { continue; } centroidFeature( currentFeature, &vWriter ); ++processedFeatures; } if ( p ) { p->setValue( selection.size() ); } } //take all features else { layer->select( layer->pendingAllAttributesList(), QgsRectangle(), true, false ); int featureCount = layer->featureCount(); if ( p ) { p->setMaximum( featureCount ); } int processedFeatures = 0; while ( layer->nextFeature( currentFeature ) ) { if ( p ) { p->setValue( processedFeatures ); } if ( p && p->wasCanceled() ) { break; } centroidFeature( currentFeature, &vWriter ); ++processedFeatures; } if ( p ) { p->setValue( featureCount ); } } return true; }