@@ -76,6 +76,54 @@ QgsWFSProvider::~QgsWFSProvider()
76
76
delete mSpatialIndex ;
77
77
}
78
78
79
+ void QgsWFSProvider::copyFeature ( QgsFeature* f, QgsFeature& feature, bool fetchGeometry, QgsAttributeList fetchAttributes )
80
+ {
81
+ if ( !f )
82
+ {
83
+ return ;
84
+ }
85
+
86
+ // copy the geometry
87
+ QgsGeometry* geometry = f->geometry ();
88
+ unsigned char *geom = geometry->asWkb ();
89
+ int geomSize = geometry->wkbSize ();
90
+ unsigned char * copiedGeom = new unsigned char [geomSize];
91
+ memcpy ( copiedGeom, geom, geomSize );
92
+ feature.setGeometryAndOwnership ( copiedGeom, geomSize );
93
+
94
+ // and the attributes
95
+ const QgsAttributeMap& attributes = f->attributeMap ();
96
+ for ( QgsAttributeList::const_iterator it = fetchAttributes.begin (); it != fetchAttributes.end (); ++it )
97
+ {
98
+ feature.addAttribute ( *it, attributes[*it] );
99
+ }
100
+
101
+ // id and valid
102
+ feature.setValid ( true );
103
+ feature.setFeatureId ( f->id () );
104
+ }
105
+
106
+ bool QgsWFSProvider::featureAtId ( int featureId,
107
+ QgsFeature& feature,
108
+ bool fetchGeometry,
109
+ QgsAttributeList fetchAttributes )
110
+ {
111
+ QMap<int , QgsFeature* >::iterator it = mFeatures .find ( featureId );
112
+ if ( it == mFeatures .end () )
113
+ {
114
+ return false ;
115
+ }
116
+
117
+ QgsFeature* f = it.value ();
118
+ if ( !f )
119
+ {
120
+ return false ;
121
+ }
122
+
123
+ copyFeature ( f, feature, fetchGeometry, fetchAttributes );
124
+ return true ;
125
+ }
126
+
79
127
bool QgsWFSProvider::nextFeature ( QgsFeature& feature )
80
128
{
81
129
feature.setValid ( false );
@@ -87,27 +135,19 @@ bool QgsWFSProvider::nextFeature( QgsFeature& feature )
87
135
return 0 ;
88
136
}
89
137
90
- feature.setFeatureId ( mFeatures [*mFeatureIterator ]->id () );
91
-
92
- // we need geometry anyway, e.g. for intersection tests
93
- QgsGeometry* geometry = mFeatures [*mFeatureIterator ]->geometry ();
94
- unsigned char *geom = geometry->asWkb ();
95
- int geomSize = geometry->wkbSize ();
96
- unsigned char * copiedGeom = new unsigned char [geomSize];
97
- memcpy ( copiedGeom, geom, geomSize );
98
- feature.setGeometryAndOwnership ( copiedGeom, geomSize );
99
-
100
- const QgsAttributeMap& attributes = mFeatures [*mFeatureIterator ]->attributeMap ();
101
- for ( QgsAttributeList::const_iterator it = mAttributesToFetch .begin (); it != mAttributesToFetch .end (); ++it )
138
+ QgsFeature* f = mFeatures [*mFeatureIterator ];
139
+ ++mFeatureIterator ;
140
+ if ( !f )
102
141
{
103
- feature. addAttribute ( *it, attributes[*it] ) ;
142
+ continue ;
104
143
}
105
- ++mFeatureIterator ;
144
+
145
+ copyFeature ( f, feature, true , mAttributesToFetch );
146
+
106
147
if ( mUseIntersect )
107
148
{
108
149
if ( feature.geometry () && feature.geometry ()->intersects ( mSpatialFilter ) )
109
150
{
110
- feature.setValid ( true );
111
151
return true ;
112
152
}
113
153
else
@@ -117,7 +157,6 @@ bool QgsWFSProvider::nextFeature( QgsFeature& feature )
117
157
}
118
158
else
119
159
{
120
- feature.setValid ( true );
121
160
return true ;
122
161
}
123
162
}
0 commit comments