QGIS API Documentation 3.41.0-Master (57ec4277f5e)
Loading...
Searching...
No Matches
qgsalgorithmtransform.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsalgorithmtransform.cpp
3 ---------------------
4 begin : April 2017
5 copyright : (C) 2017 by Nyall Dawson
6 email : nyall dot dawson 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
19
21
22
23void QgsTransformAlgorithm::initParameters( const QVariantMap & )
24{
25 addParameter( new QgsProcessingParameterCrs( QStringLiteral( "TARGET_CRS" ), QObject::tr( "Target CRS" ), QStringLiteral( "EPSG:4326" ) ) );
26
27 // Convert curves to straight segments
28 auto convertCurvesParam = std::make_unique<QgsProcessingParameterBoolean>( QStringLiteral( "CONVERT_CURVED_GEOMETRIES" ), QObject::tr( "Convert curved geometries to straight segments" ), false );
29 convertCurvesParam->setHelp( QObject::tr( "If checked, curved geometries will be converted to straight segments. Otherwise, they will be kept as curves. This can fix distortion issues." ) );
30 addParameter( convertCurvesParam.release() );
31
32 // Optional coordinate operation
33 auto crsOpParam = std::make_unique<QgsProcessingParameterCoordinateOperation>( QStringLiteral( "OPERATION" ), QObject::tr( "Coordinate operation" ), QVariant(), QStringLiteral( "INPUT" ), QStringLiteral( "TARGET_CRS" ), QVariant(), QVariant(), true );
34 crsOpParam->setFlags( crsOpParam->flags() | Qgis::ProcessingParameterFlag::Advanced );
35 addParameter( crsOpParam.release() );
36}
37
38QgsCoordinateReferenceSystem QgsTransformAlgorithm::outputCrs( const QgsCoordinateReferenceSystem & ) const
39{
40 return mDestCrs;
41}
42
43QString QgsTransformAlgorithm::outputName() const
44{
45 return QObject::tr( "Reprojected" );
46}
47
48Qgis::ProcessingFeatureSourceFlags QgsTransformAlgorithm::sourceFlags() const
49{
51}
52
53QString QgsTransformAlgorithm::name() const
54{
55 return QStringLiteral( "reprojectlayer" );
56}
57
58QString QgsTransformAlgorithm::displayName() const
59{
60 return QObject::tr( "Reproject layer" );
61}
62
63QStringList QgsTransformAlgorithm::tags() const
64{
65 return QObject::tr( "transform,reprojection,crs,srs,warp" ).split( ',' );
66}
67
68QString QgsTransformAlgorithm::group() const
69{
70 return QObject::tr( "Vector general" );
71}
72
73QString QgsTransformAlgorithm::groupId() const
74{
75 return QStringLiteral( "vectorgeneral" );
76}
77
78QString QgsTransformAlgorithm::shortHelpString() const
79{
80 return QObject::tr( "This algorithm reprojects a vector layer. It creates a new layer with the same features "
81 "as the input one, but with geometries reprojected to a new CRS.\n\n"
82 "Attributes are not modified by this algorithm." );
83}
84
85QgsTransformAlgorithm *QgsTransformAlgorithm::createInstance() const
86{
87 return new QgsTransformAlgorithm();
88}
89
90bool QgsTransformAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
91{
92 prepareSource( parameters, context );
93 mDestCrs = parameterAsCrs( parameters, QStringLiteral( "TARGET_CRS" ), context );
94 mTransformContext = context.transformContext();
95 mConvertCurveToSegments = parameterAsBoolean( parameters, QStringLiteral( "CONVERT_CURVED_GEOMETRIES" ), context );
96 mCoordOp = parameterAsString( parameters, QStringLiteral( "OPERATION" ), context );
97 return true;
98}
99
100QgsFeatureList QgsTransformAlgorithm::processFeature( const QgsFeature &f, QgsProcessingContext &, QgsProcessingFeedback *feedback )
101{
102 QgsFeature feature = f;
103 if ( !mCreatedTransform )
104 {
105 mCreatedTransform = true;
106 if ( !mCoordOp.isEmpty() )
107 mTransformContext.addCoordinateOperation( sourceCrs(), mDestCrs, mCoordOp, false );
108 mTransform = QgsCoordinateTransform( sourceCrs(), mDestCrs, mTransformContext );
109
110 mTransform.disableFallbackOperationHandler( true );
111 }
112
113 if ( feature.hasGeometry() )
114 {
115 QgsGeometry g = feature.geometry();
116
117 if ( !mTransform.isShortCircuited() && mConvertCurveToSegments )
118 {
119 // convert to straight segments to avoid issues with distorted curves
121 }
122 try
123 {
124 if ( g.transform( mTransform ) == Qgis::GeometryOperationResult::Success )
125 {
126 feature.setGeometry( g );
127 }
128 else
129 {
130 feature.clearGeometry();
131 }
132
133 if ( !mWarnedAboutFallbackTransform && mTransform.fallbackOperationOccurred() )
134 {
135 feedback->reportError( QObject::tr( "An alternative, ballpark-only transform was used when transforming coordinates for one or more features. "
136 "(Possibly an incorrect choice of operation was made for transformations between these reference systems - check "
137 "that the selected operation is valid for the full extent of the input layer.)" ) );
138 mWarnedAboutFallbackTransform = true; // only warn once to avoid flooding the log
139 }
140 }
141 catch ( QgsCsException & )
142 {
143 if ( feedback )
144 feedback->reportError( QObject::tr( "Encountered a transform error when reprojecting feature with id %1." ).arg( f.id() ) );
145 feature.clearGeometry();
146 }
147 }
148 return QgsFeatureList() << feature;
149}
150
@ Success
Operation succeeded.
@ SkipGeometryValidityChecks
Invalid geometry checks should always be skipped. This flag can be useful for algorithms which always...
@ Advanced
Parameter is an advanced parameter which should be hidden from users by default.
QFlags< ProcessingFeatureSourceFlag > ProcessingFeatureSourceFlags
Flags which control how QgsProcessingFeatureSource fetches features.
Definition qgis.h:3507
This class represents a coordinate reference system (CRS).
Class for doing transforms between two map coordinate systems.
Custom exception class for Coordinate Reference System related exceptions.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:58
QgsFeatureId id
Definition qgsfeature.h:66
QgsGeometry geometry
Definition qgsfeature.h:69
void clearGeometry()
Removes any geometry associated with the feature.
bool hasGeometry() const
Returns true if the feature has an associated geometry.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
A geometry is the spatial representation of a feature.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
void convertToStraightSegment(double tolerance=M_PI/180., QgsAbstractGeometry::SegmentationToleranceType toleranceType=QgsAbstractGeometry::MaximumAngle)
Converts the geometry to straight line segments, if it is a curved geometry type.
Contains information about the context in which a processing algorithm is executed.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
Base class for providing feedback from a processing algorithm.
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
A coordinate reference system parameter for processing algorithms.
QList< QgsFeature > QgsFeatureList