From 24cc0e2febe76de1a11bb3db7edc24d3cbcac38f Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Fri, 19 Aug 2016 15:03:02 +0200 Subject: [PATCH] [FEATURE]: possibility to segmentize feature info geometry in server --- python/server/qgswmsconfigparser.sip | 3 + python/server/qgswmsprojectparser.sip | 4 + src/app/qgsprojectproperties.cpp | 4 + src/server/qgssldconfigparser.cpp | 9 ++ src/server/qgssldconfigparser.h | 3 + src/server/qgswmsconfigparser.h | 3 + src/server/qgswmsprojectparser.cpp | 22 ++++ src/server/qgswmsprojectparser.h | 3 + src/server/qgswmsserver.cpp | 14 +++ src/ui/qgsprojectpropertiesbase.ui | 149 ++++++-------------------- 10 files changed, 98 insertions(+), 116 deletions(-) diff --git a/python/server/qgswmsconfigparser.sip b/python/server/qgswmsconfigparser.sip index 276d42e032f..0d2780c48d2 100644 --- a/python/server/qgswmsconfigparser.sip +++ b/python/server/qgswmsconfigparser.sip @@ -53,6 +53,9 @@ class QgsWmsConfigParser /** True if the feature info response should contain the wkt geometry for vector features*/ virtual bool featureInfoWithWktGeometry() const = 0; + /** True if the feature info wkt geometry is delivered with segmentized curve types*/ + virtual bool segmentizeFeatureInfoWktGeometry() const = 0; + /** Returns map with layer aliases for GetFeatureInfo (or 0 pointer if not supported). Key: layer name, Value: layer alias*/ virtual QHash featureInfoLayerAliasMap() const = 0; diff --git a/python/server/qgswmsprojectparser.sip b/python/server/qgswmsprojectparser.sip index b9646de7abe..4b919e73143 100644 --- a/python/server/qgswmsprojectparser.sip +++ b/python/server/qgswmsprojectparser.sip @@ -83,6 +83,10 @@ class QgsWmsProjectParser : public QgsWmsConfigParser /** True if the feature info response should contain the wkt geometry for vector features*/ bool featureInfoWithWktGeometry() const /*override*/ ; + /** True if the feature info wkt geometry is delivered with segmentized curve types*/ + bool segmentizeFeatureInfoWktGeometry() const /*override*/ ; + + /** Returns map with layer aliases for GetFeatureInfo (or 0 pointer if not supported). Key: layer name, Value: layer alias*/ QHash featureInfoLayerAliasMap() const /*override*/ ; diff --git a/src/app/qgsprojectproperties.cpp b/src/app/qgsprojectproperties.cpp index 7932a45629c..406f8afde69 100644 --- a/src/app/qgsprojectproperties.cpp +++ b/src/app/qgsprojectproperties.cpp @@ -528,6 +528,9 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *pa bool addWktGeometry = QgsProject::instance()->readBoolEntry( "WMSAddWktGeometry", "/" ); mAddWktGeometryCheckBox->setChecked( addWktGeometry ); + bool segmentizeFeatureInfoGeometry = QgsProject::instance()->readBoolEntry( "WMSSegmentizeFeatureInfoGeometry", "/" ); + mSegmentizeFeatureInfoGeometryCheckBox->setChecked( segmentizeFeatureInfoGeometry ); + bool useLayerIDs = QgsProject::instance()->readBoolEntry( "WMSUseLayerIDs", "/" ); mWmsUseLayerIDs->setChecked( useLayerIDs ); @@ -1075,6 +1078,7 @@ void QgsProjectProperties::apply() } QgsProject::instance()->writeEntry( "WMSAddWktGeometry", "/", mAddWktGeometryCheckBox->isChecked() ); + QgsProject::instance()->writeEntry( "WMSSegmentizeFeatureInfoGeometry", "/", mSegmentizeFeatureInfoGeometryCheckBox->isChecked() ); QgsProject::instance()->writeEntry( "WMSUseLayerIDs", "/", mWmsUseLayerIDs->isChecked() ); QString maxWidthText = mMaxWidthLineEdit->text(); diff --git a/src/server/qgssldconfigparser.cpp b/src/server/qgssldconfigparser.cpp index 93964f299e9..8321402d358 100644 --- a/src/server/qgssldconfigparser.cpp +++ b/src/server/qgssldconfigparser.cpp @@ -512,6 +512,15 @@ bool QgsSLDConfigParser::featureInfoWithWktGeometry() const return false; } +bool QgsSLDConfigParser::segmentizeFeatureInfoWktGeometry() const +{ + if ( mFallbackParser ) + { + return mFallbackParser->segmentizeFeatureInfoWktGeometry(); + } + return false; +} + QHash QgsSLDConfigParser::featureInfoLayerAliasMap() const { diff --git a/src/server/qgssldconfigparser.h b/src/server/qgssldconfigparser.h index 17161f14d0a..552a10ee01f 100644 --- a/src/server/qgssldconfigparser.h +++ b/src/server/qgssldconfigparser.h @@ -64,6 +64,9 @@ class QgsSLDConfigParser : public QgsWmsConfigParser /** True if the feature info response should contain the wkt geometry for vector features*/ bool featureInfoWithWktGeometry() const override; + /** True if the feature info wkt geometry is delivered with segmentized curve types*/ + bool segmentizeFeatureInfoWktGeometry() const override; + /** Returns map with layer aliases for GetFeatureInfo (or 0 pointer if not supported). Key: layer name, Value: layer alias*/ QHash featureInfoLayerAliasMap() const override; diff --git a/src/server/qgswmsconfigparser.h b/src/server/qgswmsconfigparser.h index cc47139c332..6f354c7fabd 100644 --- a/src/server/qgswmsconfigparser.h +++ b/src/server/qgswmsconfigparser.h @@ -64,6 +64,9 @@ class SERVER_EXPORT QgsWmsConfigParser /** True if the feature info response should contain the wkt geometry for vector features*/ virtual bool featureInfoWithWktGeometry() const = 0; + /** True if the feature info wkt geometry is delivered with segmentized curve types*/ + virtual bool segmentizeFeatureInfoWktGeometry() const = 0; + /** Returns map with layer aliases for GetFeatureInfo (or 0 pointer if not supported). Key: layer name, Value: layer alias*/ virtual QHash featureInfoLayerAliasMap() const = 0; diff --git a/src/server/qgswmsprojectparser.cpp b/src/server/qgswmsprojectparser.cpp index 81a7e64b01a..ba6ce571d94 100644 --- a/src/server/qgswmsprojectparser.cpp +++ b/src/server/qgswmsprojectparser.cpp @@ -2012,6 +2012,28 @@ bool QgsWmsProjectParser::featureInfoWithWktGeometry() const return ( wktElem.text().compare( "true", Qt::CaseInsensitive ) == 0 ); } +bool QgsWmsProjectParser::segmentizeFeatureInfoWktGeometry() const +{ + if ( !mProjectParser->xmlDocument() ) + { + return false; + } + + QDomElement propertiesElem = mProjectParser->propertiesElem(); + if ( propertiesElem.isNull() ) + { + return false; + } + + QDomElement segmentizeElem = propertiesElem.firstChildElement( "WMSSegmentizeFeatureInfoGeometry" ); + if ( segmentizeElem.isNull() ) + { + return false; + } + + return( segmentizeElem.text().compare( "true", Qt::CaseInsensitive ) == 0 ); +} + QHash QgsWmsProjectParser::featureInfoLayerAliasMap() const { QHash aliasMap; diff --git a/src/server/qgswmsprojectparser.h b/src/server/qgswmsprojectparser.h index b384ff7be41..331dbc69353 100644 --- a/src/server/qgswmsprojectparser.h +++ b/src/server/qgswmsprojectparser.h @@ -100,6 +100,9 @@ class SERVER_EXPORT QgsWmsProjectParser : public QgsWmsConfigParser /** True if the feature info response should contain the wkt geometry for vector features*/ bool featureInfoWithWktGeometry() const override; + /** True if the feature info wkt geometry is delivered with segmentized curve types*/ + bool segmentizeFeatureInfoWktGeometry() const override; + /** Returns map with layer aliases for GetFeatureInfo (or 0 pointer if not supported). Key: layer name, Value: layer alias*/ QHash featureInfoLayerAliasMap() const override; diff --git a/src/server/qgswmsserver.cpp b/src/server/qgswmsserver.cpp index 027c0dc73c2..cc2c1fae0cb 100644 --- a/src/server/qgswmsserver.cpp +++ b/src/server/qgswmsserver.cpp @@ -2194,6 +2194,7 @@ int QgsWmsServer::featureInfoFromVectorLayer( QgsVectorLayer* layer, layer->updateFields(); const QgsFields& fields = layer->pendingFields(); bool addWktGeometry = mConfigParser && mConfigParser->featureInfoWithWktGeometry(); + bool segmentizeWktGeometry = mConfigParser && mConfigParser->segmentizeFeatureInfoWktGeometry(); const QSet& excludedAttributes = layer->excludeAttributesWms(); QgsFeatureRequest fReq; @@ -2365,6 +2366,19 @@ int QgsWmsServer::featureInfoFromVectorLayer( QgsVectorLayer* layer, if ( transform.isValid() ) geom.transform( transform ); } + + if ( segmentizeWktGeometry ) + { + QgsAbstractGeometry* abstractGeom = geom.geometry(); + if ( abstractGeom ) + { + if ( QgsWkbTypes::isCurvedType( abstractGeom->wkbType() ) ) + { + QgsAbstractGeometry* segmentizedGeom = abstractGeom-> segmentize(); + geom.setGeometry( segmentizedGeom ); + } + } + } QDomElement geometryElement = infoDocument.createElement( "Attribute" ); geometryElement.setAttribute( "name", "geometry" ); geometryElement.setAttribute( "value", geom.exportToWkt( getWMSPrecision( 8 ) ) ); diff --git a/src/ui/qgsprojectpropertiesbase.ui b/src/ui/qgsprojectpropertiesbase.ui index d38a9f1d89f..4b20b7a154c 100644 --- a/src/ui/qgsprojectpropertiesbase.ui +++ b/src/ui/qgsprojectpropertiesbase.ui @@ -42,16 +42,7 @@ QFrame::Raised - - 0 - - - 0 - - - 0 - - + 0 @@ -206,16 +197,7 @@ QFrame::Raised - - 0 - - - 0 - - - 0 - - + 0 @@ -231,16 +213,7 @@ - - 0 - - - 0 - - - 0 - - + 0 @@ -256,7 +229,7 @@ 0 0 - 683 + 694 779 @@ -721,16 +694,7 @@ - - 0 - - - 0 - - - 0 - - + 0 @@ -746,8 +710,8 @@ 0 0 - 368 - 46 + 694 + 779 @@ -780,16 +744,7 @@ - - 0 - - - 0 - - - 0 - - + 0 @@ -805,8 +760,8 @@ 0 0 - 133 - 100 + 694 + 779 @@ -866,16 +821,7 @@ - - 0 - - - 0 - - - 0 - - + 0 @@ -891,8 +837,8 @@ 0 0 - 379 - 564 + 694 + 779 @@ -1333,16 +1279,7 @@ - - 0 - - - 0 - - - 0 - - + 0 @@ -1357,9 +1294,9 @@ 0 - 0 - 663 - 2249 + -961 + 674 + 2470 @@ -1908,7 +1845,7 @@ - + @@ -1942,7 +1879,7 @@ - + @@ -1989,7 +1926,7 @@ - + @@ -2013,7 +1950,7 @@ - + @@ -2159,6 +2096,13 @@ + + + + Segmentize feature info geometry + + + @@ -2399,16 +2343,7 @@ - - 0 - - - 0 - - - 0 - - + 0 @@ -2424,8 +2359,8 @@ 0 0 - 168 - 46 + 694 + 779 @@ -2461,16 +2396,7 @@ - - 0 - - - 0 - - - 0 - - + 0 @@ -2540,16 +2466,7 @@ QFrame::Raised - - 0 - - - 0 - - - 0 - - + 0