629 changes: 629 additions & 0 deletions src/analysis/vector/qgstransectsample.cpp

Large diffs are not rendered by default.

77 changes: 77 additions & 0 deletions src/analysis/vector/qgstransectsample.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#ifndef QGSTRANSECTSAMPLE_H
#define QGSTRANSECTSAMPLE_H

#include "qgsfeature.h"
#include <QMap>
#include <QString>

class QgsDistanceArea;
class QgsGeometry;
class QgsSpatialIndex;
class QgsVectorLayer;
class QgsPoint;
class QProgressDialog;

/**A class for the creation of transect sample lines based on a set of strata polygons and baselines*/
class ANALYSIS_EXPORT QgsTransectSample
{
public:

enum DistanceUnits
{
Meters,
StrataUnits //units are the same as stratum layer
};

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 );
~QgsTransectSample();

int createSample( QProgressDialog* pd );

private:
QgsTransectSample(); //default constructor forbidden

QgsGeometry* findBaselineGeometry( QVariant strataId );

/**Returns true if another transect is within the specified minimum distance*/
static bool otherTransectWithinDistance( QgsGeometry* geom, double minDistLayerUnit, double minDistance, QgsSpatialIndex& sIndex, const QMap< QgsFeatureId, QgsGeometry* >&
lineFeatureMap, QgsDistanceArea& da );

QgsVectorLayer* mStrataLayer;
QString mStrataIdAttribute;
QString mMinDistanceAttribute;
QString mNPointsAttribute;

QgsVectorLayer* mBaselineLayer;
bool mShareBaseline;
QString mBaselineStrataId;

QString mOutputPointLayer;
QString mOutputLineLayer;
QString mUsedBaselineLayer;

DistanceUnits mMinDistanceUnits;

double mMinTransectLength;

/**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
@param dist out: distance between the segments
@param pt1 out: closest point on first geometry
@param pt2 out: closest point on secont geometry
@return true in case of success*/
static bool closestSegmentPoints( QgsGeometry& g1, QgsGeometry& g2, double& dist, QgsPoint& pt1, QgsPoint& pt2 );
/**Returns a copy of the multiline element closest to a point (caller takes ownership)*/
static QgsGeometry* closestMultilineElement( const QgsPoint& pt, QgsGeometry* multiLine );
/**Returns clipped buffer line. Iteratively applies reduced tolerances if the result is not a single line
@param stratumGeom stratum polygon
@param clippedBaselineGeom 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( QgsGeometry* stratumGeom, QgsGeometry* clippedBaseline, double tolerance );
};

#endif // QGSTRANSECTSAMPLE_H