Skip to content

Commit 6f7b933

Browse files
committed
[FEATURE]: possibility to segmentize feature info geometry in server
1 parent 973e4b0 commit 6f7b933

10 files changed

+98
-116
lines changed

python/server/qgswmsconfigparser.sip

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ class QgsWMSConfigParser
5353
/** True if the feature info response should contain the wkt geometry for vector features*/
5454
virtual bool featureInfoWithWktGeometry() const = 0;
5555

56+
/** True if the feature info wkt geometry is delivered with segmentized curve types*/
57+
virtual bool segmentizeFeatureInfoWktGeometry() const = 0;
58+
5659
/** Returns map with layer aliases for GetFeatureInfo (or 0 pointer if not supported). Key: layer name, Value: layer alias*/
5760
virtual QHash<QString, QString> featureInfoLayerAliasMap() const = 0;
5861

python/server/qgswmsprojectparser.sip

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ class QgsWMSProjectParser : public QgsWMSConfigParser
8383
/** True if the feature info response should contain the wkt geometry for vector features*/
8484
bool featureInfoWithWktGeometry() const /*override*/ ;
8585

86+
/** True if the feature info wkt geometry is delivered with segmentized curve types*/
87+
bool segmentizeFeatureInfoWktGeometry() const /*override*/ ;
88+
89+
8690
/** Returns map with layer aliases for GetFeatureInfo (or 0 pointer if not supported). Key: layer name, Value: layer alias*/
8791
QHash<QString, QString> featureInfoLayerAliasMap() const /*override*/ ;
8892

src/app/qgsprojectproperties.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,9 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *pa
530530
bool addWktGeometry = QgsProject::instance()->readBoolEntry( "WMSAddWktGeometry", "/" );
531531
mAddWktGeometryCheckBox->setChecked( addWktGeometry );
532532

533+
bool segmentizeFeatureInfoGeometry = QgsProject::instance()->readBoolEntry( "WMSSegmentizeFeatureInfoGeometry", "/" );
534+
mSegmentizeFeatureInfoGeometryCheckBox->setChecked( segmentizeFeatureInfoGeometry );
535+
533536
bool useLayerIDs = QgsProject::instance()->readBoolEntry( "WMSUseLayerIDs", "/" );
534537
mWmsUseLayerIDs->setChecked( useLayerIDs );
535538

@@ -1077,6 +1080,7 @@ void QgsProjectProperties::apply()
10771080
}
10781081

10791082
QgsProject::instance()->writeEntry( "WMSAddWktGeometry", "/", mAddWktGeometryCheckBox->isChecked() );
1083+
QgsProject::instance()->writeEntry( "WMSSegmentizeFeatureInfoGeometry", "/", mSegmentizeFeatureInfoGeometryCheckBox->isChecked() );
10801084
QgsProject::instance()->writeEntry( "WMSUseLayerIDs", "/", mWmsUseLayerIDs->isChecked() );
10811085

10821086
QString maxWidthText = mMaxWidthLineEdit->text();

src/server/qgssldconfigparser.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,15 @@ bool QgsSLDConfigParser::featureInfoWithWktGeometry() const
515515
return false;
516516
}
517517

518+
bool QgsSLDConfigParser::segmentizeFeatureInfoWktGeometry() const
519+
{
520+
if ( mFallbackParser )
521+
{
522+
return mFallbackParser->segmentizeFeatureInfoWktGeometry();
523+
}
524+
return false;
525+
}
526+
518527

519528
QHash<QString, QString> QgsSLDConfigParser::featureInfoLayerAliasMap() const
520529
{

src/server/qgssldconfigparser.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ class QgsSLDConfigParser : public QgsWMSConfigParser
6464
/** True if the feature info response should contain the wkt geometry for vector features*/
6565
bool featureInfoWithWktGeometry() const override;
6666

67+
/** True if the feature info wkt geometry is delivered with segmentized curve types*/
68+
bool segmentizeFeatureInfoWktGeometry() const override;
69+
6770
/** Returns map with layer aliases for GetFeatureInfo (or 0 pointer if not supported). Key: layer name, Value: layer alias*/
6871
QHash<QString, QString> featureInfoLayerAliasMap() const override;
6972

src/server/qgswmsconfigparser.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ class SERVER_EXPORT QgsWMSConfigParser
6464
/** True if the feature info response should contain the wkt geometry for vector features*/
6565
virtual bool featureInfoWithWktGeometry() const = 0;
6666

67+
/** True if the feature info wkt geometry is delivered with segmentized curve types*/
68+
virtual bool segmentizeFeatureInfoWktGeometry() const = 0;
69+
6770
/** Returns map with layer aliases for GetFeatureInfo (or 0 pointer if not supported). Key: layer name, Value: layer alias*/
6871
virtual QHash<QString, QString> featureInfoLayerAliasMap() const = 0;
6972

src/server/qgswmsprojectparser.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2012,6 +2012,28 @@ bool QgsWMSProjectParser::featureInfoWithWktGeometry() const
20122012
return ( wktElem.text().compare( "true", Qt::CaseInsensitive ) == 0 );
20132013
}
20142014

2015+
bool QgsWMSProjectParser::segmentizeFeatureInfoWktGeometry() const
2016+
{
2017+
if ( !mProjectParser->xmlDocument() )
2018+
{
2019+
return false;
2020+
}
2021+
2022+
QDomElement propertiesElem = mProjectParser->propertiesElem();
2023+
if ( propertiesElem.isNull() )
2024+
{
2025+
return false;
2026+
}
2027+
2028+
QDomElement segmentizeElem = propertiesElem.firstChildElement( "WMSSegmentizeFeatureInfoGeometry" );
2029+
if ( segmentizeElem.isNull() )
2030+
{
2031+
return false;
2032+
}
2033+
2034+
return( segmentizeElem.text().compare( "true", Qt::CaseInsensitive ) == 0 );
2035+
}
2036+
20152037
QHash<QString, QString> QgsWMSProjectParser::featureInfoLayerAliasMap() const
20162038
{
20172039
QHash<QString, QString> aliasMap;

src/server/qgswmsprojectparser.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,9 @@ class SERVER_EXPORT QgsWMSProjectParser : public QgsWMSConfigParser
100100
/** True if the feature info response should contain the wkt geometry for vector features*/
101101
bool featureInfoWithWktGeometry() const override;
102102

103+
/** True if the feature info wkt geometry is delivered with segmentized curve types*/
104+
bool segmentizeFeatureInfoWktGeometry() const override;
105+
103106
/** Returns map with layer aliases for GetFeatureInfo (or 0 pointer if not supported). Key: layer name, Value: layer alias*/
104107
QHash<QString, QString> featureInfoLayerAliasMap() const override;
105108

src/server/qgswmsserver.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2191,6 +2191,7 @@ int QgsWMSServer::featureInfoFromVectorLayer( QgsVectorLayer* layer,
21912191
layer->updateFields();
21922192
const QgsFields& fields = layer->pendingFields();
21932193
bool addWktGeometry = mConfigParser && mConfigParser->featureInfoWithWktGeometry();
2194+
bool segmentizeWktGeometry = mConfigParser && mConfigParser->segmentizeFeatureInfoWktGeometry();
21942195
const QSet<QString>& excludedAttributes = layer->excludeAttributesWMS();
21952196

21962197
QgsFeatureRequest fReq;
@@ -2365,6 +2366,19 @@ int QgsWMSServer::featureInfoFromVectorLayer( QgsVectorLayer* layer,
23652366
if ( transform )
23662367
geom->transform( *transform );
23672368
}
2369+
2370+
if ( segmentizeWktGeometry )
2371+
{
2372+
QgsAbstractGeometryV2* abstractGeom = geom->geometry();
2373+
if ( abstractGeom )
2374+
{
2375+
if ( QgsWKBTypes::isCurvedType( abstractGeom->wkbType() ) )
2376+
{
2377+
QgsAbstractGeometryV2* segmentizedGeom = abstractGeom-> segmentize();
2378+
geom->setGeometry( segmentizedGeom );
2379+
}
2380+
}
2381+
}
23682382
QDomElement geometryElement = infoDocument.createElement( "Attribute" );
23692383
geometryElement.setAttribute( "name", "geometry" );
23702384
geometryElement.setAttribute( "value", geom->exportToWkt( getWMSPrecision( 8 ) ) );

0 commit comments

Comments
 (0)