@@ -410,7 +410,8 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
410
410
}
411
411
delete theImage;
412
412
413
- QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters ( layersList, layerIdList );
413
+ QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters ( layersList );
414
+ QStringList selectedLayerIdList = applyFeatureSelections ( layersList );
414
415
415
416
// GetPrint request needs a template parameter
416
417
std::map<QString, QString>::const_iterator templateIt = mParameterMap .find ( " TEMPLATE" );
@@ -423,6 +424,7 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
423
424
if ( !c )
424
425
{
425
426
restoreLayerFilters ( originalLayerFilters );
427
+ clearFeatureSelections ( selectedLayerIdList );
426
428
return 0 ;
427
429
}
428
430
@@ -480,6 +482,7 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
480
482
{
481
483
delete c;
482
484
restoreLayerFilters ( originalLayerFilters );
485
+ clearFeatureSelections ( selectedLayerIdList );
483
486
return 0 ;
484
487
}
485
488
@@ -523,6 +526,7 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
523
526
throw QgsMapServiceException ( " InvalidFormat" , " Output format '" + formatString + " ' is not supported in the GetPrint request" );
524
527
}
525
528
restoreLayerFilters ( originalLayerFilters );
529
+ clearFeatureSelections ( selectedLayerIdList );
526
530
527
531
delete c;
528
532
return ba;
@@ -552,9 +556,13 @@ QImage* QgsWMSServer::getMap()
552
556
QPainter thePainter ( theImage );
553
557
thePainter.setRenderHint ( QPainter::Antialiasing ); // make it look nicer
554
558
555
- QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters ( layersList, layerIdList );
559
+ QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters ( layersList );
560
+ QStringList selectedLayerIdList = applyFeatureSelections ( layersList );
561
+
556
562
mMapRenderer ->render ( &thePainter );
563
+
557
564
restoreLayerFilters ( originalLayerFilters );
565
+ clearFeatureSelections ( selectedLayerIdList );
558
566
559
567
QgsMapLayerRegistry::instance ()->mapLayers ().clear ();
560
568
return theImage;
@@ -693,7 +701,7 @@ int QgsWMSServer::getFeatureInfo( QDomDocument& result )
693
701
694
702
// get the layer registered in QgsMapLayerRegistry and apply possible filters
695
703
QStringList layerIds = layerSet ( layersList, stylesList, mMapRenderer ->destinationCrs () );
696
- QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters ( layersList, layerIds );
704
+ QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters ( layersList );
697
705
698
706
QDomElement getFeatureInfoElement = result.createElement ( " GetFeatureInfoResponse" );
699
707
result.appendChild ( getFeatureInfoElement );
@@ -1617,11 +1625,11 @@ void QgsWMSServer::drawRasterSymbol( QgsComposerLegendItem* item, QPainter* p, d
1617
1625
p->drawRect ( QRectF ( boxSpace, currentY + yDownShift, symbolWidth, symbolHeight ) );
1618
1626
}
1619
1627
1620
- QMap<QString, QString> QgsWMSServer::applyRequestedLayerFilters ( const QStringList& layerList, const QStringList& layerIds ) const
1628
+ QMap<QString, QString> QgsWMSServer::applyRequestedLayerFilters ( const QStringList& layerList ) const
1621
1629
{
1622
1630
QMap<QString, QString> filterMap;
1623
1631
1624
- if ( layerList.isEmpty () || layerIds. isEmpty () )
1632
+ if ( layerList.isEmpty () )
1625
1633
{
1626
1634
return filterMap;
1627
1635
}
@@ -1818,3 +1826,86 @@ bool QgsWMSServer::testFilterStringSafety( const QString& filter ) const
1818
1826
1819
1827
return true ;
1820
1828
}
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
+ }
0 commit comments