[QGIS-Server] The parameter PROPERTYNAME does not filter attributes

Bug #8155
In the OGC standard, the parameter PROPERTYNAME is ussed to filter attributes in the request getFeature. In version 1.8 this parameter works. Because of changes in the vector API, this parameter does not filter attribute.
This commit is contained in:
D'Hont René-Luc 2013-06-25 15:18:55 +02:00
parent 52dc17ab4f
commit a5ca9d7180
2 changed files with 47 additions and 39 deletions

View File

@ -442,12 +442,13 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
layer->getFeatures( QgsFeatureRequest()
.setFilterFid( fid.toInt() )
.setFlags( QgsFeatureRequest::ExactIntersect | ( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) )
.setSubsetOfAttributes( attrIndexes )
).nextFeature( feature );
if ( featureCounter == 0 )
startGetFeature( request, format, layerCrs, &searchRect );
sendGetFeature( request, format, &feature, featCounter, layerCrs, fields, layerExcludedAttributes );
sendGetFeature( request, format, &feature, featCounter, layerCrs, attrIndexes, layerExcludedAttributes );
fid = "";
++featCounter;
@ -460,7 +461,6 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
QDomElement childElem = bboxElem.firstChildElement();
QgsFeatureRequest req;
req.setSubsetOfAttributes( attrIndexes );
req.setFlags( QgsFeatureRequest::ExactIntersect | ( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) );
while ( !childElem.isNull() )
@ -477,6 +477,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
}
childElem = childElem.nextSiblingElement();
}
req.setSubsetOfAttributes( attrIndexes );
QgsFeatureIterator fit = layer->getFeatures( req );
while ( fit.nextFeature( feature ) && featureCounter < maxFeat )
@ -484,7 +485,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
if ( featureCounter == 0 )
startGetFeature( request, format, layerCrs, &searchRect );
sendGetFeature( request, format, &feature, featCounter, layerCrs, fields, layerExcludedAttributes );
sendGetFeature( request, format, &feature, featCounter, layerCrs, attrIndexes, layerExcludedAttributes );
++featCounter;
++featureCounter;
}
@ -510,7 +511,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
if ( featureCounter == 0 )
startGetFeature( request, format, layerCrs, &searchRect );
sendGetFeature( request, format, &feature, featureCounter, layerCrs, fields, layerExcludedAttributes );
sendGetFeature( request, format, &feature, featureCounter, layerCrs, attrIndexes, layerExcludedAttributes );
++featureCounter;
++featCounter;
}
@ -525,7 +526,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
if ( featureCounter == 0 )
startGetFeature( request, format, layerCrs, &searchRect );
sendGetFeature( request, format, &feature, featCounter, layerCrs, fields, layerExcludedAttributes );
sendGetFeature( request, format, &feature, featCounter, layerCrs, attrIndexes, layerExcludedAttributes );
++featCounter;
++featureCounter;
}
@ -759,12 +760,13 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
layer->getFeatures( QgsFeatureRequest()
.setFilterFid( fidStr.section( ".", 1, 1 ).toInt() )
.setFlags( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry )
.setSubsetOfAttributes( attrIndexes )
).nextFeature( feature );
if ( featureCounter == 0 )
startGetFeature( request, format, layerCrs, &searchRect );
sendGetFeature( request, format, &feature, featCounter, layerCrs, fields, layerExcludedAttributes );
sendGetFeature( request, format, &feature, featCounter, layerCrs, attrIndexes, layerExcludedAttributes );
++featCounter;
++featureCounter;
}
@ -772,7 +774,6 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
else if ( expFilterOk )
{
QgsFeatureRequest req;
req.setSubsetOfAttributes( attrIndexes );
if ( layer->wkbType() != QGis::WKBNoGeometry )
{
req.setFilterRect( searchRect )
@ -783,6 +784,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
req.setFlags( QgsFeatureRequest::NoGeometry );
mWithGeom = false;
}
req.setSubsetOfAttributes( attrIndexes );
QgsFeatureIterator fit = layer->getFeatures( req );
QgsExpression *mFilter = new QgsExpression( expFilter );
if ( mFilter->hasParserError() )
@ -803,7 +805,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
if ( featureCounter == 0 )
startGetFeature( request, format, layerCrs, &searchRect );
sendGetFeature( request, format, &feature, featCounter, layerCrs, fields, layerExcludedAttributes );
sendGetFeature( request, format, &feature, featCounter, layerCrs, attrIndexes, layerExcludedAttributes );
++featCounter;
++featureCounter;
}
@ -834,12 +836,13 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
layer->getFeatures( QgsFeatureRequest()
.setFilterFid( fid.toInt() )
.setFlags( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry )
.setSubsetOfAttributes( attrIndexes )
).nextFeature( feature );
if ( featureCounter == 0 )
startGetFeature( request, format, layerCrs, &searchRect );
sendGetFeature( request, format, &feature, featCounter, layerCrs, fields, layerExcludedAttributes );
sendGetFeature( request, format, &feature, featCounter, layerCrs, attrIndexes, layerExcludedAttributes );
fid = "";
++featCounter;
@ -852,7 +855,6 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
QDomElement childElem = bboxElem.firstChildElement();
QgsFeatureRequest req;
req.setSubsetOfAttributes( attrIndexes );
req.setFlags( QgsFeatureRequest::ExactIntersect | ( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) );
while ( !childElem.isNull() )
@ -869,6 +871,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
}
childElem = childElem.nextSiblingElement();
}
req.setSubsetOfAttributes( attrIndexes );
QgsFeatureIterator fit = layer->getFeatures( req );
while ( fit.nextFeature( feature ) && featureCounter < maxFeat )
@ -876,7 +879,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
if ( featureCounter == 0 )
startGetFeature( request, format, layerCrs, &searchRect );
sendGetFeature( request, format, &feature, featCounter, layerCrs, fields, layerExcludedAttributes );
sendGetFeature( request, format, &feature, featCounter, layerCrs, attrIndexes, layerExcludedAttributes );
++featCounter;
++featureCounter;
}
@ -891,7 +894,6 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
if ( mFilter )
{
QgsFeatureRequest req;
req.setSubsetOfAttributes( attrIndexes );
if ( layer->wkbType() != QGis::WKBNoGeometry )
{
req.setFilterRect( searchRect )
@ -902,6 +904,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
req.setFlags( QgsFeatureRequest::NoGeometry );
mWithGeom = false;
}
req.setSubsetOfAttributes( attrIndexes );
QgsFeatureIterator fit = layer->getFeatures( req );
while ( fit.nextFeature( feature ) && featureCounter < maxFeat )
{
@ -915,7 +918,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
if ( featureCounter == 0 )
startGetFeature( request, format, layerCrs, &searchRect );
sendGetFeature( request, format, &feature, featureCounter, layerCrs, fields, layerExcludedAttributes );
sendGetFeature( request, format, &feature, featureCounter, layerCrs, attrIndexes, layerExcludedAttributes );
++featureCounter;
++featCounter;
}
@ -926,8 +929,8 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
}
else
{
//throw QgsMapServiceException( "RequestNotWellFormed", QString( "attrIndexes length: %1." ).arg( attrIndexes.count() ) );
QgsFeatureRequest req;
req.setSubsetOfAttributes( attrIndexes );
if ( layer->wkbType() != QGis::WKBNoGeometry )
{
req.setFilterRect( searchRect )
@ -938,6 +941,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
req.setFlags( QgsFeatureRequest::NoGeometry );
mWithGeom = false;
}
req.setSubsetOfAttributes( attrIndexes );
QgsFeatureIterator fit = layer->getFeatures( req );
while ( fit.nextFeature( feature ) && featureCounter < maxFeat )
{
@ -945,7 +949,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
if ( featureCounter == 0 )
startGetFeature( request, format, layerCrs, &searchRect );
sendGetFeature( request, format, &feature, featCounter, layerCrs, fields, layerExcludedAttributes );
sendGetFeature( request, format, &feature, featCounter, layerCrs, attrIndexes, layerExcludedAttributes );
++featCounter;
++featureCounter;
}
@ -1096,7 +1100,7 @@ void QgsWFSServer::startGetFeature( QgsRequestHandler& request, const QString& f
fcString = "";
}
void QgsWFSServer::sendGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, QgsCoordinateReferenceSystem& crs, QgsFields fields, QSet<QString> excludedAttributes ) /*const*/
void QgsWFSServer::sendGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, QgsCoordinateReferenceSystem& crs, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes ) /*const*/
{
if ( !feat->isValid() )
return;
@ -1109,7 +1113,7 @@ void QgsWFSServer::sendGetFeature( QgsRequestHandler& request, const QString& fo
fcString += " ";
else
fcString += " ,";
fcString += createFeatureGeoJSON( feat, crs, fields, excludedAttributes );
fcString += createFeatureGeoJSON( feat, crs, attrIndexes, excludedAttributes );
fcString += "\n";
result = fcString.toUtf8();
@ -1122,12 +1126,12 @@ void QgsWFSServer::sendGetFeature( QgsRequestHandler& request, const QString& fo
QDomElement featureElement;
if ( format == "GML3" )
{
featureElement = createFeatureGML3( feat, gmlDoc, crs, fields, excludedAttributes );
featureElement = createFeatureGML3( feat, gmlDoc, crs, attrIndexes, excludedAttributes );
gmlDoc.appendChild( featureElement );
}
else
{
featureElement = createFeatureGML2( feat, gmlDoc, crs, fields, excludedAttributes );
featureElement = createFeatureGML2( feat, gmlDoc, crs, attrIndexes, excludedAttributes );
gmlDoc.appendChild( featureElement );
}
@ -1570,7 +1574,7 @@ QgsFeatureIds QgsWFSServer::getFeatureIdsFromFilter( QDomElement filterElem, Qgs
return fids;
}
QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, QgsCoordinateReferenceSystem &, QgsFields fields, QSet<QString> excludedAttributes ) /*const*/
QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, QgsCoordinateReferenceSystem &, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes ) /*const*/
{
QString fStr = "{\"type\": \"Feature\",\n";
@ -1593,16 +1597,18 @@ QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, QgsCoordinateRefer
//read all attribute values from the feature
fStr += " \"properties\": {\n";
QgsAttributes featureAttributes = feat->attributes();
const QgsFields* fields = feat->fields();
int attributeCounter = 0;
for ( int i = 0; i < featureAttributes.count(); ++i )
for ( int i = 0; i < attrIndexes.count(); ++i )
{
QString attributeName = fields[i].name();
int idx = attrIndexes[i];
QString attributeName = fields->at(idx).name();
//skip attribute if it is excluded from WFS publication
if ( excludedAttributes.contains( attributeName ) )
{
continue;
}
QVariant val = featureAttributes[i];
QVariant val = featureAttributes[idx];
if ( attributeCounter == 0 )
fStr += " \"";
@ -1631,7 +1637,7 @@ QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, QgsCoordinateRefer
return fStr;
}
QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc, QgsCoordinateReferenceSystem& crs, QgsFields fields, QSet<QString> excludedAttributes ) /*const*/
QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc, QgsCoordinateReferenceSystem& crs, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes ) /*const*/
{
//gml:FeatureMember
QDomElement featureElement = doc.createElement( "gml:featureMember"/*wfs:FeatureMember*/ );
@ -1670,18 +1676,19 @@ QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc
//read all attribute values from the feature
QgsAttributes featureAttributes = feat->attributes();
for ( int i = 0; i < featureAttributes.count(); ++i )
const QgsFields* fields = feat->fields();
for ( int i = 0; i < attrIndexes.count(); ++i )
{
QString attributeName = fields[i].name();
//skip attribute if is explicitly excluded from WFS publication
int idx = attrIndexes[i];
QString attributeName = fields->at(idx).name();
//skip attribute if it is excluded from WFS publication
if ( excludedAttributes.contains( attributeName ) )
{
continue;
}
QDomElement fieldElem = doc.createElement( "qgs:" + attributeName.replace( QString( " " ), QString( "_" ) ) );
QDomText fieldText = doc.createTextNode( featureAttributes[i].toString() );
QDomText fieldText = doc.createTextNode( featureAttributes[idx].toString() );
fieldElem.appendChild( fieldText );
typeNameElement.appendChild( fieldElem );
}
@ -1689,7 +1696,7 @@ QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc
return featureElement;
}
QDomElement QgsWFSServer::createFeatureGML3( QgsFeature* feat, QDomDocument& doc, QgsCoordinateReferenceSystem& crs, QgsFields fields, QSet<QString> excludedAttributes ) /*const*/
QDomElement QgsWFSServer::createFeatureGML3( QgsFeature* feat, QDomDocument& doc, QgsCoordinateReferenceSystem& crs, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes ) /*const*/
{
//gml:FeatureMember
QDomElement featureElement = doc.createElement( "gml:featureMember"/*wfs:FeatureMember*/ );
@ -1728,18 +1735,19 @@ QDomElement QgsWFSServer::createFeatureGML3( QgsFeature* feat, QDomDocument& doc
//read all attribute values from the feature
QgsAttributes featureAttributes = feat->attributes();
for ( int i = 0; i < featureAttributes.count(); ++i )
const QgsFields* fields = feat->fields();
for ( int i = 0; i < attrIndexes.count(); ++i )
{
QString attributeName = fields[i].name();
//skip attribute if is explicitly excluded from WFS publication
int idx = attrIndexes[i];
QString attributeName = fields->at(idx).name();
//skip attribute if it is excluded from WFS publication
if ( excludedAttributes.contains( attributeName ) )
{
continue;
}
QDomElement fieldElem = doc.createElement( "qgs:" + attributeName.replace( QString( " " ), QString( "_" ) ) );
QDomText fieldText = doc.createTextNode( featureAttributes[i].toString() );
QDomText fieldText = doc.createTextNode( featureAttributes[idx].toString() );
fieldElem.appendChild( fieldText );
typeNameElement.appendChild( fieldElem );
}

View File

@ -99,20 +99,20 @@ class QgsWFSServer
protected:
void startGetFeature( QgsRequestHandler& request, const QString& format, QgsCoordinateReferenceSystem& crs, QgsRectangle* rect );
void sendGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, QgsCoordinateReferenceSystem& crs, QgsFields fields, QSet<QString> excludedAttributes );
void sendGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, QgsCoordinateReferenceSystem& crs, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes );
void endGetFeature( QgsRequestHandler& request, const QString& format );
//method for transaction
QgsFeatureIds getFeatureIdsFromFilter( QDomElement filter, QgsVectorLayer* layer );
//methods to write GeoJSON
QString createFeatureGeoJSON( QgsFeature* feat, QgsCoordinateReferenceSystem& crs, QgsFields fields, QSet<QString> excludedAttributes ) /*const*/;
QString createFeatureGeoJSON( QgsFeature* feat, QgsCoordinateReferenceSystem& crs, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes ) /*const*/;
//methods to write GML2
QDomElement createFeatureGML2( QgsFeature* feat, QDomDocument& doc, QgsCoordinateReferenceSystem& crs, QgsFields fields, QSet<QString> excludedAttributes ) /*const*/;
QDomElement createFeatureGML2( QgsFeature* feat, QDomDocument& doc, QgsCoordinateReferenceSystem& crs, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes ) /*const*/;
//methods to write GML3
QDomElement createFeatureGML3( QgsFeature* feat, QDomDocument& doc, QgsCoordinateReferenceSystem& crs, QgsFields fields, QSet<QString> excludedAttributes ) /*const*/;
QDomElement createFeatureGML3( QgsFeature* feat, QDomDocument& doc, QgsCoordinateReferenceSystem& crs, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes ) /*const*/;
};
#endif