Skip to content

Commit 6de1a47

Browse files
committed
Merge pull request #2211 from mhugent/transect_sample_extension
Add baseline buffer tolerance and simplification tolerance parameters…
2 parents 6ee1d67 + 6788fba commit 6de1a47

File tree

3 files changed

+60
-9
lines changed

3 files changed

+60
-9
lines changed

python/analysis/vector/qgstransectsample.sip

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ class QgsTransectSample
1818

1919
QgsTransectSample( QgsVectorLayer* strataLayer, QString strataIdAttribute, QString minDistanceAttribute, QString nPointsAttribute,
2020
DistanceUnits minDistUnits, QgsVectorLayer* baselineLayer, bool shareBaseline,
21-
QString baselineStrataId, const QString& outputPointLayer, const QString& outputLineLayer, const QString& usedBaselineLayer, double minTransectLength = 0.0 );
21+
QString baselineStrataId, const QString& outputPointLayer, const QString& outputLineLayer, const QString& usedBaselineLayer,
22+
double minTransectLength = 0.0, double baselineBufferDistance = -1.0, double baselineSimplificationTolerance = -1.0 );
2223
~QgsTransectSample();
2324

2425
int createSample( QProgressDialog* pd );

src/analysis/vector/qgstransectsample.cpp

+47-6
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@
1414

1515
QgsTransectSample::QgsTransectSample( QgsVectorLayer* strataLayer, QString strataIdAttribute, QString minDistanceAttribute, QString nPointsAttribute, DistanceUnits minDistUnits,
1616
QgsVectorLayer* baselineLayer, bool shareBaseline, QString baselineStrataId, const QString& outputPointLayer,
17-
const QString& outputLineLayer, const QString& usedBaselineLayer, double minTransectLength ): mStrataLayer( strataLayer ),
17+
const QString& outputLineLayer, const QString& usedBaselineLayer, double minTransectLength,
18+
double baselineBufferDistance, double baselineSimplificationTolerance ): mStrataLayer( strataLayer ),
1819
mStrataIdAttribute( strataIdAttribute ), mMinDistanceAttribute( minDistanceAttribute ), mNPointsAttribute( nPointsAttribute ), mBaselineLayer( baselineLayer ), mShareBaseline( shareBaseline ),
1920
mBaselineStrataId( baselineStrataId ), mOutputPointLayer( outputPointLayer ), mOutputLineLayer( outputLineLayer ), mUsedBaselineLayer( usedBaselineLayer ),
20-
mMinDistanceUnits( minDistUnits ), mMinTransectLength( minTransectLength )
21+
mMinDistanceUnits( minDistUnits ), mMinTransectLength( minTransectLength ), mBaselineBufferDistance( baselineBufferDistance ), mBaselineSimplificationTolerance( baselineSimplificationTolerance )
2122
{
2223
}
2324

@@ -155,11 +156,10 @@ int QgsTransectSample::createSample( QProgressDialog* pd )
155156
double minDistance = fet.attribute( mMinDistanceAttribute ).toDouble();
156157
double minDistanceLayerUnits = minDistance;
157158
//if minDistance is in meters and the data in degrees, we need to apply a rough conversion for the buffer distance
158-
double bufferDist = minDistance;
159+
double bufferDist = bufferDistance( minDistance );
159160
if ( mMinDistanceUnits == Meters && mStrataLayer->crs().mapUnits() == QGis::DecimalDegrees )
160161
{
161-
bufferDist = minDistance / 111319.9;
162-
minDistanceLayerUnits = bufferDist;
162+
minDistanceLayerUnits = minDistance / 111319.9;
163163
}
164164

165165
QgsGeometry* clippedBaseline = strataGeom->intersection( baselineGeom );
@@ -549,13 +549,30 @@ QgsGeometry* QgsTransectSample::clipBufferLine( const QgsGeometry* stratumGeom,
549549
return 0;
550550
}
551551

552+
QgsGeometry* usedBaseline = clippedBaseline;
553+
if ( mBaselineSimplificationTolerance >= 0 )
554+
{
555+
//int verticesBefore = usedBaseline->asMultiPolyline().count();
556+
usedBaseline = clippedBaseline->simplify( mBaselineSimplificationTolerance );
557+
if ( !usedBaseline )
558+
{
559+
return 0;
560+
}
561+
//int verticesAfter = usedBaseline->asMultiPolyline().count();
562+
563+
//debug: write to file
564+
/*QgsVectorFileWriter debugWriter( "/tmp/debug.shp", "utf-8", QgsFields(), QGis::WKBLineString, &( mStrataLayer->crs() ) );
565+
QgsFeature debugFeature; debugFeature.setGeometry( usedBaseline );
566+
debugWriter.addFeature( debugFeature );*/
567+
}
568+
552569
double currentBufferDist = tolerance;
553570
int maxLoops = 10;
554571

555572
for ( int i = 0; i < maxLoops; ++i )
556573
{
557574
//loop with tolerance: create buffer, convert buffer to line, clip line by stratum, test if result is (single) line
558-
QgsGeometry* clipBaselineBuffer = clippedBaseline->buffer( currentBufferDist, 8 );
575+
QgsGeometry* clipBaselineBuffer = usedBaseline->buffer( currentBufferDist, 8 );
559576
if ( !clipBaselineBuffer )
560577
{
561578
delete clipBaselineBuffer;
@@ -628,6 +645,10 @@ QgsGeometry* QgsTransectSample::clipBufferLine( const QgsGeometry* stratumGeom,
628645
if ( bufferLineClippedIntersectsStratum )
629646
{
630647
delete clipBaselineBuffer;
648+
if ( mBaselineSimplificationTolerance >= 0 )
649+
{
650+
delete usedBaseline;
651+
}
631652
return bufferLineClipped;
632653
}
633654
}
@@ -637,5 +658,25 @@ QgsGeometry* QgsTransectSample::clipBufferLine( const QgsGeometry* stratumGeom,
637658
currentBufferDist /= 2;
638659
}
639660

661+
if ( mBaselineSimplificationTolerance >= 0 )
662+
{
663+
delete usedBaseline;
664+
}
640665
return 0; //no solution found even with reduced tolerances
641666
}
667+
668+
double QgsTransectSample::bufferDistance( double minDistanceFromAttribute ) const
669+
{
670+
double bufferDist = minDistanceFromAttribute;
671+
if ( mBaselineBufferDistance >= 0 )
672+
{
673+
bufferDist = mBaselineBufferDistance;
674+
}
675+
676+
if ( mMinDistanceUnits == Meters && mStrataLayer->crs().mapUnits() == QGis::DecimalDegrees )
677+
{
678+
bufferDist /= 111319.9;
679+
}
680+
681+
return bufferDist;
682+
}

src/analysis/vector/qgstransectsample.h

+11-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ class ANALYSIS_EXPORT QgsTransectSample
2525

2626
QgsTransectSample( QgsVectorLayer* strataLayer, QString strataIdAttribute, QString minDistanceAttribute, QString nPointsAttribute,
2727
DistanceUnits minDistUnits, QgsVectorLayer* baselineLayer, bool shareBaseline,
28-
QString baselineStrataId, const QString& outputPointLayer, const QString& outputLineLayer, const QString& usedBaselineLayer, double minTransectLength = 0.0 );
28+
QString baselineStrataId, const QString& outputPointLayer, const QString& outputLineLayer, const QString& usedBaselineLayer, double minTransectLength = 0.0,
29+
double baselineBufferDistance = -1.0, double baselineSimplificationTolerance = -1.0 );
2930
~QgsTransectSample();
3031

3132
int createSample( QProgressDialog* pd );
@@ -56,6 +57,11 @@ class ANALYSIS_EXPORT QgsTransectSample
5657

5758
double mMinTransectLength;
5859

60+
/**If value is negative, the buffer distance ist set to the same value as the minimum distance*/
61+
double mBaselineBufferDistance;
62+
/**If value is negative, no simplification is done to the baseline prior to create the buffer*/
63+
double mBaselineSimplificationTolerance;
64+
5965
/**Finds the closest points between two line segments
6066
@param g1 first input geometry. Must be a linestring with two vertices
6167
@param g2 second input geometry. Must be a linestring with two vertices
@@ -71,7 +77,10 @@ class ANALYSIS_EXPORT QgsTransectSample
7177
@param clippedBaseline base line geometry clipped to the stratum
7278
@param tolerance buffer distance (in layer units)
7379
@return clipped buffer line or 0 in case of error*/
74-
static QgsGeometry* clipBufferLine( const QgsGeometry* stratumGeom, QgsGeometry* clippedBaseline, double tolerance );
80+
QgsGeometry* clipBufferLine( const QgsGeometry* stratumGeom, QgsGeometry* clippedBaseline, double tolerance );
81+
82+
/**Returns distance to buffer the baseline (takes care of units and buffer settings*/
83+
double bufferDistance( double minDistanceFromAttribute ) const;
7584
};
7685

7786
#endif // QGSTRANSECTSAMPLE_H

0 commit comments

Comments
 (0)