37 return QStringLiteral(
"mesh" );
45 QVector<QgsProfileIdentifyResults> res;
46 res.reserve( noLayerResults.size() );
61 , mProfileCurve( request.profileCurve() ? request.profileCurve()->clone() : nullptr )
62 , mSourceCrs( layer->
crs() )
63 , mTargetCrs( request.
crs() )
64 , mTransformContext( request.transformContext() )
65 , mOffset( layer->elevationProperties()->zOffset() )
66 , mScale( layer->elevationProperties()->zScale() )
68 , mStepDistance( request.stepDistance() )
87 if ( !mProfileCurve || mFeedback->isCanceled() )
91 QgsGeometry transformedCurve( mProfileCurve->clone() );
96 transformedCurve.
transform( mLayerToTargetTransform, Qgis::TransformDirection::Reverse );
100 QgsDebugMsg( QStringLiteral(
"Error transforming profile line to mesh CRS" ) );
104 if ( mFeedback->isCanceled() )
107 mResults = std::make_unique< QgsMeshLayerProfileResults >();
108 mResults->mLayer = mLayer;
109 mResults->copyPropertiesFromGenerator(
this );
112 const double curveLength = transformedCurve.
length();
114 if ( !std::isnan( mStepDistance ) )
119 if ( mFeedback->isCanceled() )
124 if ( mFeedback->isCanceled() )
128 const double height = heightAt( point.
x(), point.
y() );
132 point.
transform( mLayerToTargetTransform );
138 mResults->mRawPoints.append(
QgsPoint( point.
x(), point.
y(), height ) );
141 if ( mFeedback->isCanceled() )
145 QgsGeos originalCurveGeos( mProfileCurve.get() );
148 for (
const QgsPoint &pixel : std::as_const( mResults->mRawPoints ) )
150 if ( mFeedback->isCanceled() )
153 const double distance = originalCurveGeos.
lineLocatePoint( pixel, &lastError );
155 if ( !std::isnan( pixel.z() ) )
157 mResults->minZ = std::min( pixel.z(), mResults->minZ );
158 mResults->maxZ = std::max( pixel.z(), mResults->maxZ );
160 mResults->mDistanceToHeightMap.insert( distance, pixel.z() );
168 return mResults.release();
173 return mFeedback.get();
176 double QgsMeshLayerProfileGenerator::heightAt(
double x,
double y )
178 return QgsMeshLayerUtils::interpolateZForPoint( mTriangularMesh, x, y ) * mScale + mOffset;