Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsalgorithmpoleofinaccessibility.cpp 3 : : --------------------- 4 : : begin : December 2019 5 : : copyright : (C) 2019 by Alexander Bruy 6 : : email : alexander dot bruy at gmail dot com 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #include "qgsalgorithmpoleofinaccessibility.h" 19 : : #include "qgsapplication.h" 20 : : 21 : : ///@cond PRIVATE 22 : : 23 : 0 : QString QgsPoleOfInaccessibilityAlgorithm::name() const 24 : : { 25 : 0 : return QStringLiteral( "poleofinaccessibility" ); 26 : : } 27 : : 28 : 0 : QString QgsPoleOfInaccessibilityAlgorithm::displayName() const 29 : : { 30 : 0 : return QObject::tr( "Pole of inaccessibility" ); 31 : : } 32 : : 33 : 0 : QStringList QgsPoleOfInaccessibilityAlgorithm::tags() const 34 : : { 35 : 0 : return QObject::tr( "furthest,point,distant,extreme,maximum,centroid,center,centre" ).split( ',' ); 36 : 0 : } 37 : : 38 : 0 : QString QgsPoleOfInaccessibilityAlgorithm::group() const 39 : : { 40 : 0 : return QObject::tr( "Vector geometry" ); 41 : : } 42 : : 43 : 0 : QString QgsPoleOfInaccessibilityAlgorithm::groupId() const 44 : : { 45 : 0 : return QStringLiteral( "vectorgeometry" ); 46 : : } 47 : : 48 : 0 : QString QgsPoleOfInaccessibilityAlgorithm::shortHelpString() const 49 : : { 50 : 0 : return QObject::tr( "This algorithm calculates the pole of inaccessibility for a polygon layer, which is the most " 51 : : "distant internal point from the boundary of the surface. This algorithm uses the 'polylabel' " 52 : : "algorithm (Vladimir Agafonkin, 2016), which is an iterative approach guaranteed to find the " 53 : : "true pole of inaccessibility within a specified tolerance (in layer units). More precise " 54 : : "tolerances require more iterations and will take longer to calculate." ) 55 : 0 : + QStringLiteral( "\n\n" ) 56 : 0 : + QObject::tr( "The distance from the calculated pole to the polygon boundary will be stored as a new " 57 : : "attribute in the output layer." ); 58 : 0 : } 59 : : 60 : 0 : QString QgsPoleOfInaccessibilityAlgorithm::svgIconPath() const 61 : : { 62 : 0 : return QgsApplication::iconPath( QStringLiteral( "/algorithms/mAlgorithmCentroids.svg" ) ); 63 : 0 : } 64 : : 65 : 0 : QIcon QgsPoleOfInaccessibilityAlgorithm::icon() const 66 : : { 67 : 0 : return QgsApplication::getThemeIcon( QStringLiteral( "/algorithms/mAlgorithmCentroids.svg" ) ); 68 : 0 : } 69 : : 70 : 0 : QString QgsPoleOfInaccessibilityAlgorithm::outputName() const 71 : : { 72 : 0 : return QObject::tr( "Point" ); 73 : : } 74 : : 75 : 0 : QList<int> QgsPoleOfInaccessibilityAlgorithm::inputLayerTypes() const 76 : : { 77 : 0 : return QList<int>() << QgsProcessing::TypeVectorPolygon; 78 : 0 : } 79 : : 80 : 0 : QgsProcessing::SourceType QgsPoleOfInaccessibilityAlgorithm::outputLayerType() const 81 : : { 82 : 0 : return QgsProcessing::TypeVectorPoint; 83 : : } 84 : : 85 : 0 : QgsWkbTypes::Type QgsPoleOfInaccessibilityAlgorithm::outputWkbType( QgsWkbTypes::Type inputWkbType ) const 86 : : { 87 : : Q_UNUSED( inputWkbType ); 88 : : 89 : 0 : return QgsWkbTypes::Point; 90 : : } 91 : : 92 : 0 : QgsFields QgsPoleOfInaccessibilityAlgorithm::outputFields( const QgsFields &inputFields ) const 93 : : { 94 : 0 : QgsFields outputFields = inputFields; 95 : 0 : outputFields.append( QgsField( QStringLiteral( "dist_pole" ), QVariant::Double ) ); 96 : : 97 : 0 : return outputFields; 98 : 0 : } 99 : : 100 : 0 : QgsPoleOfInaccessibilityAlgorithm *QgsPoleOfInaccessibilityAlgorithm::createInstance() const 101 : : { 102 : 0 : return new QgsPoleOfInaccessibilityAlgorithm(); 103 : 0 : } 104 : : 105 : 0 : void QgsPoleOfInaccessibilityAlgorithm::initParameters( const QVariantMap & ) 106 : : { 107 : 0 : auto toleranceParam = std::make_unique < QgsProcessingParameterDistance >( QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), 1.0, QStringLiteral( "INPUT" ), 0.0 ); 108 : 0 : toleranceParam->setIsDynamic( true ); 109 : 0 : toleranceParam->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "Tolerance" ), QObject::tr( "Tolerance" ), QgsPropertyDefinition::Double ) ); 110 : 0 : toleranceParam->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) ); 111 : 0 : addParameter( toleranceParam.release() ); 112 : 0 : } 113 : : 114 : 0 : bool QgsPoleOfInaccessibilityAlgorithm::prepareAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback * ) 115 : : { 116 : 0 : mTolerance = parameterAsDouble( parameters, QStringLiteral( "TOLERANCE" ), context ); 117 : 0 : mDynamicTolerance = QgsProcessingParameters::isDynamic( parameters, QStringLiteral( "TOLERANCE" ) ); 118 : 0 : if ( mDynamicTolerance ) 119 : 0 : mToleranceProperty = parameters.value( QStringLiteral( "TOLERANCE" ) ).value< QgsProperty >(); 120 : : 121 : 0 : return true; 122 : 0 : } 123 : : 124 : 0 : QgsFeatureList QgsPoleOfInaccessibilityAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback * ) 125 : : { 126 : 0 : QgsFeature outFeature = feature; 127 : 0 : if ( outFeature.hasGeometry() ) 128 : : { 129 : 0 : double tolerance = mTolerance; 130 : 0 : if ( mDynamicTolerance ) 131 : 0 : tolerance = mToleranceProperty.valueAsDouble( context.expressionContext(), tolerance ); 132 : : 133 : : double distance; 134 : 0 : QgsGeometry outputGeom = outFeature.geometry().poleOfInaccessibility( tolerance, &distance ); 135 : 0 : if ( outputGeom.isNull() ) 136 : : { 137 : 0 : throw QgsProcessingException( QObject::tr( "Error calculating pole of inaccessibility" ) ); 138 : : } 139 : 0 : QgsAttributes attrs = outFeature.attributes(); 140 : 0 : attrs.append( distance ); 141 : 0 : outFeature.setAttributes( attrs ); 142 : 0 : outFeature.setGeometry( outputGeom ); 143 : 0 : } 144 : : else 145 : : { 146 : 0 : QgsAttributes attrs = outFeature.attributes(); 147 : 0 : attrs.append( QVariant() ); 148 : 0 : outFeature.setAttributes( attrs ); 149 : 0 : } 150 : : 151 : 0 : return QgsFeatureList() << outFeature; 152 : 0 : } 153 : : 154 : : ///@endcond