Skip to content

Commit f80a1f5

Browse files
authored
Merge pull request #4687 from rldhont/server-wms-dxf-writer
[Server] WMS DXF writer refactoring
2 parents 00b2d24 + 8df3391 commit f80a1f5

File tree

5 files changed

+132
-105
lines changed

5 files changed

+132
-105
lines changed

src/server/services/wms/qgsdxfwriter.cpp

+6-103
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ email : david dot marteau at 3liz dot com
2020
#include "qgsmaplayer.h"
2121
#include "qgsvectorlayer.h"
2222
#include "qgsdxfexport.h"
23+
#include "qgswmsrenderer.h"
2324

2425
namespace QgsWms
2526
{
@@ -44,118 +45,20 @@ namespace QgsWms
4445
return options;
4546
}
4647

47-
void readDxfLayerSettings( const QgsServerRequest::Parameters &parameters, QgsWmsConfigParser *configParser,
48-
QList< QPair<QgsVectorLayer *, int > > &layers,
49-
const QMap<QString, QString> &options )
50-
{
51-
QSet<QString> wfsLayers = QSet<QString>::fromList( configParser->wfsLayerNames() );
52-
53-
QStringList layerAttributes;
54-
QMap<QString, QString>::const_iterator layerAttributesIt = options.find( QStringLiteral( "LAYERATTRIBUTES" ) );
55-
if ( layerAttributesIt != options.constEnd() )
56-
{
57-
layerAttributes = options.value( QStringLiteral( "LAYERATTRIBUTES" ) ).split( ',' );
58-
}
59-
60-
//LAYERS and STYLES
61-
QStringList layerList, styleList;
62-
readLayersAndStyles( parameters, layerList, styleList );
63-
64-
for ( int i = 0; i < layerList.size(); ++i )
65-
{
66-
QString layerName = layerList.at( i );
67-
QString styleName;
68-
if ( styleList.size() > i )
69-
{
70-
styleName = styleList.at( i );
71-
}
72-
73-
QList<QgsMapLayer *> layerList = configParser->mapLayerFromStyle( layerName, styleName );
74-
for ( auto layerIt = layerList.constBegin(); layerIt != layerList.constEnd(); ++layerIt )
75-
{
76-
if ( !( *layerIt ) )
77-
{
78-
continue;
79-
}
80-
81-
//vector layer?
82-
if ( ( *layerIt )->type() != QgsMapLayer::VectorLayer )
83-
{
84-
continue;
85-
}
86-
87-
QgsVectorLayer *vlayer = static_cast<QgsVectorLayer *>( *layerIt );
88-
89-
int layerAttribute = -1;
90-
if ( layerAttributes.size() > i )
91-
{
92-
layerAttribute = vlayer->pendingFields().indexFromName( layerAttributes.at( i ) );
93-
}
94-
95-
//only wfs layers are allowed to be published
96-
if ( !wfsLayers.contains( vlayer->name() ) )
97-
{
98-
continue;
99-
}
100-
101-
layers.append( qMakePair( vlayer, layerAttribute ) );
102-
}
103-
}
104-
}
105-
10648
}
10749

108-
void writeAsDxf( QgsServerInterface *serverIface, const QString &version, const QgsServerRequest &request, QgsServerResponse &response )
50+
void writeAsDxf( QgsServerInterface *serverIface, const QgsProject *project,
51+
const QString &version, const QgsServerRequest &request,
52+
QgsServerResponse &response )
10953
{
11054
Q_UNUSED( version );
11155

112-
QgsWmsConfigParser *configParser = getConfigParser( serverIface );
113-
114-
QgsDxfExport dxf;
11556
QgsServerRequest::Parameters params = request.parameters();
116-
117-
QgsRectangle extent = parseBbox( params.value( QStringLiteral( "BBOX" ) ) );
118-
dxf.setExtent( extent );
57+
QgsRenderer renderer( serverIface, project, params, getConfigParser( serverIface ) );
11958

12059
QMap<QString, QString> formatOptionsMap = parseFormatOptions( params.value( QStringLiteral( "FORMAT_OPTIONS" ) ) );
12160

122-
QList< QPair<QgsVectorLayer *, int > > layers;
123-
readDxfLayerSettings( params, configParser, layers, formatOptionsMap );
124-
dxf.addLayers( layers );
125-
126-
dxf.setLayerTitleAsName( formatOptionsMap.contains( QStringLiteral( "USE_TITLE_AS_LAYERNAME" ) ) );
127-
128-
//MODE
129-
QMap<QString, QString>::const_iterator modeIt = formatOptionsMap.find( QStringLiteral( "MODE" ) );
130-
131-
QgsDxfExport::SymbologyExport se;
132-
if ( modeIt == formatOptionsMap.constEnd() )
133-
{
134-
se = QgsDxfExport::NoSymbology;
135-
}
136-
else
137-
{
138-
if ( modeIt->compare( QLatin1String( "SymbolLayerSymbology" ), Qt::CaseInsensitive ) == 0 )
139-
{
140-
se = QgsDxfExport::SymbolLayerSymbology;
141-
}
142-
else if ( modeIt->compare( QLatin1String( "FeatureSymbology" ), Qt::CaseInsensitive ) == 0 )
143-
{
144-
se = QgsDxfExport::FeatureSymbology;
145-
}
146-
else
147-
{
148-
se = QgsDxfExport::NoSymbology;
149-
}
150-
}
151-
dxf.setSymbologyExport( se );
152-
153-
//SCALE
154-
QMap<QString, QString>::const_iterator scaleIt = formatOptionsMap.find( QStringLiteral( "SCALE" ) );
155-
if ( scaleIt != formatOptionsMap.constEnd() )
156-
{
157-
dxf.setSymbologyScale( scaleIt->toDouble() );
158-
}
61+
QgsDxfExport dxf = renderer.getDxf( formatOptionsMap );
15962

16063
QString codec = QStringLiteral( "ISO-8859-1" );
16164
QMap<QString, QString>::const_iterator codecIt = formatOptionsMap.find( QStringLiteral( "CODEC" ) );

src/server/services/wms/qgsdxfwriter.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ namespace QgsWms
2020

2121
/** Output GetMap response in Dfx format
2222
*/
23-
void writeAsDxf( QgsServerInterface *serverIface, const QString &version, const QgsServerRequest &request,
23+
void writeAsDxf( QgsServerInterface *serverIface, const QgsProject *project,
24+
const QString &version, const QgsServerRequest &request,
2425
QgsServerResponse &response );
2526

2627
} // samespace QgsWms

src/server/services/wms/qgswms.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ namespace QgsWms
9696
QString format = params.value( QStringLiteral( "FORMAT" ) );
9797
if QSTR_COMPARE( format, "application/dxf" )
9898
{
99-
writeAsDxf( mServerIface, versionString, request, response );
99+
writeAsDxf( mServerIface, project, versionString, request, response );
100100
}
101101
else
102102
{

src/server/services/wms/qgswmsrenderer.cpp

+117
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
#include "qgsvectorlayerlabeling.h"
6767
#include "qgspallabeling.h"
6868
#include "qgslayerrestorer.h"
69+
#include "qgsdxfexport.h"
6970

7071
#include <QImage>
7172
#include <QPainter>
@@ -900,6 +901,122 @@ namespace QgsWms
900901
return image.release();
901902
}
902903

904+
QgsDxfExport QgsRenderer::getDxf( const QMap<QString, QString> &options )
905+
{
906+
QgsDxfExport dxf;
907+
908+
// set extent
909+
QgsRectangle extent = mWmsParameters.bboxAsRectangle();
910+
dxf.setExtent( extent );
911+
912+
// get layers parameters
913+
QList<QgsMapLayer *> layers;
914+
QList<QgsWmsParametersLayer> params = mWmsParameters.layersParameters();
915+
916+
// init layer restorer before doing anything
917+
std::unique_ptr<QgsLayerRestorer> restorer;
918+
restorer.reset( new QgsLayerRestorer( mNicknameLayers.values() ) );
919+
920+
// init stylized layers according to LAYERS/STYLES or SLD
921+
QString sld = mWmsParameters.sld();
922+
if ( !sld.isEmpty() )
923+
{
924+
layers = sldStylizedLayers( sld );
925+
}
926+
else
927+
{
928+
layers = stylizedLayers( params );
929+
}
930+
931+
// layer attributes options
932+
QStringList layerAttributes;
933+
QMap<QString, QString>::const_iterator layerAttributesIt = options.find( QStringLiteral( "LAYERATTRIBUTES" ) );
934+
if ( layerAttributesIt != options.constEnd() )
935+
{
936+
layerAttributes = options.value( QStringLiteral( "LAYERATTRIBUTES" ) ).split( ',' );
937+
}
938+
939+
// only wfs layers are allowed to be published
940+
QStringList wfsLayerIds = QgsServerProjectUtils::wfsLayerIds( *mProject );
941+
942+
// get dxf layers
943+
QList< QPair<QgsVectorLayer *, int > > dxfLayers;
944+
int layerIdx = -1;
945+
Q_FOREACH ( QgsMapLayer *layer, layers )
946+
{
947+
layerIdx++;
948+
if ( layer->type() != QgsMapLayer::VectorLayer )
949+
continue;
950+
if ( !wfsLayerIds.contains( layer->id() ) )
951+
continue;
952+
Q_FOREACH ( QgsWmsParametersLayer param, params )
953+
{
954+
if ( param.mNickname == layerNickname( *layer ) )
955+
{
956+
checkLayerReadPermissions( layer );
957+
958+
setLayerOpacity( layer, param.mOpacity );
959+
960+
setLayerFilter( layer, param.mFilter );
961+
962+
setLayerAccessControlFilter( layer );
963+
964+
break;
965+
}
966+
}
967+
// cast for dxf layers
968+
QgsVectorLayer *vlayer = static_cast<QgsVectorLayer *>( layer );
969+
970+
// get the layer attribute used in dxf
971+
int layerAttribute = -1;
972+
if ( layerAttributes.size() > layerIdx )
973+
{
974+
layerAttribute = vlayer->pendingFields().indexFromName( layerAttributes.at( layerIdx ) );
975+
}
976+
977+
dxfLayers.append( qMakePair( vlayer, layerAttribute ) );
978+
}
979+
980+
// add layers to dxf
981+
dxf.addLayers( dxfLayers );
982+
983+
dxf.setLayerTitleAsName( options.contains( QStringLiteral( "USE_TITLE_AS_LAYERNAME" ) ) );
984+
985+
//MODE
986+
QMap<QString, QString>::const_iterator modeIt = options.find( QStringLiteral( "MODE" ) );
987+
988+
QgsDxfExport::SymbologyExport se;
989+
if ( modeIt == options.constEnd() )
990+
{
991+
se = QgsDxfExport::NoSymbology;
992+
}
993+
else
994+
{
995+
if ( modeIt->compare( QStringLiteral( "SymbolLayerSymbology" ), Qt::CaseInsensitive ) == 0 )
996+
{
997+
se = QgsDxfExport::SymbolLayerSymbology;
998+
}
999+
else if ( modeIt->compare( QStringLiteral( "FeatureSymbology" ), Qt::CaseInsensitive ) == 0 )
1000+
{
1001+
se = QgsDxfExport::FeatureSymbology;
1002+
}
1003+
else
1004+
{
1005+
se = QgsDxfExport::NoSymbology;
1006+
}
1007+
}
1008+
dxf.setSymbologyExport( se );
1009+
1010+
//SCALE
1011+
QMap<QString, QString>::const_iterator scaleIt = options.find( QStringLiteral( "SCALE" ) );
1012+
if ( scaleIt != options.constEnd() )
1013+
{
1014+
dxf.setSymbologyScale( scaleIt->toDouble() );
1015+
}
1016+
1017+
return dxf;
1018+
}
1019+
9031020
static void infoPointToMapCoordinates( int i, int j, QgsPointXY *infoPoint, const QgsMapSettings &mapSettings )
9041021
{
9051022
//check if i, j are in the pixel range of the image

src/server/services/wms/qgswmsrenderer.h

+6
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class QgsVectorLayer;
4646
class QgsSymbol;
4747
class QgsSymbol;
4848
class QgsAccessControl;
49+
class QgsDxfExport;
4950

5051
class QColor;
5152
class QFile;
@@ -101,6 +102,11 @@ namespace QgsWms
101102
QImage *getMap( QgsMapSettings &mapSettings, HitTest *hitTest = nullptr );
102103
QImage *getMapOld( QgsMapSettings &mapSettings, HitTest *hitTest = nullptr );
103104

105+
/** Returns the map as DXF data
106+
\param options: extracted from the FORMAT_OPTIONS parameter
107+
\returns the map as DXF data
108+
\since QGIS 3.0*/
109+
QgsDxfExport getDxf( const QMap<QString, QString> &options );
104110

105111
/** Returns printed page as binary
106112
\param formatString out: format of the print output (e.g. pdf, svg, png, ...)

0 commit comments

Comments
 (0)