QString QgsWFSConnection::uriGetFeature( QString typeName, QString crsString, QString filter, QgsRectangle bBox ) const { //get CRS if ( !crsString.isEmpty() ) { crsString.prepend( "&SRSNAME=" ); } QString filterString; //if the xml comes from the dialog, it needs to be a string to pass the validity test if ( filter.startsWith( "'" ) && filter.endsWith( "'" ) && filter.size() > 1 ) { filter.chop( 1 ); filter.remove( 0, 1 ); } if ( !filter.isEmpty() ) { //test if filterString is already an OGC filter xml QDomDocument filterDoc; if ( !filterDoc.setContent( filter ) ) { //if not, if must be a QGIS expression QgsExpression filterExpression( filter ); if ( !filterExpression.toOGCFilter( filterDoc ) ) { //error } } filterString = "&FILTER=" + filterDoc.toString(); } QString bBoxString; if ( !bBox.isEmpty() ) { bBoxString = QString( "&BBOX=%1,%2,%3,%4" ) .arg( bBox.xMinimum(), 0, 'f' ) .arg( bBox.yMinimum(), 0, 'f' ) .arg( bBox.xMaximum(), 0, 'f' ) .arg( bBox.yMaximum(), 0, 'f' ); } QString uri = mUri; if ( !( uri.contains( "?" ) ) ) { uri.append( "?" ); } //add a wfs layer to the map uri += "SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=" + typeName + crsString + bBoxString + filterString; QgsDebugMsg( uri ); return uri; }
void TapParameterDialog::filterActionTriggered() { FilterAction *fa = qobject_cast<FilterAction *>(QObject::sender()); QString filter_expr = filterExpression(); if (!fa || filter_expr.isEmpty()) { return; } emit filterAction(filter_expr, fa->action(), fa->actionType()); }
QString QgsWFSCapabilities::uriGetFeature( QString typeName, QString crsString, QString filter, QgsRectangle bBox ) const { //get CRS if ( !crsString.isEmpty() ) { crsString.prepend( "&SRSNAME=" ); } QString filterString; //if the xml comes from the dialog, it needs to be a string to pass the validity test if ( filter.startsWith( "'" ) && filter.endsWith( "'" ) && filter.size() > 1 ) { filter.chop( 1 ); filter.remove( 0, 1 ); } if ( !filter.isEmpty() ) { //test if filterString is already an OGC filter xml QDomDocument filterDoc; if ( !filterDoc.setContent( filter ) ) { //if not, if must be a QGIS expression QgsExpression filterExpression( filter ); QDomElement filterElem = QgsOgcUtils::expressionToOgcFilter( filterExpression, filterDoc ); if ( !filterElem.isNull() ) { filterDoc.appendChild( filterElem ); } } filterString = "&FILTER=" + filterDoc.toString(); } QString bBoxString; if ( !bBox.isEmpty() ) { bBoxString = QString( "&BBOX=%1,%2,%3,%4" ) .arg( qgsDoubleToString( bBox.xMinimum() ) ) .arg( qgsDoubleToString( bBox.yMinimum() ) ) .arg( qgsDoubleToString( bBox.xMaximum() ) ) .arg( qgsDoubleToString( bBox.yMaximum() ) ); } QString uri = mBaseUrl; //add a wfs layer to the map uri += "SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=" + typeName + crsString + bBoxString + filterString; QgsDebugMsg( uri ); return uri; }
bool QgsLayoutAtlas::setFilterExpression( const QString &expression, QString &errorString ) { errorString.clear(); mFilterExpression = expression; QgsExpression filterExpression( mFilterExpression ); if ( filterExpression.hasParserError() ) { errorString = filterExpression.parserErrorString(); return false; } return true; }
int QgsLayoutAtlas::updateFeatures() { mCurrentFeatureNo = -1; if ( !mCoverageLayer ) { return 0; } QgsExpressionContext expressionContext = createExpressionContext(); QString error; updateFilenameExpression( error ); // select all features with all attributes QgsFeatureRequest req; req.setExpressionContext( expressionContext ); mFilterParserError.clear(); if ( mFilterFeatures && !mFilterExpression.isEmpty() ) { QgsExpression filterExpression( mFilterExpression ); if ( filterExpression.hasParserError() ) { mFilterParserError = filterExpression.parserErrorString(); return 0; } //filter good to go req.setFilterExpression( mFilterExpression ); } QgsFeatureIterator fit = mCoverageLayer->getFeatures( req ); std::unique_ptr<QgsExpression> nameExpression; if ( !mPageNameExpression.isEmpty() ) { nameExpression = qgis::make_unique< QgsExpression >( mPageNameExpression ); if ( nameExpression->hasParserError() ) { nameExpression.reset( nullptr ); } else { nameExpression->prepare( &expressionContext ); } } // We cannot use nextFeature() directly since the feature pointer is rewinded by the rendering process // We thus store the feature ids for future extraction QgsFeature feat; mFeatureIds.clear(); mFeatureKeys.clear(); std::unique_ptr<QgsExpression> sortExpression; if ( mSortFeatures && !mSortExpression.isEmpty() ) { sortExpression = qgis::make_unique< QgsExpression >( mSortExpression ); if ( sortExpression->hasParserError() ) { sortExpression.reset( nullptr ); } else { sortExpression->prepare( &expressionContext ); } } while ( fit.nextFeature( feat ) ) { expressionContext.setFeature( feat ); QString pageName; if ( nameExpression ) { QVariant result = nameExpression->evaluate( &expressionContext ); if ( nameExpression->hasEvalError() ) { QgsMessageLog::logMessage( tr( "Atlas name eval error: %1" ).arg( nameExpression->evalErrorString() ), tr( "Layout" ) ); } pageName = result.toString(); } mFeatureIds.push_back( qMakePair( feat.id(), pageName ) ); if ( sortExpression ) { QVariant result = sortExpression->evaluate( &expressionContext ); if ( sortExpression->hasEvalError() ) { QgsMessageLog::logMessage( tr( "Atlas sort eval error: %1" ).arg( sortExpression->evalErrorString() ), tr( "Layout" ) ); } mFeatureKeys.insert( feat.id(), result ); } } // sort features, if asked for if ( !mFeatureKeys.isEmpty() ) { AtlasFeatureSorter sorter( mFeatureKeys, mSortAscending ); std::sort( mFeatureIds.begin(), mFeatureIds.end(), sorter ); // clazy:exclude=detaching-member } emit numberFeaturesChanged( mFeatureIds.size() ); return mFeatureIds.size(); }