@@ -918,7 +918,7 @@ bool QgsGeometryAnalyzer::eventLayer( QgsVectorLayer* lineLayer, QgsVectorLayer*
918
918
}
919
919
920
920
// create line field / id map for line layer
921
- QHash < QString, QgsFeatureId > lineLayerIdMap;
921
+ QMultiHash < QString, QgsFeatureId > lineLayerIdMap; // 1:n possible (e.g. several linear reference geometries for one feature in the event layer)
922
922
lineLayer->select ( QgsAttributeList () << lineField,
923
923
QgsRectangle (), false , false );
924
924
QgsFeature fet;
@@ -951,6 +951,44 @@ bool QgsGeometryAnalyzer::eventLayer( QgsVectorLayer* lineLayer, QgsVectorLayer*
951
951
952
952
while ( eventLayer->nextFeature ( fet ) )
953
953
{
954
+ measure1 = fet.attributeMap ()[locationField1].toDouble ();
955
+ if ( locationField2 != -1 )
956
+ {
957
+ measure2 = fet.attributeMap ()[locationField2].toDouble ();
958
+ }
959
+
960
+ QList<QgsFeatureId> featureIdList = lineLayerIdMap.values ( fet.attributeMap ()[eventField].toString () );
961
+ QList<QgsFeatureId>::const_iterator featureIdIt = featureIdList.constBegin ();
962
+ for ( ; featureIdIt != featureIdList.constEnd (); ++featureIdIt )
963
+ {
964
+ if ( !lineLayer->featureAtId ( *featureIdIt, lineFeature, true , false ) )
965
+ {
966
+ continue ;
967
+ }
968
+
969
+ if ( locationField2 == -1 )
970
+ {
971
+ lrsGeom = locateAlongMeasure ( measure1, lineFeature.geometry () );
972
+ }
973
+ else
974
+ {
975
+ lrsGeom = locateBetweenMeasures ( measure1, measure2, lineFeature.geometry () );
976
+ }
977
+
978
+ if ( lrsGeom )
979
+ {
980
+ fet.setGeometry ( lrsGeom );
981
+ if ( memoryProvider )
982
+ {
983
+ memoryProvider->addFeatures ( QgsFeatureList () << fet );
984
+ }
985
+ else
986
+ {
987
+ fileWriter->addFeature ( fet );
988
+ }
989
+ }
990
+ }
991
+ #if 0
954
992
//get corresponding line feature
955
993
QHash< QString, QgsFeatureId >::const_iterator layerIdIt = lineLayerIdMap.find( fet.attributeMap()[eventField].toString() );
956
994
if ( layerIdIt == lineLayerIdMap.constEnd() )
@@ -985,6 +1023,7 @@ bool QgsGeometryAnalyzer::eventLayer( QgsVectorLayer* lineLayer, QgsVectorLayer*
985
1023
fileWriter->addFeature( fet );
986
1024
}
987
1025
}
1026
+ #endif // 0
988
1027
}
989
1028
990
1029
return true ;
@@ -1027,6 +1066,10 @@ QgsGeometry* QgsGeometryAnalyzer::locateBetweenMeasures( double fromMeasure, dou
1027
1066
}
1028
1067
}
1029
1068
1069
+ if ( resultGeom.size () < 1 )
1070
+ {
1071
+ return 0 ;
1072
+ }
1030
1073
return QgsGeometry::fromMultiPolyline ( resultGeom );
1031
1074
}
1032
1075
@@ -1067,6 +1110,10 @@ QgsGeometry* QgsGeometryAnalyzer::locateAlongMeasure( double measure, QgsGeometr
1067
1110
}
1068
1111
}
1069
1112
1113
+ if ( resultGeom.size () < 1 )
1114
+ {
1115
+ return 0 ;
1116
+ }
1070
1117
return QgsGeometry::fromMultiPoint ( resultGeom );
1071
1118
}
1072
1119
0 commit comments