Запись значений в новое поле, Python GDAL OGR, не знаю, как зафиксировать изменения, почему мои поля все еще пусты?

Я читаю некоторые s-57 из 2 источников, используя gdal / ogr, и записываю их в источник данных памяти. Данные успешно загружаются, и я вижу слои, значения и т. д.

encdriver = ogr.GetDriverByName("S57")

new_enc = encdriver.Open(new_enc_path)
old_enc = encdriver.Open(new_enc_path)

memdriver=ogr.GetDriverByName('MEMORY')
memsource=memdriver.CreateDataSource('memData')

tmp=memdriver.Open('memData',1)

memsource.CopyLayer(new_enc.GetLayerByName('lights'), 'new_lights',['OVERWRITE=YES'])
memsource.CopyLayer(old_enc.GetLayerByName('lights'), 'old_lights',['OVERWRITE=YES'])

new_lights = memsource.GetLayerByName('new_lights')
old_lights = memsource.GetLayerByName('old_lights')

Затем я определяю новое поле (логическое) и добавляю его в слой, а затем устанавливаю для него значение true или false в каждом слое.

new_field = ogr.FieldDefn('NEW', ogr.OFSTBoolean)
new_lights.CreateField(new_field)
old_lights.CreateField(new_field)

layerDefinition = new_lights.GetLayerDefn()
print(layerDefinition.GetFieldCount())

new_lights.ResetReading()
old_lights.ResetReading()
print('NEW')
for feat in new_lights:
    feat.SetField('NEW', True)
    new_lights.CommitTransaction()
    print(feat.GetField('NEW'))


print('OLD')   
for feat in old_lights:
    feat.SetField('NEW', False)
    old_lights.CommitTransaction()
    print(feat.GetField('NEW'))

В обоих циклах выше поле печатается с новым значением [0] или [1]

print('OLD2')
old_lights.ResetReading()
for feat in old_lights:
    print(feat.GetField('NEW'))

но когда я пытаюсь прочитать эти слои после вышеуказанного цикла, новое поле «Нет», не имеет значений, я попытался добавить datasource.CommitTransaction(), но, похоже, это не помогло. Может ли кто-нибудь помочь объяснить, чего мне здесь не хватает, я не уверен, почему значения не записываются в поле, но я вижу, что поле теперь существует.


person Javrel    schedule 26.05.2020    source источник


Ответы (1)


Я должен продолжить чтение, нашел это, кажется, я немного рано задал вопрос.

Эта функция аналогична методу C++ OGRFeature::SetField().

Этот метод влияет только на объект функции в памяти. Если этот объект поступает из слоя и модификации должны быть сериализованы обратно в источник данных, после этого необходимо использовать OGR_L_SetFeature(). Или, если это новая функция, после этого необходимо использовать OGR_L_CreateFeature().

person Javrel    schedule 26.05.2020