@@ -411,6 +411,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
411
411
412
412
long maxFeat = 0 ;
413
413
long maxFeatures = -1 ;
414
+ long startIndex = 0 ;
414
415
long featureCounter = 0 ;
415
416
int layerPrec = 8 ;
416
417
@@ -426,6 +427,8 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
426
427
427
428
if ( docElem.hasAttribute ( " maxFeatures" ) )
428
429
maxFeatures = docElem.attribute ( " maxFeatures" ).toLong ();
430
+ if ( docElem.hasAttribute ( " startIndex" ) )
431
+ startIndex = docElem.attribute ( " startIndex" ).toLong ();
429
432
430
433
QDomNodeList queryNodes = docElem.elementsByTagName ( " Query" );
431
434
QDomElement queryElem;
@@ -624,13 +627,16 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
624
627
req.setSubsetOfAttributes ( attrIndexes );
625
628
626
629
QgsFeatureIterator fit = layer->getFeatures ( req );
627
- while ( fit.nextFeature ( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat ) )
630
+ while ( fit.nextFeature ( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat + startIndex ) )
628
631
{
629
- if ( featureCounter == 0 )
632
+ if ( featureCounter == startIndex )
630
633
startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
631
634
632
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
633
- ++featCounter;
635
+ if ( featureCounter >= startIndex )
636
+ {
637
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
638
+ ++featCounter;
639
+ }
634
640
++featureCounter;
635
641
}
636
642
}
@@ -643,7 +649,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
643
649
{
644
650
throw QgsMapServiceException ( " RequestNotWellFormed" , filter->parserErrorString () );
645
651
}
646
- while ( fit.nextFeature ( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat ) )
652
+ while ( fit.nextFeature ( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat + startIndex ) )
647
653
{
648
654
expressionContext.setFeature ( feature );
649
655
@@ -654,26 +660,32 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
654
660
}
655
661
if ( res.toInt () != 0 )
656
662
{
657
- if ( featureCounter == 0 )
663
+ if ( featureCounter == startIndex )
658
664
startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
659
665
660
- setGetFeature ( request, format, &feature, featureCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
666
+ if ( featureCounter >= startIndex )
667
+ {
668
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
669
+ ++featCounter;
670
+ }
661
671
++featureCounter;
662
- ++featCounter;
663
672
}
664
673
}
665
674
}
666
675
}
667
676
}
668
677
else
669
678
{
670
- while ( fit.nextFeature ( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat ) )
679
+ while ( fit.nextFeature ( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat + startIndex ) )
671
680
{
672
- if ( featureCounter == 0 )
681
+ if ( featureCounter == startIndex )
673
682
startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
674
683
675
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
676
- ++featCounter;
684
+ if ( featureCounter >= startIndex )
685
+ {
686
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
687
+ ++featCounter;
688
+ }
677
689
++featureCounter;
678
690
}
679
691
}
@@ -692,7 +704,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
692
704
QgsMessageLog::logMessage ( mErrors .join ( " \n " ) );
693
705
694
706
QgsMapLayerRegistry::instance ()->removeAllMapLayers ();
695
- if ( featureCounter == 0 )
707
+ if ( featureCounter <= startIndex )
696
708
startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
697
709
endGetFeature ( request, format );
698
710
return 0 ;
@@ -806,6 +818,15 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
806
818
maxFeat = mfString.toLong ( &mfOk, 10 );
807
819
}
808
820
821
+ // read STARTINDEX
822
+ QMap<QString, QString>::const_iterator siIt = mParameters .find ( " STARTINDEX" );
823
+ if ( siIt != mParameters .end () )
824
+ {
825
+ QString siString = siIt.value ();
826
+ bool siOk;
827
+ startIndex = siString.toLong ( &siOk, 10 );
828
+ }
829
+
809
830
// read PROPERTYNAME
810
831
mWithGeom = true ;
811
832
mPropertyName = " *" ;
@@ -959,7 +980,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
959
980
{
960
981
throw QgsMapServiceException ( " RequestNotWellFormed" , QString ( " Expression filter error message: %1." ).arg ( filter->parserErrorString () ) );
961
982
}
962
- while ( fit.nextFeature ( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat ) )
983
+ while ( fit.nextFeature ( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat + startIndex ) )
963
984
{
964
985
expressionContext.setFeature ( feature );
965
986
QVariant res = filter->evaluate ( &expressionContext );
@@ -969,11 +990,14 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
969
990
}
970
991
if ( res.toInt () != 0 )
971
992
{
972
- if ( featureCounter == 0 )
993
+ if ( featureCounter == startIndex )
973
994
startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
974
995
975
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
976
- ++featCounter;
996
+ if ( featureCounter >= startIndex )
997
+ {
998
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
999
+ ++featCounter;
1000
+ }
977
1001
++featureCounter;
978
1002
}
979
1003
}
@@ -1040,13 +1064,16 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1040
1064
req.setSubsetOfAttributes ( attrIndexes );
1041
1065
1042
1066
QgsFeatureIterator fit = layer->getFeatures ( req );
1043
- while ( fit.nextFeature ( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat ) )
1067
+ while ( fit.nextFeature ( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat + startIndex ) )
1044
1068
{
1045
- if ( featureCounter == 0 )
1069
+ if ( featureCounter == startIndex )
1046
1070
startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
1047
1071
1048
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
1049
- ++featCounter;
1072
+ if ( featureCounter >= startIndex )
1073
+ {
1074
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
1075
+ ++featCounter;
1076
+ }
1050
1077
++featureCounter;
1051
1078
}
1052
1079
}
@@ -1078,7 +1105,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1078
1105
}
1079
1106
req.setSubsetOfAttributes ( attrIndexes );
1080
1107
QgsFeatureIterator fit = layer->getFeatures ( req );
1081
- while ( fit.nextFeature ( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat ) )
1108
+ while ( fit.nextFeature ( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat + startIndex ) )
1082
1109
{
1083
1110
expressionContext.setFeature ( feature );
1084
1111
QVariant res = filter->evaluate ( &expressionContext );
@@ -1088,12 +1115,15 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1088
1115
}
1089
1116
if ( res.toInt () != 0 )
1090
1117
{
1091
- if ( featureCounter == 0 )
1118
+ if ( featureCounter == startIndex )
1092
1119
startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
1093
1120
1094
- setGetFeature ( request, format, &feature, featureCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
1121
+ if ( featureCounter >= startIndex )
1122
+ {
1123
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
1124
+ ++featCounter;
1125
+ }
1095
1126
++featureCounter;
1096
- ++featCounter;
1097
1127
}
1098
1128
}
1099
1129
}
@@ -1121,14 +1151,17 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1121
1151
}
1122
1152
req.setSubsetOfAttributes ( attrIndexes );
1123
1153
QgsFeatureIterator fit = layer->getFeatures ( req );
1124
- while ( fit.nextFeature ( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat ) )
1154
+ while ( fit.nextFeature ( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat + startIndex ) )
1125
1155
{
1126
1156
mErrors << QString ( " The feature %2 of layer for the TypeName '%1'" ).arg ( tnStr ).arg ( featureCounter );
1127
- if ( featureCounter == 0 )
1157
+ if ( featureCounter == startIndex )
1128
1158
startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
1129
1159
1130
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
1131
- ++featCounter;
1160
+ if ( featureCounter >= startIndex )
1161
+ {
1162
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
1163
+ ++featCounter;
1164
+ }
1132
1165
++featureCounter;
1133
1166
}
1134
1167
}
@@ -1142,7 +1175,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1142
1175
}
1143
1176
1144
1177
QgsMapLayerRegistry::instance ()->removeAllMapLayers ();
1145
- if ( featureCounter == 0 )
1178
+ if ( featureCounter <= startIndex )
1146
1179
startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
1147
1180
endGetFeature ( request, format );
1148
1181
@@ -1217,6 +1250,10 @@ void QgsWFSServer::startGetFeature( QgsRequestHandler& request, const QString& f
1217
1250
{
1218
1251
mapUrl.removeQueryItem ( queryIt->first );
1219
1252
}
1253
+ else if ( queryIt->first .compare ( " STARTINDEX" , Qt::CaseInsensitive ) == 0 )
1254
+ {
1255
+ mapUrl.removeQueryItem ( queryIt->first );
1256
+ }
1220
1257
else if ( queryIt->first .compare ( " PROPERTYNAME" , Qt::CaseInsensitive ) == 0 )
1221
1258
{
1222
1259
mapUrl.removeQueryItem ( queryIt->first );
0 commit comments