Skip to content

Commit a7a85aa

Browse files
committedAug 18, 2011
[FEATURE]: possibility to select features in QGIS server by layername / id in GetMap and GetPrint
1 parent f32cd21 commit a7a85aa

File tree

3 files changed

+105
-6
lines changed

3 files changed

+105
-6
lines changed
 

‎src/mapserver/qgsprojectparser.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "qgslogger.h"
2323
#include "qgsmapserviceexception.h"
2424
#include "qgsrasterlayer.h"
25+
#include "qgsrenderer.h"
2526
#include "qgsvectorlayer.h"
2627

2728
#include "qgscomposition.h"
@@ -42,6 +43,7 @@ QgsProjectParser::QgsProjectParser( QDomDocument* xmlDoc, const QString& filePat
4243
{
4344
mOutputUnits = QgsMapRenderer::Millimeters;
4445
setLegendParametersFromProject();
46+
QgsRenderer::setSelectionColor( QColor( 255, 255, 0 ) );
4547
}
4648

4749
QgsProjectParser::~QgsProjectParser()

‎src/mapserver/qgswmsserver.cpp

Lines changed: 96 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,8 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
410410
}
411411
delete theImage;
412412

413-
QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters( layersList, layerIdList );
413+
QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters( layersList );
414+
QStringList selectedLayerIdList = applyFeatureSelections( layersList );
414415

415416
//GetPrint request needs a template parameter
416417
std::map<QString, QString>::const_iterator templateIt = mParameterMap.find( "TEMPLATE" );
@@ -423,6 +424,7 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
423424
if ( !c )
424425
{
425426
restoreLayerFilters( originalLayerFilters );
427+
clearFeatureSelections( selectedLayerIdList );
426428
return 0;
427429
}
428430

@@ -480,6 +482,7 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
480482
{
481483
delete c;
482484
restoreLayerFilters( originalLayerFilters );
485+
clearFeatureSelections( selectedLayerIdList );
483486
return 0;
484487
}
485488

@@ -523,6 +526,7 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
523526
throw QgsMapServiceException( "InvalidFormat", "Output format '" + formatString + "' is not supported in the GetPrint request" );
524527
}
525528
restoreLayerFilters( originalLayerFilters );
529+
clearFeatureSelections( selectedLayerIdList );
526530

527531
delete c;
528532
return ba;
@@ -552,9 +556,13 @@ QImage* QgsWMSServer::getMap()
552556
QPainter thePainter( theImage );
553557
thePainter.setRenderHint( QPainter::Antialiasing ); //make it look nicer
554558

555-
QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters( layersList, layerIdList );
559+
QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters( layersList );
560+
QStringList selectedLayerIdList = applyFeatureSelections( layersList );
561+
556562
mMapRenderer->render( &thePainter );
563+
557564
restoreLayerFilters( originalLayerFilters );
565+
clearFeatureSelections( selectedLayerIdList );
558566

559567
QgsMapLayerRegistry::instance()->mapLayers().clear();
560568
return theImage;
@@ -693,7 +701,7 @@ int QgsWMSServer::getFeatureInfo( QDomDocument& result )
693701

694702
//get the layer registered in QgsMapLayerRegistry and apply possible filters
695703
QStringList layerIds = layerSet( layersList, stylesList, mMapRenderer->destinationCrs() );
696-
QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters( layersList, layerIds );
704+
QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters( layersList );
697705

698706
QDomElement getFeatureInfoElement = result.createElement( "GetFeatureInfoResponse" );
699707
result.appendChild( getFeatureInfoElement );
@@ -1617,11 +1625,11 @@ void QgsWMSServer::drawRasterSymbol( QgsComposerLegendItem* item, QPainter* p, d
16171625
p->drawRect( QRectF( boxSpace, currentY + yDownShift, symbolWidth, symbolHeight ) );
16181626
}
16191627

1620-
QMap<QString, QString> QgsWMSServer::applyRequestedLayerFilters( const QStringList& layerList, const QStringList& layerIds ) const
1628+
QMap<QString, QString> QgsWMSServer::applyRequestedLayerFilters( const QStringList& layerList ) const
16211629
{
16221630
QMap<QString, QString> filterMap;
16231631

1624-
if ( layerList.isEmpty() || layerIds.isEmpty() )
1632+
if ( layerList.isEmpty() )
16251633
{
16261634
return filterMap;
16271635
}
@@ -1818,3 +1826,86 @@ bool QgsWMSServer::testFilterStringSafety( const QString& filter ) const
18181826

18191827
return true;
18201828
}
1829+
1830+
QStringList QgsWMSServer::applyFeatureSelections( const QStringList& layerList ) const
1831+
{
1832+
QStringList layersWithSelections;
1833+
if ( layerList.isEmpty() )
1834+
{
1835+
return layersWithSelections;
1836+
}
1837+
1838+
std::map<QString, QString>::const_iterator selectionIt = mParameterMap.find( "SELECTION" );
1839+
if ( selectionIt == mParameterMap.end() )
1840+
{
1841+
return layersWithSelections;
1842+
}
1843+
1844+
QString selectionString = selectionIt->second;
1845+
QStringList selectionLayerList = selectionString.split( ";" );
1846+
QStringList::const_iterator selectionLayerIt = selectionLayerList.constBegin();
1847+
for ( ; selectionLayerIt != selectionLayerList.constEnd(); ++selectionLayerIt )
1848+
{
1849+
//separate layer name from id list
1850+
QStringList layerIdSplit = selectionLayerIt->split( ":" );
1851+
if ( layerIdSplit.size() < 2 )
1852+
{
1853+
continue;
1854+
}
1855+
1856+
//find layerId for layer name
1857+
QString layerName = layerIdSplit.at( 0 );
1858+
QgsVectorLayer* vLayer = 0;
1859+
1860+
QMap<QString, QgsMapLayer*>& layerMap = QgsMapLayerRegistry::instance()->mapLayers();
1861+
QMap<QString, QgsMapLayer*>::iterator layerIt = layerMap.begin();
1862+
for ( ; layerIt != layerMap.end(); ++layerIt )
1863+
{
1864+
if ( layerIt.value() && layerIt.value()->name() == layerName )
1865+
{
1866+
vLayer = qobject_cast<QgsVectorLayer*>( layerIt.value() );
1867+
layersWithSelections.push_back( vLayer->id() );
1868+
break;
1869+
}
1870+
}
1871+
1872+
if ( !vLayer )
1873+
{
1874+
continue;
1875+
}
1876+
1877+
QStringList idList = layerIdSplit.at( 1 ).split( "," );
1878+
QgsFeatureIds selectedIds;
1879+
1880+
QStringList::const_iterator idIt = idList.constBegin();
1881+
for ( ; idIt != idList.constEnd(); ++idIt )
1882+
{
1883+
selectedIds.insert( STRING_TO_FID( *idIt ) );
1884+
}
1885+
1886+
vLayer->setSelectedFeatures( selectedIds );
1887+
}
1888+
1889+
1890+
return layersWithSelections;
1891+
}
1892+
1893+
void QgsWMSServer::clearFeatureSelections( const QStringList& layerIds ) const
1894+
{
1895+
QMap<QString, QgsMapLayer*>& layerMap = QgsMapLayerRegistry::instance()->mapLayers();
1896+
1897+
QStringList::const_iterator layerIdIt = layerIds.constBegin();
1898+
for ( ; layerIdIt != layerIds.constEnd(); ++layerIdIt )
1899+
{
1900+
QMap<QString, QgsMapLayer*>::iterator layerIt = layerMap.find( *layerIdIt );
1901+
if ( layerIt != layerMap.end() )
1902+
{
1903+
QgsVectorLayer* vlayer = qobject_cast<QgsVectorLayer*>( layerIt.value() );
1904+
if ( vlayer )
1905+
{
1906+
vlayer->setSelectedFeatures( QgsFeatureIds() );
1907+
}
1908+
}
1909+
}
1910+
return;
1911+
}

‎src/mapserver/qgswmsserver.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,13 +142,19 @@ class QgsWMSServer
142142

143143
/**Apply filter (subset) strings from the request to the layers. Example: '&FILTER=<layer1>:"AND property > 100",<layer2>:"AND bla = 'hallo!'" '
144144
@return a map with the original filters ( layer id / filter string )*/
145-
QMap<QString, QString> applyRequestedLayerFilters( const QStringList& layerList, const QStringList& layerIds ) const;
145+
QMap<QString, QString> applyRequestedLayerFilters( const QStringList& layerList ) const;
146146
/**Restores the original layer filters*/
147147
void restoreLayerFilters( const QMap < QString, QString >& filterMap ) const;
148148
/**Tests if a filter sql string is allowed (safe)
149149
@return true in case of success, false if string seems unsafe*/
150150
bool testFilterStringSafety( const QString& filter ) const;
151151

152+
/**Select vector features with ids specified in parameter SELECTED, e.g. ...&SELECTED=layer1:1,2,9;layer2:3,5,10&...
153+
@return list with layer ids where selections have been created*/
154+
QStringList applyFeatureSelections( const QStringList& layerList ) const;
155+
/**Clear all feature selections in the given layers*/
156+
void clearFeatureSelections( const QStringList& layerIds ) const;
157+
152158
/**Map containing the WMS parameters*/
153159
std::map<QString, QString> mParameterMap;
154160
QgsConfigParser* mConfigParser;

0 commit comments

Comments
 (0)
Please sign in to comment.