Skip to content

Commit f921f82

Browse files
committedJan 28, 2019
Add GetFeatureInfo in JSON for vector layers
1 parent f6bfc98 commit f921f82

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed
 

‎src/server/services/wms/qgswmsrenderer.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020

2121
#include "qgswmsutils.h"
22+
#include "qgsjsonutils.h"
2223
#include "qgswmsrenderer.h"
2324
#include "qgsfilterrestorer.h"
2425
#include "qgsexception.h"
@@ -1119,6 +1120,8 @@ namespace QgsWms
11191120
ba = convertFeatureInfoToText( result );
11201121
else if ( infoFormat == QgsWmsParameters::Format::HTML )
11211122
ba = convertFeatureInfoToHtml( result );
1123+
else if ( infoFormat == QgsWmsParameters::Format::JSON )
1124+
ba = convertFeatureInfoToJson( layers, result );
11221125
else
11231126
ba = result.toByteArray();
11241127

@@ -2275,6 +2278,72 @@ namespace QgsWms
22752278
return featureInfoString.toUtf8();
22762279
}
22772280

2281+
QByteArray QgsRenderer::convertFeatureInfoToJson( const QList<QgsMapLayer *> &layers, const QDomDocument &doc ) const
2282+
{
2283+
QString json;
2284+
2285+
const QDomNodeList layerList = doc.elementsByTagName( QStringLiteral( "Layer" ) );
2286+
for ( int i = 0; i < layerList.size(); ++i )
2287+
{
2288+
const QDomElement layerElem = layerList.at( i ).toElement();
2289+
const QString layerName = layerElem.attribute( QStringLiteral( "name" ) );
2290+
2291+
QgsMapLayer *layer;
2292+
for ( QgsMapLayer *l : layers )
2293+
{
2294+
if ( layerNickname( *l ).compare( layerName ) == 0 )
2295+
{
2296+
layer = l;
2297+
}
2298+
}
2299+
2300+
if ( ! layer )
2301+
continue;
2302+
2303+
if ( layer->type() == QgsMapLayer::VectorLayer )
2304+
{
2305+
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer );
2306+
2307+
// search features to export
2308+
QgsFeatureList features;
2309+
QgsAttributeList attributes;
2310+
const QDomNodeList featuresNode = layerElem.elementsByTagName( QStringLiteral( "Feature" ) );
2311+
if ( !featuresNode.isEmpty() )
2312+
{
2313+
for ( int j = 0; j < featuresNode.size(); ++j )
2314+
{
2315+
const QDomElement featureNode = featuresNode.at( j ).toElement();
2316+
const qint64 fid = featureNode.attribute( QStringLiteral( "id" ) ).toLongLong();
2317+
const QgsFeature feature = vl->getFeature( fid );
2318+
features.append( feature );
2319+
2320+
// search attributes to export
2321+
if ( not attributes.isEmpty() )
2322+
continue;
2323+
2324+
const QDomNodeList attributesNode = featureNode.elementsByTagName( QStringLiteral( "Attribute" ) );
2325+
for ( int k = 0; k < attributesNode.size(); ++k )
2326+
{
2327+
const QDomElement attributeElement = attributesNode.at( k ).toElement();
2328+
const QString fieldName = attributeElement.attribute( QStringLiteral( "name" ) );
2329+
2330+
attributes << feature.fieldNameIndex( fieldName );
2331+
}
2332+
}
2333+
}
2334+
2335+
// export
2336+
QgsJsonExporter exporter( vl );
2337+
json.append( exporter.exportFeatures( features ) );
2338+
}
2339+
else // raster layer
2340+
{
2341+
}
2342+
}
2343+
2344+
return json.toUtf8();
2345+
}
2346+
22782347
QDomElement QgsRenderer::createFeatureGML(
22792348
QgsFeature *feat,
22802349
QgsVectorLayer *layer,

‎src/server/services/wms/qgswmsrenderer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,8 @@ namespace QgsWms
255255
//! Converts a feature info xml document to Text
256256
QByteArray convertFeatureInfoToText( const QDomDocument &doc ) const;
257257

258+
QByteArray convertFeatureInfoToJson( const QList<QgsMapLayer *> &layers, const QDomDocument &doc ) const;
259+
258260
QDomElement createFeatureGML(
259261
QgsFeature *feat,
260262
QgsVectorLayer *layer,

0 commit comments

Comments
 (0)
Please sign in to comment.