14
14
15
15
QgsTransectSample::QgsTransectSample ( QgsVectorLayer* strataLayer, QString strataIdAttribute, QString minDistanceAttribute, QString nPointsAttribute, DistanceUnits minDistUnits,
16
16
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 ),
18
19
mStrataIdAttribute( strataIdAttribute ), mMinDistanceAttribute( minDistanceAttribute ), mNPointsAttribute( nPointsAttribute ), mBaselineLayer( baselineLayer ), mShareBaseline( shareBaseline ),
19
20
mBaselineStrataId( baselineStrataId ), mOutputPointLayer( outputPointLayer ), mOutputLineLayer( outputLineLayer ), mUsedBaselineLayer( usedBaselineLayer ),
20
- mMinDistanceUnits( minDistUnits ), mMinTransectLength( minTransectLength )
21
+ mMinDistanceUnits( minDistUnits ), mMinTransectLength( minTransectLength ), mBaselineBufferDistance( baselineBufferDistance ), mBaselineSimplificationTolerance( baselineSimplificationTolerance )
21
22
{
22
23
}
23
24
@@ -155,11 +156,10 @@ int QgsTransectSample::createSample( QProgressDialog* pd )
155
156
double minDistance = fet.attribute ( mMinDistanceAttribute ).toDouble ();
156
157
double minDistanceLayerUnits = minDistance;
157
158
// 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 ) ;
159
160
if ( mMinDistanceUnits == Meters && mStrataLayer ->crs ().mapUnits () == QGis::DecimalDegrees )
160
161
{
161
- bufferDist = minDistance / 111319.9 ;
162
- minDistanceLayerUnits = bufferDist;
162
+ minDistanceLayerUnits = minDistance / 111319.9 ;
163
163
}
164
164
165
165
QgsGeometry* clippedBaseline = strataGeom->intersection ( baselineGeom );
@@ -549,13 +549,30 @@ QgsGeometry* QgsTransectSample::clipBufferLine( const QgsGeometry* stratumGeom,
549
549
return 0 ;
550
550
}
551
551
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
+
552
569
double currentBufferDist = tolerance;
553
570
int maxLoops = 10 ;
554
571
555
572
for ( int i = 0 ; i < maxLoops; ++i )
556
573
{
557
574
// 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 );
559
576
if ( !clipBaselineBuffer )
560
577
{
561
578
delete clipBaselineBuffer;
@@ -628,6 +645,10 @@ QgsGeometry* QgsTransectSample::clipBufferLine( const QgsGeometry* stratumGeom,
628
645
if ( bufferLineClippedIntersectsStratum )
629
646
{
630
647
delete clipBaselineBuffer;
648
+ if ( mBaselineSimplificationTolerance >= 0 )
649
+ {
650
+ delete usedBaseline;
651
+ }
631
652
return bufferLineClipped;
632
653
}
633
654
}
@@ -637,5 +658,25 @@ QgsGeometry* QgsTransectSample::clipBufferLine( const QgsGeometry* stratumGeom,
637
658
currentBufferDist /= 2 ;
638
659
}
639
660
661
+ if ( mBaselineSimplificationTolerance >= 0 )
662
+ {
663
+ delete usedBaseline;
664
+ }
640
665
return 0 ; // no solution found even with reduced tolerances
641
666
}
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
+ }
0 commit comments