@@ -78,7 +78,6 @@ def testDateTimeWriteShapefile(self):
78
78
assert len (features ) > 0
79
79
80
80
dest_file_name = os .path .join (str (QDir .tempPath ()), 'datetime.shp' )
81
- print (dest_file_name )
82
81
crs = QgsCoordinateReferenceSystem ()
83
82
crs .createFromId (4326 , QgsCoordinateReferenceSystem .EpsgCrsId )
84
83
write_result = QgsVectorFileWriter .writeAsVectorFormat (
@@ -134,7 +133,6 @@ def testDateTimeWriteTabfile(self):
134
133
assert len (features ) > 0
135
134
136
135
dest_file_name = os .path .join (str (QDir .tempPath ()), 'datetime.tab' )
137
- print (dest_file_name )
138
136
crs = QgsCoordinateReferenceSystem ()
139
137
crs .createFromId (4326 , QgsCoordinateReferenceSystem .EpsgCrsId )
140
138
write_result = QgsVectorFileWriter .writeAsVectorFormat (
@@ -191,7 +189,6 @@ def testWriteShapefileWithZ(self):
191
189
# check with both a standard PointZ and 25d style Point25D type
192
190
for t in [QgsWKBTypes .PointZ , QgsWKBTypes .Point25D ]:
193
191
dest_file_name = os .path .join (str (QDir .tempPath ()), 'point_{}.shp' .format (QgsWKBTypes .displayString (t )))
194
- print (dest_file_name )
195
192
crs = QgsCoordinateReferenceSystem ()
196
193
crs .createFromId (4326 , QgsCoordinateReferenceSystem .EpsgCrsId )
197
194
write_result = QgsVectorFileWriter .writeAsVectorFormat (
@@ -215,7 +212,6 @@ def testWriteShapefileWithZ(self):
215
212
#this tests that saving a layer with z WITHOUT explicitly telling the writer to keep z values,
216
213
#will stay retain the z values
217
214
dest_file_name = os .path .join (str (QDir .tempPath ()), 'point_{}_copy.shp' .format (QgsWKBTypes .displayString (t )))
218
- print (dest_file_name )
219
215
crs = QgsCoordinateReferenceSystem ()
220
216
crs .createFromId (4326 , QgsCoordinateReferenceSystem .EpsgCrsId )
221
217
write_result = QgsVectorFileWriter .writeAsVectorFormat (
@@ -253,7 +249,6 @@ def testWriteShapefileWithMultiConversion(self):
253
249
assert len (features ) > 0
254
250
255
251
dest_file_name = os .path .join (str (QDir .tempPath ()), 'to_multi.shp' )
256
- print (dest_file_name )
257
252
crs = QgsCoordinateReferenceSystem ()
258
253
crs .createFromId (4326 , QgsCoordinateReferenceSystem .EpsgCrsId )
259
254
write_result = QgsVectorFileWriter .writeAsVectorFormat (
@@ -273,6 +268,90 @@ def testWriteShapefileWithMultiConversion(self):
273
268
expWkt = 'MultiPoint ((1 2))'
274
269
assert compareWkt (expWkt , wkt ), "saving geometry with multi conversion failed: mismatch Expected:\n %s\n Got:\n %s\n " % (expWkt , wkt )
275
270
271
+ def testWriteShapefileWithAttributeSubsets (self ):
272
+ """Tests writing subsets of attributes to files."""
273
+ ml = QgsVectorLayer (
274
+ ('Point?crs=epsg:4326&field=id:int&field=field1:int&field=field2:int&field=field3:int' ),
275
+ 'test' ,
276
+ 'memory' )
277
+
278
+ assert ml is not None , 'Provider not initialized'
279
+ assert ml .isValid (), 'Source layer not valid'
280
+ provider = ml .dataProvider ()
281
+ assert provider is not None
282
+
283
+ ft = QgsFeature ()
284
+ ft .setGeometry (QgsGeometry .fromWkt ('Point (1 2)' ))
285
+ ft .setAttributes ([1 , 11 , 12 , 13 ])
286
+ res , features = provider .addFeatures ([ft ])
287
+ assert res
288
+ assert len (features ) > 0
289
+
290
+ #first write out with all attributes
291
+ dest_file_name = os .path .join (str (QDir .tempPath ()), 'all_attributes.shp' )
292
+ crs = QgsCoordinateReferenceSystem ()
293
+ crs .createFromId (4326 , QgsCoordinateReferenceSystem .EpsgCrsId )
294
+ write_result = QgsVectorFileWriter .writeAsVectorFormat (
295
+ ml ,
296
+ dest_file_name ,
297
+ 'utf-8' ,
298
+ crs ,
299
+ 'ESRI Shapefile' ,
300
+ attributes = [])
301
+ self .assertEqual (write_result , QgsVectorFileWriter .NoError )
302
+
303
+ # Open result and check
304
+ created_layer = QgsVectorLayer (u'{}|layerid=0' .format (dest_file_name ), u'test' , u'ogr' )
305
+ self .assertEqual (created_layer .fields ().count (), 4 )
306
+ f = created_layer .getFeatures (QgsFeatureRequest ()).next ()
307
+ self .assertEqual (f ['id' ], 1 )
308
+ self .assertEqual (f ['field1' ], 11 )
309
+ self .assertEqual (f ['field2' ], 12 )
310
+ self .assertEqual (f ['field3' ], 13 )
311
+
312
+ #now test writing out only a subset of attributes
313
+ dest_file_name = os .path .join (str (QDir .tempPath ()), 'subset_attributes.shp' )
314
+ write_result = QgsVectorFileWriter .writeAsVectorFormat (
315
+ ml ,
316
+ dest_file_name ,
317
+ 'utf-8' ,
318
+ crs ,
319
+ 'ESRI Shapefile' ,
320
+ attributes = [1 , 3 ])
321
+ self .assertEqual (write_result , QgsVectorFileWriter .NoError )
322
+
323
+ # Open result and check
324
+ created_layer = QgsVectorLayer (u'{}|layerid=0' .format (dest_file_name ), u'test' , u'ogr' )
325
+ self .assertEqual (created_layer .fields ().count (), 2 )
326
+ f = created_layer .getFeatures (QgsFeatureRequest ()).next ()
327
+ self .assertEqual (f ['field1' ], 11 )
328
+ self .assertEqual (f ['field3' ], 13 )
329
+
330
+ #finally test writing no attributes
331
+ dest_file_name = os .path .join (str (QDir .tempPath ()), 'subset_attributes.shp' )
332
+ write_result = QgsVectorFileWriter .writeAsVectorFormat (
333
+ ml ,
334
+ dest_file_name ,
335
+ 'utf-8' ,
336
+ crs ,
337
+ 'ESRI Shapefile' ,
338
+ skipAttributeCreation = True )
339
+ self .assertEqual (write_result , QgsVectorFileWriter .NoError )
340
+
341
+ # Open result and check
342
+ created_layer = QgsVectorLayer (u'{}|layerid=0' .format (dest_file_name ), u'test' , u'ogr' )
343
+ # expect only a default 'FID' field for shapefiles
344
+ self .assertEqual (created_layer .fields ().count (), 1 )
345
+ self .assertEqual (created_layer .fields ()[0 ].name (), 'FID' )
346
+ # in this case we also check that the geometry exists, to make sure feature has been correctly written
347
+ # even without attributes
348
+ f = created_layer .getFeatures (QgsFeatureRequest ()).next ()
349
+ g = f .geometry ()
350
+ wkt = g .exportToWkt ()
351
+ expWkt = 'Point (1 2)'
352
+ assert compareWkt (expWkt , wkt ), "geometry not saved correctly when saving without attributes : mismatch Expected:\n %s\n Got:\n %s\n " % (expWkt , wkt )
353
+ self .assertEqual (f ['FID' ], 0 )
354
+
276
355
277
356
if __name__ == '__main__' :
278
357
unittest .main ()
0 commit comments