Я читаю некоторые 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(), но, похоже, это не помогло. Может ли кто-нибудь помочь объяснить, чего мне здесь не хватает, я не уверен, почему значения не записываются в поле, но я вижу, что поле теперь существует.