Skip to content

Commit 551547a

Browse files
committed
Server: if there is a primary key, use the pk value(s) as gml id instead of the feature id
1 parent b6b394c commit 551547a

File tree

6 files changed

+65
-24
lines changed

6 files changed

+65
-24
lines changed

python/server/qgswfserver.sip

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,8 @@ class QgsWFSServer: public QgsOWSServer
104104
protected:
105105

106106
void startGetFeature( QgsRequestHandler& request, const QString& format, int prec, QgsCoordinateReferenceSystem& crs, QgsRectangle* rect );
107-
void setGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes );
107+
void setGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes,
108+
const QgsAttributeList& pkAttributes = QgsAttributeList());
108109
void endGetFeature( QgsRequestHandler& request, const QString& format );
109110

110111
//method for transaction
@@ -114,10 +115,12 @@ class QgsWFSServer: public QgsOWSServer
114115
QString createFeatureGeoJSON( QgsFeature* feat, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes ) /*const*/;
115116

116117
//methods to write GML2
117-
QDomElement createFeatureGML2( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes ) /*const*/;
118+
QDomElement createFeatureGML2( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes,
119+
const QgsAttributeList& pkAttributes = QgsAttributeList()) /*const*/;
118120

119121
//methods to write GML3
120-
QDomElement createFeatureGML3( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes ) /*const*/;
122+
QDomElement createFeatureGML3( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes,
123+
const QgsAttributeList& pkAttributes = QgsAttributeList() ) /*const*/;
121124

122125
void addTransactionResult( QDomDocument& responseDoc, QDomElement& responseElem, const QString& status, const QString& locator, const QString& message );
123126
};

src/server/qgsowsserver.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,24 @@ void QgsOWSServer::restoreLayerFilters( const QHash<QgsMapLayer*, QString>& filt
6464
}
6565
}
6666
}
67+
68+
QString QgsOWSServer::featureGmlId( const QgsFeature* f, const QgsAttributeList& pkAttributes )
69+
{
70+
if ( !f )
71+
{
72+
return QString();
73+
}
74+
75+
if ( pkAttributes.isEmpty() )
76+
{
77+
return QString::number( f->id() );
78+
}
79+
80+
QString pkId;
81+
QgsAttributeList::const_iterator it = pkAttributes.constBegin();
82+
for ( ; it != pkAttributes.constEnd(); ++it )
83+
{
84+
pkId.append( f->attribute( *it ).toString() );
85+
}
86+
return pkId;
87+
}

src/server/qgsowsserver.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "qgsaccesscontrol.h"
2424
#endif
2525

26+
#include "qgsfield.h"
2627
#include <QHash>
2728

2829
class QgsMapLayer;
@@ -73,6 +74,13 @@ class QgsOWSServer
7374
void applyAccessControlLayerFilters( QgsMapLayer* layer, QHash<QgsMapLayer*, QString>& originalLayerFilters ) const;
7475
#endif
7576

77+
/** Creates gml id for feature. Returns primary key value or feature id in case there is no PK
78+
* @param f feature
79+
* @param pkAttributes list of attribute indices used as primary key
80+
* @return pk as string or feature id
81+
*/
82+
static QString featureGmlId( const QgsFeature* f, const QgsAttributeList& pkAttributes );
83+
7684
};
7785

7886
/** RAII class to restore layer filters on destruction

src/server/qgswfsserver.cpp

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
603603
if ( featureCounter == 0 )
604604
startGetFeature( request, format, layerPrec, layerCrs, &searchRect );
605605

606-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
606+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider->pkAttributeIndexes() );
607607

608608
fid = "";
609609
++featCounter;
@@ -642,7 +642,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
642642

643643
if ( featureCounter >= startIndex )
644644
{
645-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
645+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider->pkAttributeIndexes() );
646646
++featCounter;
647647
}
648648
++featureCounter;
@@ -696,7 +696,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
696696

697697
if ( featureCounter >= startIndex )
698698
{
699-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
699+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider->pkAttributeIndexes() );
700700
++featCounter;
701701
}
702702
++featureCounter;
@@ -714,7 +714,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
714714

715715
if ( featureCounter >= startIndex )
716716
{
717-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
717+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider->pkAttributeIndexes() );
718718
++featCounter;
719719
}
720720
++featureCounter;
@@ -977,7 +977,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
977977
if ( featureCounter == 0 )
978978
startGetFeature( request, format, layerPrec, layerCrs, &searchRect );
979979

980-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
980+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider->pkAttributeIndexes() );
981981
++featCounter;
982982
++featureCounter;
983983
}
@@ -1026,7 +1026,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
10261026

10271027
if ( featureCounter >= startIndex )
10281028
{
1029-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
1029+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider->pkAttributeIndexes() );
10301030
++featCounter;
10311031
}
10321032
++featureCounter;
@@ -1063,7 +1063,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
10631063
if ( featureCounter == 0 )
10641064
startGetFeature( request, format, layerPrec, layerCrs, &searchRect );
10651065

1066-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
1066+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider->pkAttributeIndexes() );
10671067

10681068
fid = "";
10691069
++featCounter;
@@ -1102,7 +1102,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
11021102

11031103
if ( featureCounter >= startIndex )
11041104
{
1105-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
1105+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider->pkAttributeIndexes() );
11061106
++featCounter;
11071107
}
11081108
++featureCounter;
@@ -1151,7 +1151,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
11511151

11521152
if ( featureCounter >= startIndex )
11531153
{
1154-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
1154+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider->pkAttributeIndexes() );
11551155
++featCounter;
11561156
}
11571157
++featureCounter;
@@ -1190,7 +1190,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
11901190

11911191
if ( featureCounter >= startIndex )
11921192
{
1193-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
1193+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider->pkAttributeIndexes() );
11941194
++featCounter;
11951195
}
11961196
++featureCounter;
@@ -1363,7 +1363,8 @@ void QgsWFSServer::startGetFeature( QgsRequestHandler& request, const QString& f
13631363
fcString = "";
13641364
}
13651365

1366-
void QgsWFSServer::setGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes ) /*const*/
1366+
void QgsWFSServer::setGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes,
1367+
const QgsAttributeList& pkAttributes ) /*const*/
13671368
{
13681369
if ( !feat->isValid() )
13691370
return;
@@ -1389,12 +1390,12 @@ void QgsWFSServer::setGetFeature( QgsRequestHandler& request, const QString& for
13891390
QDomElement featureElement;
13901391
if ( format == "GML3" )
13911392
{
1392-
featureElement = createFeatureGML3( feat, gmlDoc, prec, crs, attrIndexes, excludedAttributes );
1393+
featureElement = createFeatureGML3( feat, gmlDoc, prec, crs, attrIndexes, excludedAttributes, pkAttributes );
13931394
gmlDoc.appendChild( featureElement );
13941395
}
13951396
else
13961397
{
1397-
featureElement = createFeatureGML2( feat, gmlDoc, prec, crs, attrIndexes, excludedAttributes );
1398+
featureElement = createFeatureGML2( feat, gmlDoc, prec, crs, attrIndexes, excludedAttributes, pkAttributes );
13981399
gmlDoc.appendChild( featureElement );
13991400
}
14001401

@@ -1963,14 +1964,16 @@ QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, int prec, QgsCoord
19631964
return exporter.exportFeature( f, QVariantMap(), id );
19641965
}
19651966

1966-
QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes ) /*const*/
1967+
QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes,
1968+
const QgsAttributeList& pkAttributes ) /*const*/
19671969
{
19681970
//gml:FeatureMember
19691971
QDomElement featureElement = doc.createElement( "gml:featureMember"/*wfs:FeatureMember*/ );
19701972

19711973
//qgs:%TYPENAME%
19721974
QDomElement typeNameElement = doc.createElement( "qgs:" + mTypeName /*qgs:%TYPENAME%*/ );
1973-
typeNameElement.setAttribute( "fid", mTypeName + "." + QString::number( feat->id() ) );
1975+
QString gmlId = featureGmlId( feat, pkAttributes );
1976+
typeNameElement.setAttribute( "fid", mTypeName + "." + gmlId );
19741977
featureElement.appendChild( typeNameElement );
19751978

19761979
if ( mWithGeom && mGeometryName != "NONE" )
@@ -2047,14 +2050,16 @@ QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc
20472050
return featureElement;
20482051
}
20492052

2050-
QDomElement QgsWFSServer::createFeatureGML3( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes ) /*const*/
2053+
QDomElement QgsWFSServer::createFeatureGML3( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes,
2054+
const QgsAttributeList& pkAttributes ) /*const*/
20512055
{
20522056
//gml:FeatureMember
20532057
QDomElement featureElement = doc.createElement( "gml:featureMember"/*wfs:FeatureMember*/ );
20542058

20552059
//qgs:%TYPENAME%
20562060
QDomElement typeNameElement = doc.createElement( "qgs:" + mTypeName /*qgs:%TYPENAME%*/ );
2057-
typeNameElement.setAttribute( "gml:id", mTypeName + "." + QString::number( feat->id() ) );
2061+
QString gmlId = featureGmlId( feat, pkAttributes );
2062+
typeNameElement.setAttribute( "gml:id", mTypeName + "." + gmlId );
20582063
featureElement.appendChild( typeNameElement );
20592064

20602065
if ( mWithGeom && mGeometryName != "NONE" )

src/server/qgswfsserver.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ class QgsWFSServer: public QgsOWSServer
112112
protected:
113113

114114
void startGetFeature( QgsRequestHandler& request, const QString& format, int prec, QgsCoordinateReferenceSystem& crs, QgsRectangle* rect );
115-
void setGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes );
115+
void setGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes,
116+
const QgsAttributeList& pkAttributes = QgsAttributeList() );
116117
void endGetFeature( QgsRequestHandler& request, const QString& format );
117118

118119
//method for transaction
@@ -122,10 +123,12 @@ class QgsWFSServer: public QgsOWSServer
122123
QString createFeatureGeoJSON( QgsFeature* feat, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes ) /*const*/;
123124

124125
//methods to write GML2
125-
QDomElement createFeatureGML2( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes ) /*const*/;
126+
QDomElement createFeatureGML2( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes,
127+
const QgsAttributeList& pkAttributes = QgsAttributeList() ) /*const*/;
126128

127129
//methods to write GML3
128-
QDomElement createFeatureGML3( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes ) /*const*/;
130+
QDomElement createFeatureGML3( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes,
131+
const QgsAttributeList& pkAttributes = QgsAttributeList() ) /*const*/;
129132

130133
void addTransactionResult( QDomDocument& responseDoc, QDomElement& responseElem, const QString& status, const QString& locator, const QString& message );
131134
};

src/server/qgswmsserver.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3312,7 +3312,8 @@ QDomElement QgsWMSServer::createFeatureGML(
33123312
{
33133313
//qgs:%TYPENAME%
33143314
QDomElement typeNameElement = doc.createElement( "qgs:" + typeName /*qgs:%TYPENAME%*/ );
3315-
typeNameElement.setAttribute( "fid", typeName + "." + QString::number( feat->id() ) );
3315+
QString gmlId = featureGmlId( feat, layer->dataProvider()->pkAttributeIndexes() );
3316+
typeNameElement.setAttribute( "fid", typeName + "." + gmlId );
33163317

33173318
const QgsCoordinateTransform* transform = nullptr;
33183319
if ( layer && layer->crs() != crs )

0 commit comments

Comments
 (0)