void QgsNetworkAnalysisAlgorithmBase::loadPoints( QgsFeatureSource *source, QVector< QgsPointXY > &points, QHash< int, QgsAttributes > &attributes, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) { feedback->pushInfo( QObject::tr( "Loading points…" ) ); QgsFeature feat; int i = 0; int pointId = 1; double step = source->featureCount() > 0 ? 100.0 / source->featureCount() : 0; QgsFeatureIterator features = source->getFeatures( QgsFeatureRequest().setDestinationCrs( mNetwork->sourceCrs(), context.transformContext() ) ); while ( features.nextFeature( feat ) ) { i++; if ( feedback->isCanceled() ) { break; } feedback->setProgress( i * step ); if ( !feat.hasGeometry() ) continue; QgsGeometry geom = feat.geometry(); QgsAbstractGeometry::vertex_iterator it = geom.vertices_begin(); while ( it != geom.vertices_end() ) { points.push_back( QgsPointXY( *it ) ); attributes.insert( pointId, feat.attributes() ); it++; pointId++; } } }
static void buildSnapIndex( QgsFeatureIterator &fi, QgsSpatialIndex &index, QVector<AnchorPoint> &pnts, QgsFeedback *feedback, int &count, int totalCount ) { QgsFeature f; int pntId = 0; while ( fi.nextFeature( f ) ) { if ( feedback->isCanceled() ) break; QgsGeometry g = f.geometry(); for ( auto it = g.vertices_begin(); it != g.vertices_end(); ++it ) { QgsPoint pt = *it; QgsRectangle rect( pt.x(), pt.y(), pt.x(), pt.y() ); QList<QgsFeatureId> ids = index.intersects( rect ); if ( ids.isEmpty() ) { // add to tree and to structure index.insertFeature( pntId, pt.boundingBox() ); AnchorPoint xp; xp.x = pt.x(); xp.y = pt.y(); xp.anchor = -1; pnts.append( xp ); pntId++; } } ++count; feedback->setProgress( 100. * count / totalCount ); } }