Navigation Menu

Skip to content

Commit

Permalink
Merge pull request #3411 from mhugent/feature_info_segmentized_geometry
Browse files Browse the repository at this point in the history
[FEATURE]: possibility to segmentize feature info geometry in server
  • Loading branch information
mhugent committed Aug 25, 2016
2 parents e71e743 + 9471a6b commit 19dea08
Show file tree
Hide file tree
Showing 10 changed files with 99 additions and 116 deletions.
3 changes: 3 additions & 0 deletions python/server/qgswmsconfigparser.sip
Expand Up @@ -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<QString, QString> featureInfoLayerAliasMap() const = 0;

Expand Down
4 changes: 4 additions & 0 deletions python/server/qgswmsprojectparser.sip
Expand Up @@ -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<QString, QString> featureInfoLayerAliasMap() const /*override*/ ;

Expand Down
4 changes: 4 additions & 0 deletions src/app/qgsprojectproperties.cpp
Expand Up @@ -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 );

Expand Down Expand Up @@ -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();
Expand Down
9 changes: 9 additions & 0 deletions src/server/qgssldconfigparser.cpp
Expand Up @@ -512,6 +512,15 @@ bool QgsSLDConfigParser::featureInfoWithWktGeometry() const
return false;
}

bool QgsSLDConfigParser::segmentizeFeatureInfoWktGeometry() const
{
if ( mFallbackParser )
{
return mFallbackParser->segmentizeFeatureInfoWktGeometry();
}
return false;
}


QHash<QString, QString> QgsSLDConfigParser::featureInfoLayerAliasMap() const
{
Expand Down
3 changes: 3 additions & 0 deletions src/server/qgssldconfigparser.h
Expand Up @@ -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<QString, QString> featureInfoLayerAliasMap() const override;

Expand Down
3 changes: 3 additions & 0 deletions src/server/qgswmsconfigparser.h
Expand Up @@ -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<QString, QString> featureInfoLayerAliasMap() const = 0;

Expand Down
22 changes: 22 additions & 0 deletions src/server/qgswmsprojectparser.cpp
Expand Up @@ -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<QString, QString> QgsWmsProjectParser::featureInfoLayerAliasMap() const
{
QHash<QString, QString> aliasMap;
Expand Down
3 changes: 3 additions & 0 deletions src/server/qgswmsprojectparser.h
Expand Up @@ -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<QString, QString> featureInfoLayerAliasMap() const override;

Expand Down
15 changes: 15 additions & 0 deletions src/server/qgswmsserver.cpp
Expand Up @@ -15,6 +15,7 @@
* *
***************************************************************************/


#include "qgswmsserver.h"
#include "qgscapabilitiescache.h"
#include "qgscsexception.h"
Expand Down Expand Up @@ -2194,6 +2195,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<QString>& excludedAttributes = layer->excludeAttributesWms();

QgsFeatureRequest fReq;
Expand Down Expand Up @@ -2365,6 +2367,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 ) ) );
Expand Down

0 comments on commit 19dea08

Please sign in to comment.