[FEATURE]: possibility to segmentize feature info geometry in server

This commit is contained in:
Marco Hugentobler 2016-08-19 15:03:02 +02:00
parent e30ff62419
commit 24cc0e2feb
10 changed files with 98 additions and 116 deletions

View File

@ -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;

View File

@ -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*/ ;

View File

@ -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();

View File

@ -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
{

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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<QString>& 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 ) ) );

View File

@ -42,16 +42,7 @@
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<property name="margin">
<number>0</number>
</property>
<item>
@ -206,16 +197,7 @@
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<property name="margin">
<number>0</number>
</property>
<item>
@ -231,16 +213,7 @@
</property>
<widget class="QWidget" name="mProjOpts_01">
<layout class="QVBoxLayout" name="verticalLayout_6">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<property name="margin">
<number>0</number>
</property>
<item>
@ -256,7 +229,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>683</width>
<width>694</width>
<height>779</height>
</rect>
</property>
@ -721,16 +694,7 @@
</widget>
<widget class="QWidget" name="mProjOpts_02">
<layout class="QVBoxLayout" name="verticalLayout_5">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<property name="margin">
<number>0</number>
</property>
<item>
@ -746,8 +710,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>368</width>
<height>46</height>
<width>694</width>
<height>779</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
@ -780,16 +744,7 @@
</widget>
<widget class="QWidget" name="mProjOpts_03">
<layout class="QVBoxLayout" name="verticalLayout_9">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<property name="margin">
<number>0</number>
</property>
<item>
@ -805,8 +760,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>133</width>
<height>100</height>
<width>694</width>
<height>779</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_10">
@ -866,16 +821,7 @@
</widget>
<widget class="QWidget" name="mProjOpts_04">
<layout class="QVBoxLayout" name="verticalLayout_11">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<property name="margin">
<number>0</number>
</property>
<item>
@ -891,8 +837,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>379</width>
<height>564</height>
<width>694</width>
<height>779</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_12">
@ -1333,16 +1279,7 @@
</widget>
<widget class="QWidget" name="mProjOpts_05">
<layout class="QVBoxLayout" name="verticalLayout_14">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<property name="margin">
<number>0</number>
</property>
<item>
@ -1357,9 +1294,9 @@
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>663</width>
<height>2249</height>
<y>-961</y>
<width>674</width>
<height>2470</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_13">
@ -1908,7 +1845,7 @@
</property>
</widget>
</item>
<item row="10" column="0" colspan="2">
<item row="11" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_10">
<item>
<widget class="QLabel" name="mWMSImageQualityLabel">
@ -1942,7 +1879,7 @@
</property>
</widget>
</item>
<item row="9" column="0" colspan="2">
<item row="10" column="0" colspan="2">
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="1">
<widget class="QLabel" name="mMaxWidthLabel">
@ -1989,7 +1926,7 @@
</item>
</layout>
</item>
<item row="7" column="0" colspan="2">
<item row="8" column="0" colspan="2">
<layout class="QHBoxLayout" name="grpWMSPrecision">
<item>
<widget class="QLabel" name="label_5">
@ -2013,7 +1950,7 @@
</item>
</layout>
</item>
<item row="8" column="0" colspan="2">
<item row="9" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="mWMSUrlLabel">
@ -2159,6 +2096,13 @@
</layout>
</widget>
</item>
<item row="7" column="0">
<widget class="QCheckBox" name="mSegmentizeFeatureInfoGeometryCheckBox">
<property name="text">
<string>Segmentize feature info geometry</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
@ -2399,16 +2343,7 @@
</widget>
<widget class="QWidget" name="mProjOpts_06">
<layout class="QVBoxLayout" name="verticalLayout_15">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<property name="margin">
<number>0</number>
</property>
<item>
@ -2424,8 +2359,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>168</width>
<height>46</height>
<width>694</width>
<height>779</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_17">
@ -2461,16 +2396,7 @@
</widget>
<widget class="QWidget" name="mTabRelations">
<layout class="QGridLayout" name="gridLayout_16">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<property name="margin">
<number>0</number>
</property>
</layout>
@ -2540,16 +2466,7 @@
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<property name="margin">
<number>0</number>
</property>
<item>