Skip to content

Commit a0db1e3

Browse files
committed
Add offset parameters to eventLayer functions
1 parent 2d4a596 commit a0db1e3

File tree

3 files changed

+29
-7
lines changed

3 files changed

+29
-7
lines changed

python/analysis/qgsgeometryanalyzer.sip

+2-2
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ class QgsGeometryAnalyzer
6060
@param p progress dialog or 0 if no progress dialog should be shown
6161
*/
6262
bool eventLayer( QgsVectorLayer* lineLayer, QgsVectorLayer* eventLayer, int lineField, int eventField, QList<int>& unlocatedFeatureIds /Out/,
63-
const QString& outputLayer, const QString& outputFormat, int locationField1, int locationField2 = -1, bool forceSingleGeometry = false,
64-
QgsVectorDataProvider* memoryProvider = 0, QProgressDialog* p = 0 );
63+
const QString& outputLayer, const QString& outputFormat, int locationField1, int locationField2 = -1, int offsetField = -1, double offsetScale = 1.0,
64+
bool forceSingleGeometry = false, QgsVectorDataProvider* memoryProvider = 0, QProgressDialog* p = 0 );
6565

6666
/**Returns multilinestring*/
6767
QgsGeometry* locateBetweenMeasures( double fromMeasure, double toMeasure, QgsGeometry* lineGeom );

src/analysis/vector/qgsgeometryanalyzer.cpp

+18-3
Original file line numberDiff line numberDiff line change
@@ -910,7 +910,8 @@ void QgsGeometryAnalyzer::bufferFeature( QgsFeature& f, int nProcessedFeatures,
910910
}
911911

912912
bool QgsGeometryAnalyzer::eventLayer( QgsVectorLayer* lineLayer, QgsVectorLayer* eventLayer, int lineField, int eventField, QList<int>& unlocatedFeatureIds, const QString& outputLayer,
913-
const QString& outputFormat, int locationField1, int locationField2, bool forceSingleGeometry, QgsVectorDataProvider* memoryProvider, QProgressDialog* p )
913+
const QString& outputFormat, int locationField1, int locationField2, int offsetField, double offsetScale,
914+
bool forceSingleGeometry, QgsVectorDataProvider* memoryProvider, QProgressDialog* p )
914915
{
915916
if ( !lineLayer || !eventLayer || !lineLayer->isValid() || !eventLayer->isValid() )
916917
{
@@ -1012,7 +1013,7 @@ bool QgsGeometryAnalyzer::eventLayer( QgsVectorLayer* lineLayer, QgsVectorLayer*
10121013
if ( lrsGeom )
10131014
{
10141015
++nOutputFeatures;
1015-
addEventLayerFeature( fet, lrsGeom, fileWriter, memoryProviderFeatures, forceSingleGeometry );
1016+
addEventLayerFeature( fet, lrsGeom, lineFeature.geometry(), fileWriter, memoryProviderFeatures, offsetField, offsetScale, forceSingleGeometry );
10161017
}
10171018
}
10181019
if ( nOutputFeatures < 1 )
@@ -1034,7 +1035,8 @@ bool QgsGeometryAnalyzer::eventLayer( QgsVectorLayer* lineLayer, QgsVectorLayer*
10341035
return true;
10351036
}
10361037

1037-
void QgsGeometryAnalyzer::addEventLayerFeature( QgsFeature& feature, QgsGeometry* geom, QgsVectorFileWriter* fileWriter, QgsFeatureList& memoryFeatures, bool forceSingleType )
1038+
void QgsGeometryAnalyzer::addEventLayerFeature( QgsFeature& feature, QgsGeometry* geom, const QgsGeometry* lineGeom, QgsVectorFileWriter* fileWriter, QgsFeatureList& memoryFeatures,
1039+
int offsetField, double offsetScale, bool forceSingleType )
10381040
{
10391041
if ( !geom )
10401042
{
@@ -1054,6 +1056,14 @@ void QgsGeometryAnalyzer::addEventLayerFeature( QgsFeature& feature, QgsGeometry
10541056
QList<QgsGeometry*>::iterator geomIt = geomList.begin();
10551057
for ( ; geomIt != geomList.end(); ++geomIt )
10561058
{
1059+
//consider offset
1060+
if ( offsetField >= 0 )
1061+
{
1062+
double offsetVal = feature.attributeMap()[offsetField].toDouble();
1063+
offsetVal *= offsetScale;
1064+
createOffsetGeometry( *geomIt, lineGeom, offsetVal );
1065+
}
1066+
10571067
feature.setGeometry( *geomIt );
10581068
if ( fileWriter )
10591069
{
@@ -1071,6 +1081,11 @@ void QgsGeometryAnalyzer::addEventLayerFeature( QgsFeature& feature, QgsGeometry
10711081
}
10721082
}
10731083

1084+
void QgsGeometryAnalyzer::createOffsetGeometry( QgsGeometry* geom, const QgsGeometry* lineGeom, double offset )
1085+
{
1086+
//todo...
1087+
}
1088+
10741089
QgsGeometry* QgsGeometryAnalyzer::locateBetweenMeasures( double fromMeasure, double toMeasure, QgsGeometry* lineGeom )
10751090
{
10761091
if ( !lineGeom )

src/analysis/vector/qgsgeometryanalyzer.h

+9-2
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,8 @@ class ANALYSIS_EXPORT QgsGeometryAnalyzer
116116
@param p progress dialog or 0 if no progress dialog should be shown
117117
*/
118118
bool eventLayer( QgsVectorLayer* lineLayer, QgsVectorLayer* eventLayer, int lineField, int eventField, QList<int>& unlocatedFeatureIds, const QString& outputLayer,
119-
const QString& outputFormat, int locationField1, int locationField2 = -1, bool forceSingleGeometry = false, QgsVectorDataProvider* memoryProvider = 0, QProgressDialog* p = 0 );
119+
const QString& outputFormat, int locationField1, int locationField2 = -1, int offsetField = -1, double offsetScale = 1.0,
120+
bool forceSingleGeometry = false, QgsVectorDataProvider* memoryProvider = 0, QProgressDialog* p = 0 );
120121

121122
/**Returns linear reference geometry as a multiline (or 0 if no match). Currently, the z-coordinates are considered to be the measures (no support for m-values in QGIS)*/
122123
QgsGeometry* locateBetweenMeasures( double fromMeasure, double toMeasure, QgsGeometry* lineGeom );
@@ -141,7 +142,13 @@ class ANALYSIS_EXPORT QgsGeometryAnalyzer
141142
void dissolveFeature( QgsFeature& f, int nProcessedFeatures, QgsGeometry** dissolveGeometry );
142143

143144
//helper functions for event layer
144-
void addEventLayerFeature( QgsFeature& feature, QgsGeometry* geom, QgsVectorFileWriter* fileWriter, QgsFeatureList& memoryFeatures, bool forceSingleType = false );
145+
void addEventLayerFeature( QgsFeature& feature, QgsGeometry* geom, const QgsGeometry* lineGeom, QgsVectorFileWriter* fileWriter, QgsFeatureList& memoryFeatures, int offsetField = -1, double offsetScale = 1.0,
146+
bool forceSingleType = false );
147+
/**Create geometry offset relative to line geometry.
148+
@param geom the geometry to modify
149+
@param the line geometry to wich the feature is referenced
150+
@param offset the offset value in layer unit. Negativ value means offset towards left, positive value is offset to the right side*/
151+
void createOffsetGeometry( QgsGeometry* geom, const QgsGeometry* lineGeom, double offset );
145152
unsigned char* locateBetweenWkbString( unsigned char* ptr, QgsMultiPolyline& result, double fromMeasure, double toMeasure );
146153
unsigned char* locateAlongWkbString( unsigned char* ptr, QgsMultiPoint& result, double measure );
147154
static bool clipSegmentByRange( double x1, double y1, double m1, double x2, double y2, double m2, double range1, double range2, QgsPoint& pt1, QgsPoint& pt2, bool& secondPointClipped );

0 commit comments

Comments
 (0)