Skip to content
Permalink
Browse files

Add native polygonstolines algorithm

  • Loading branch information
m-kuhn committed Jan 18, 2019
1 parent 8709ab6 commit 4c8af20b51c988421ecf2c239fd2e3b9a5b95dc3

This file was deleted.

@@ -98,7 +98,6 @@
from .PointsToPaths import PointsToPaths
from .PoleOfInaccessibility import PoleOfInaccessibility
from .Polygonize import Polygonize
from .PolygonsToLines import PolygonsToLines
from .PostGISExecuteSQL import PostGISExecuteSQL
from .PostGISExecuteAndLoadSQL import PostGISExecuteAndLoadSQL
from .RandomExtract import RandomExtract
@@ -210,7 +209,6 @@ def getAlgs(self):
PointsToPaths(),
PoleOfInaccessibility(),
Polygonize(),
PolygonsToLines(),
PostGISExecuteSQL(),
PostGISExecuteAndLoadSQL(),
RandomExtract(),
@@ -73,6 +73,7 @@ SET(QGIS_ANALYSIS_SRCS
processing/qgsalgorithmorientedminimumboundingbox.cpp
processing/qgsalgorithmpackage.cpp
processing/qgsalgorithmarrayoffsetlines.cpp
processing/qgsalgorithmpolygonstolines.cpp
processing/qgsalgorithmpointonsurface.cpp
processing/qgsalgorithmprojectpointcartesian.cpp
processing/qgsalgorithmpromotetomultipart.cpp
@@ -0,0 +1,150 @@
/***************************************************************************
qgsalgorithmpolygonstolines.cpp
---------------------
begin : January 2019
copyright : (C) 2019 by Matthias Kuhn
email : matthias@opengis.ch
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include "qgsalgorithmpolygonstolines.h"
#include "qgsgeometrycollection.h"
#include "qgscurvepolygon.h"
#include "qgscurve.h"
#include "qgsmultilinestring.h"

///@cond PRIVATE

QString QgsPolygonsToLinesAlgorithm::name() const
{
return QStringLiteral( "polygonstolines" );
}

QString QgsPolygonsToLinesAlgorithm::displayName() const
{
return QObject::tr( "Polygons to lines" );
}

QStringList QgsPolygonsToLinesAlgorithm::tags() const
{
return QObject::tr( "line,polygon,convert" ).split( ',' );
}

QString QgsPolygonsToLinesAlgorithm::group() const
{
return QObject::tr( "Vector creation" );
}

QString QgsPolygonsToLinesAlgorithm::groupId() const
{
return QStringLiteral( "vectorgeometry" );
}

QString QgsPolygonsToLinesAlgorithm::outputName() const
{
return QObject::tr( "Lines" );
}

QString QgsPolygonsToLinesAlgorithm::shortHelpString() const
{
return QObject::tr( "Converts polygons to lines" );
}

QString QgsPolygonsToLinesAlgorithm::shortDescription() const
{
return QObject::tr( "Converts polygons to lines." );
}

QgsPolygonsToLinesAlgorithm *QgsPolygonsToLinesAlgorithm::createInstance() const
{
return new QgsPolygonsToLinesAlgorithm();
}

QList<int> QgsPolygonsToLinesAlgorithm::inputLayerTypes() const
{
return QList< int >() << QgsProcessing::TypeVectorPolygon;
}

QgsFeatureList QgsPolygonsToLinesAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback * )
{
QgsFeatureList result;
QgsFeature feat = feature;
if ( feat.hasGeometry() )
feat.setGeometry( convertToLines( feat.geometry() ) );

result << feat;
return result;
}

QgsGeometry QgsPolygonsToLinesAlgorithm::convertToLines( const QgsGeometry &geometry ) const
{
auto rings = extractRings( geometry.constGet() );

QgsWkbTypes::Type resultType = outWkbType( geometry.wkbType() );

std::unique_ptr<QgsMultiCurve> lineGeometry;

if ( QgsWkbTypes::flatType( resultType ) == QgsWkbTypes::MultiLineString )
lineGeometry = qgis::make_unique<QgsMultiLineString>();
else
lineGeometry = qgis::make_unique<QgsMultiCurve>();

for ( auto ring : qgis::as_const( rings ) )
lineGeometry->addGeometry( ring );

return QgsGeometry( lineGeometry.release() );
}

QgsWkbTypes::Type QgsPolygonsToLinesAlgorithm::outWkbType( QgsWkbTypes::Type polygonWkbType ) const
{
QgsWkbTypes::Type wkbType = QgsWkbTypes::NoGeometry;

if ( QgsWkbTypes::singleType( QgsWkbTypes::flatType( polygonWkbType ) ) == QgsWkbTypes::Polygon )
wkbType = QgsWkbTypes::MultiLineString;
else if ( QgsWkbTypes::singleType( QgsWkbTypes::flatType( polygonWkbType ) ) == QgsWkbTypes::CurvePolygon )
wkbType = QgsWkbTypes::MultiCurve;

if ( QgsWkbTypes::hasM( polygonWkbType ) )
wkbType = QgsWkbTypes::addM( wkbType );
if ( QgsWkbTypes::hasZ( polygonWkbType ) )
wkbType = QgsWkbTypes::addZ( wkbType );

return wkbType;
}

QList<QgsCurve *> QgsPolygonsToLinesAlgorithm::extractRings( const QgsAbstractGeometry *geom ) const
{
QList<QgsCurve *> rings;

if ( QgsGeometryCollection *collection = qgsgeometry_cast<QgsGeometryCollection *>( geom ) )
{
for ( int i = 0; i < collection->numGeometries(); ++i )
{
rings.append( extractRings( collection->geometryN( i ) ) );
}
}
else if ( QgsCurvePolygon *polygon = qgsgeometry_cast<QgsCurvePolygon *>( geom ) )
{
rings.append( polygon->exteriorRing()->clone() );
for ( int i = 0; i < polygon->numInteriorRings(); ++i )
{
rings.append( polygon->interiorRing( i )->clone() );
}
}

return rings;
}



///@endcond


@@ -0,0 +1,63 @@
/***************************************************************************
qgsalgorithmpolygontolines.h
---------------------
begin : January 2019
copyright : (C) 2019 by Matthias Kuhn
email : matthias@opengis.ch
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#ifndef QGSALGORITHMPOLYGONSTOLINES_H
#define QGSALGORITHMPOLYGONSTOLINES_H

#define SIP_NO_FILE

#include "qgis.h"
#include "qgsprocessingalgorithm.h"

///@cond PRIVATE

/**
* Native convert polygons to lines algorithm
*/
class QgsPolygonsToLinesAlgorithm : public QgsProcessingFeatureBasedAlgorithm
{

public:

QgsPolygonsToLinesAlgorithm() = default;
QString name() const override;
QString displayName() const override;
QStringList tags() const override;
QString group() const override;
QString groupId() const override;
QString shortHelpString() const override;
QString shortDescription() const override;
QgsPolygonsToLinesAlgorithm *createInstance() const override SIP_FACTORY;
QList<int> inputLayerTypes() const override;

protected:
QString outputName() const override;
QgsFeatureList processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;

private:
QgsGeometry convertToLines( const QgsGeometry &geometry ) const;
QList<QgsCurve *> extractRings( const QgsAbstractGeometry *geom ) const;
QgsWkbTypes::Type outWkbType( QgsWkbTypes::Type polygonWkbType ) const;

friend class TestQgsProcessingAlgs;
};

///@endcond PRIVATE

#endif // QGSALGORITHMPOLYGONSTOLINES_H


@@ -105,7 +105,7 @@
#include "qgsalgorithmvectorize.h"
#include "qgsalgorithmwedgebuffers.h"
#include "qgsalgorithmzonalhistogram.h"

#include "qgsalgorithmpolygonstolines.h"

///@cond PRIVATE

@@ -243,6 +243,7 @@ void QgsNativeAlgorithms::loadAlgorithms()
addAlgorithm( new QgsVariableWidthBufferByMAlgorithm() );
addAlgorithm( new QgsWedgeBuffersAlgorithm() );
addAlgorithm( new QgsZonalHistogramAlgorithm() );
addAlgorithm( new QgsPolygonsToLinesAlgorithm() );
}


0 comments on commit 4c8af20

Please sign in to comment.
You can’t perform that action at this time.