Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add baseline buffer tolerance and simplification tolerance parameters…
… to transect sample
  • Loading branch information
mhugent committed Jul 15, 2015
1 parent 7df1402 commit 6788fba
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 9 deletions.
3 changes: 2 additions & 1 deletion python/analysis/vector/qgstransectsample.sip
Expand Up @@ -18,7 +18,8 @@ class QgsTransectSample

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

int createSample( QProgressDialog* pd );
Expand Down
53 changes: 47 additions & 6 deletions src/analysis/vector/qgstransectsample.cpp
Expand Up @@ -14,10 +14,11 @@

QgsTransectSample::QgsTransectSample( QgsVectorLayer* strataLayer, QString strataIdAttribute, QString minDistanceAttribute, QString nPointsAttribute, DistanceUnits minDistUnits,
QgsVectorLayer* baselineLayer, bool shareBaseline, QString baselineStrataId, const QString& outputPointLayer,
const QString& outputLineLayer, const QString& usedBaselineLayer, double minTransectLength ): mStrataLayer( strataLayer ),
const QString& outputLineLayer, const QString& usedBaselineLayer, double minTransectLength,
double baselineBufferDistance, double baselineSimplificationTolerance ): mStrataLayer( strataLayer ),
mStrataIdAttribute( strataIdAttribute ), mMinDistanceAttribute( minDistanceAttribute ), mNPointsAttribute( nPointsAttribute ), mBaselineLayer( baselineLayer ), mShareBaseline( shareBaseline ),
mBaselineStrataId( baselineStrataId ), mOutputPointLayer( outputPointLayer ), mOutputLineLayer( outputLineLayer ), mUsedBaselineLayer( usedBaselineLayer ),
mMinDistanceUnits( minDistUnits ), mMinTransectLength( minTransectLength )
mMinDistanceUnits( minDistUnits ), mMinTransectLength( minTransectLength ), mBaselineBufferDistance( baselineBufferDistance ), mBaselineSimplificationTolerance( baselineSimplificationTolerance )
{
}

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

QgsGeometry* clippedBaseline = strataGeom->intersection( baselineGeom );
Expand Down Expand Up @@ -549,13 +549,30 @@ QgsGeometry* QgsTransectSample::clipBufferLine( const QgsGeometry* stratumGeom,
return 0;
}

QgsGeometry* usedBaseline = clippedBaseline;
if ( mBaselineSimplificationTolerance >= 0 )
{
//int verticesBefore = usedBaseline->asMultiPolyline().count();
usedBaseline = clippedBaseline->simplify( mBaselineSimplificationTolerance );
if ( !usedBaseline )
{
return 0;
}
//int verticesAfter = usedBaseline->asMultiPolyline().count();

//debug: write to file
/*QgsVectorFileWriter debugWriter( "/tmp/debug.shp", "utf-8", QgsFields(), QGis::WKBLineString, &( mStrataLayer->crs() ) );
QgsFeature debugFeature; debugFeature.setGeometry( usedBaseline );
debugWriter.addFeature( debugFeature );*/
}

double currentBufferDist = tolerance;
int maxLoops = 10;

for ( int i = 0; i < maxLoops; ++i )
{
//loop with tolerance: create buffer, convert buffer to line, clip line by stratum, test if result is (single) line
QgsGeometry* clipBaselineBuffer = clippedBaseline->buffer( currentBufferDist, 8 );
QgsGeometry* clipBaselineBuffer = usedBaseline->buffer( currentBufferDist, 8 );
if ( !clipBaselineBuffer )
{
delete clipBaselineBuffer;
Expand Down Expand Up @@ -628,6 +645,10 @@ QgsGeometry* QgsTransectSample::clipBufferLine( const QgsGeometry* stratumGeom,
if ( bufferLineClippedIntersectsStratum )
{
delete clipBaselineBuffer;
if ( mBaselineSimplificationTolerance >= 0 )
{
delete usedBaseline;
}
return bufferLineClipped;
}
}
Expand All @@ -637,5 +658,25 @@ QgsGeometry* QgsTransectSample::clipBufferLine( const QgsGeometry* stratumGeom,
currentBufferDist /= 2;
}

if ( mBaselineSimplificationTolerance >= 0 )
{
delete usedBaseline;
}
return 0; //no solution found even with reduced tolerances
}

double QgsTransectSample::bufferDistance( double minDistanceFromAttribute ) const
{
double bufferDist = minDistanceFromAttribute;
if ( mBaselineBufferDistance >= 0 )
{
bufferDist = mBaselineBufferDistance;
}

if ( mMinDistanceUnits == Meters && mStrataLayer->crs().mapUnits() == QGis::DecimalDegrees )
{
bufferDist /= 111319.9;
}

return bufferDist;
}
13 changes: 11 additions & 2 deletions src/analysis/vector/qgstransectsample.h
Expand Up @@ -25,7 +25,8 @@ class ANALYSIS_EXPORT QgsTransectSample

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

int createSample( QProgressDialog* pd );
Expand Down Expand Up @@ -56,6 +57,11 @@ class ANALYSIS_EXPORT QgsTransectSample

double mMinTransectLength;

/**If value is negative, the buffer distance ist set to the same value as the minimum distance*/
double mBaselineBufferDistance;
/**If value is negative, no simplification is done to the baseline prior to create the buffer*/
double mBaselineSimplificationTolerance;

/**Finds the closest points between two line segments
@param g1 first input geometry. Must be a linestring with two vertices
@param g2 second input geometry. Must be a linestring with two vertices
Expand All @@ -71,7 +77,10 @@ class ANALYSIS_EXPORT QgsTransectSample
@param clippedBaseline base line geometry clipped to the stratum
@param tolerance buffer distance (in layer units)
@return clipped buffer line or 0 in case of error*/
static QgsGeometry* clipBufferLine( const QgsGeometry* stratumGeom, QgsGeometry* clippedBaseline, double tolerance );
QgsGeometry* clipBufferLine( const QgsGeometry* stratumGeom, QgsGeometry* clippedBaseline, double tolerance );

/**Returns distance to buffer the baseline (takes care of units and buffer settings*/
double bufferDistance( double minDistanceFromAttribute ) const;
};

#endif // QGSTRANSECTSAMPLE_H

0 comments on commit 6788fba

Please sign in to comment.