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

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

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'))

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

1 Ответ

0 голосов
/ 26 мая 2020

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...