Skip to content

Commit e94b1ac

Browse files
committedJun 5, 2018
[OGR provider] Complementary fix for #18596, related to adding a new field to a GeoJSON file
1 parent 8ef0d1f commit e94b1ac

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed
 

‎src/providers/ogr/qgsogrprovider.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4264,7 +4264,14 @@ bool QgsOgrProvider::leaveUpdateMode()
42644264
// use GDALDatasetFlush().
42654265
if ( mGDALDriverName == QLatin1String( "GeoJSON" ) )
42664266
{
4267+
// Backup fields since if we created new fields, but didn't populate it
4268+
// with any feature yet, it will disappear.
4269+
QgsFields oldFields = mAttributeFields;
42674270
reloadData();
4271+
if ( mValid )
4272+
{
4273+
mAttributeFields = oldFields;
4274+
}
42684275
}
42694276
return true;
42704277
}

‎tests/src/python/test_provider_ogr.py

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
import tempfile
1919

2020
from osgeo import gdal, ogr # NOQA
21-
from qgis.core import (QgsFeature, QgsFeatureRequest, QgsSettings, QgsDataProvider,
21+
from qgis.PyQt.QtCore import QVariant
22+
from qgis.core import (QgsFeature, QgsFeatureRequest, QgsField, QgsSettings, QgsDataProvider,
2223
QgsVectorDataProvider, QgsVectorLayer, QgsWkbTypes, QgsNetworkAccessManager)
2324
from qgis.testing import start_app, unittest
2425

@@ -318,10 +319,10 @@ def testSetupProxy(self):
318319
self.assertEqual(gdal.GetConfigOption("GDAL_HTTP_PROXY"), "myproxyhostname.com")
319320
self.assertEqual(gdal.GetConfigOption("GDAL_HTTP_PROXYUSERPWD"), "username")
320321

321-
def testEditGeoJson(self):
322-
""" Test bugfix of https://issues.qgis.org/issues/18596 """
322+
def testEditGeoJsonRemoveField(self):
323+
""" Test bugfix of https://issues.qgis.org/issues/18596 (deleting an existing field)"""
323324

324-
datasource = os.path.join(self.basetestpath, 'testEditGeoJson.json')
325+
datasource = os.path.join(self.basetestpath, 'testEditGeoJsonRemoveField.json')
325326
with open(datasource, 'wt') as f:
326327
f.write("""{
327328
"type": "FeatureCollection",
@@ -333,13 +334,41 @@ def testEditGeoJson(self):
333334
self.assertTrue(vl.startEditing())
334335
self.assertTrue(vl.deleteAttribute(1))
335336
self.assertTrue(vl.commitChanges())
337+
self.assertEqual(len(vl.dataProvider().fields()), 4 - 1)
336338

337339
f = QgsFeature()
338340
self.assertTrue(vl.getFeatures(QgsFeatureRequest()).nextFeature(f))
339341
self.assertEqual(f['x'], 1)
340342
self.assertEqual(f['z'], 3)
341343
self.assertEqual(f['w'], 4)
342344

345+
def testEditGeoJsonAddField(self):
346+
""" Test bugfix of https://issues.qgis.org/issues/18596 (adding a new field)"""
347+
348+
datasource = os.path.join(self.basetestpath, 'testEditGeoJsonAddField.json')
349+
with open(datasource, 'wt') as f:
350+
f.write("""{
351+
"type": "FeatureCollection",
352+
"features": [
353+
{ "type": "Feature", "properties": { "x": 1 }, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } } ] }""")
354+
355+
vl = QgsVectorLayer(datasource, 'test', 'ogr')
356+
self.assertTrue(vl.isValid())
357+
self.assertTrue(vl.startEditing())
358+
self.assertTrue(vl.addAttribute(QgsField('strfield', QVariant.String)))
359+
self.assertTrue(vl.commitChanges())
360+
self.assertEqual(len(vl.dataProvider().fields()), 1 + 1)
361+
362+
f = QgsFeature()
363+
self.assertTrue(vl.getFeatures(QgsFeatureRequest()).nextFeature(f))
364+
self.assertIsNone(f['strfield'])
365+
366+
# Completely reload file
367+
vl = QgsVectorLayer(datasource, 'test', 'ogr')
368+
# As we didn't set any value to the new field, it is not written at
369+
# all in the GeoJSON file, so it has disappeared
370+
self.assertEqual(len(vl.fields()), 1)
371+
343372

344373
if __name__ == '__main__':
345374
unittest.main()

1 commit comments

Comments
 (1)

nyalldawson commented on Jun 5, 2018

@nyalldawson
Collaborator

Thanks @rouault !

Please sign in to comment.