Skip to content

Commit

Permalink
Use vertex iterator
Browse files Browse the repository at this point in the history
  • Loading branch information
nirvn committed Nov 13, 2017
1 parent 7cb15c0 commit 66b27dc
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 24 deletions.
3 changes: 3 additions & 0 deletions python/plugins/processing/algs/qgis/ExtractSpecificNodes.py
Expand Up @@ -66,6 +66,9 @@ def name(self):
def displayName(self):
return self.tr('Extract specific nodes')

def tags(self):
return self.tr('points,vertex,vertices').split(',')

def processAlgorithm(self, parameters, context, feedback):
source = self.parameterAsSource(parameters, self.INPUT, context)
fields = source.fields()
Expand Down
48 changes: 24 additions & 24 deletions src/analysis/processing/qgsalgorithmextractnodes.cpp
Expand Up @@ -17,6 +17,9 @@

#include "qgsalgorithmextractnodes.h"

#include "qgsabstractgeometry.h"
#include "qgsgeometryutils.h"

///@cond PRIVATE

QString QgsExtractNodesAlgorithm::name() const
Expand Down Expand Up @@ -76,19 +79,19 @@ QVariantMap QgsExtractNodesAlgorithm::processAlgorithm( const QVariantMap &param

QgsFields outputFields = featureSource->fields();
outputFields.append( QgsField( QStringLiteral( "node_index" ), QVariant::Int, QString(), 10, 0 ) );
outputFields.append( QgsField( QStringLiteral( "distance" ), QVariant::Double, QString(), 20, 6 ) );
outputFields.append( QgsField( QStringLiteral( "angle" ), QVariant::Double, QString(), 20, 6 ) );
outputFields.append( QgsField( QStringLiteral( "distance" ), QVariant::Double, QString(), 20, 14 ) );
outputFields.append( QgsField( QStringLiteral( "angle" ), QVariant::Double, QString(), 20, 14 ) );

QString dest;
std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral( "OUTPUT" ), context, dest, outputFields, outputWkbType, featureSource->sourceCrs() ) );
if ( !sink )
return QVariantMap();

double step = featureSource->featureCount() > 0 ? 100.0 / featureSource->featureCount() : 1;
QgsFeatureIterator it = featureSource->getFeatures( QgsFeatureRequest() );
QgsFeatureIterator fi = featureSource->getFeatures( QgsFeatureRequest() );
QgsFeature f;
int i = -1;
while ( it.nextFeature( f ) )
while ( fi.nextFeature( f ) )
{
i++;
if ( feedback->isCanceled() )
Expand All @@ -103,27 +106,24 @@ QVariantMap QgsExtractNodesAlgorithm::processAlgorithm( const QVariantMap &param
}
else
{
const QgsCoordinateSequence sequence = inputGeom.constGet()->coordinateSequence();
for ( const QgsRingSequence &part : sequence )
QgsAbstractGeometry::vertex_iterator vi = inputGeom.constGet()->vertices_begin();
QgsPoint vertex;
int vertexPos = 0;
while ( vi != inputGeom.constGet()->vertices_end() )
{
int vertexPos = 0;
for ( const QgsPointSequence &ring : part )
{
for ( int j = 0; j < ring.count(); ++ j )
{
double distance = inputGeom.distanceToVertex( vertexPos );
double angle = inputGeom.angleAtVertex( vertexPos ) * 180 / M_PI_2;
QgsAttributes attrs = f.attributes();
attrs << vertexPos
<< distance
<< angle;
QgsFeature outputFeature = QgsFeature();
outputFeature.setAttributes( attrs );
outputFeature.setGeometry( QgsGeometry( ring.at( j ).clone() ) );
sink->addFeature( outputFeature, QgsFeatureSink::FastInsert );
vertexPos++;
}
}
QgsVertexId vertexId = vi.vertexId();
double distance = QgsGeometryUtils::distanceToVertex( *( inputGeom.constGet() ), vertexId );
double angle = inputGeom.constGet()->vertexAngle( vertexId ) * 180 / M_PI;
QgsAttributes attrs = f.attributes();
attrs << vertexPos
<< distance
<< angle;
QgsFeature outputFeature = QgsFeature();
outputFeature.setAttributes( attrs );
outputFeature.setGeometry( QgsGeometry( ( *vi ).clone() ) );
sink->addFeature( outputFeature, QgsFeatureSink::FastInsert );
vi++;
vertexPos++;
}
}
feedback->setProgress( i * step );
Expand Down

0 comments on commit 66b27dc

Please sign in to comment.