Skip to content

Commit 8cfefb0

Browse files
committed
Support multiple geometries per event object. Return zero geometry if result is emtpy
1 parent 7702b08 commit 8cfefb0

File tree

1 file changed

+48
-1
lines changed

1 file changed

+48
-1
lines changed

src/analysis/vector/qgsgeometryanalyzer.cpp

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -918,7 +918,7 @@ bool QgsGeometryAnalyzer::eventLayer( QgsVectorLayer* lineLayer, QgsVectorLayer*
918918
}
919919

920920
//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)
922922
lineLayer->select( QgsAttributeList() << lineField,
923923
QgsRectangle(), false, false );
924924
QgsFeature fet;
@@ -951,6 +951,44 @@ bool QgsGeometryAnalyzer::eventLayer( QgsVectorLayer* lineLayer, QgsVectorLayer*
951951

952952
while ( eventLayer->nextFeature( fet ) )
953953
{
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
954992
//get corresponding line feature
955993
QHash< QString, QgsFeatureId >::const_iterator layerIdIt = lineLayerIdMap.find( fet.attributeMap()[eventField].toString() );
956994
if ( layerIdIt == lineLayerIdMap.constEnd() )
@@ -985,6 +1023,7 @@ bool QgsGeometryAnalyzer::eventLayer( QgsVectorLayer* lineLayer, QgsVectorLayer*
9851023
fileWriter->addFeature( fet );
9861024
}
9871025
}
1026+
#endif //0
9881027
}
9891028

9901029
return true;
@@ -1027,6 +1066,10 @@ QgsGeometry* QgsGeometryAnalyzer::locateBetweenMeasures( double fromMeasure, dou
10271066
}
10281067
}
10291068

1069+
if ( resultGeom.size() < 1 )
1070+
{
1071+
return 0;
1072+
}
10301073
return QgsGeometry::fromMultiPolyline( resultGeom );
10311074
}
10321075

@@ -1067,6 +1110,10 @@ QgsGeometry* QgsGeometryAnalyzer::locateAlongMeasure( double measure, QgsGeometr
10671110
}
10681111
}
10691112

1113+
if ( resultGeom.size() < 1 )
1114+
{
1115+
return 0;
1116+
}
10701117
return QgsGeometry::fromMultiPoint( resultGeom );
10711118
}
10721119

0 commit comments

Comments
 (0)