将值写入新字段Python GDAL OGR,不确定如何提交更改,为什么我的字段仍然为空?

2024-10-02 00:34:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用gdal/ogr从2个源读取一些s-57,并将其写入内存数据源。 数据加载成功,我可以看到图层和值等

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

但是当我尝试在上面的循环之后读取这些层时,新字段是“None”,没有值,我尝试添加datasource.CommitTransaction(),但似乎没有帮助。有人能帮我解释一下我在这里遗漏了什么吗?我不知道为什么这些值没有被写入这个字段,但我可以看到这个字段现在确实存在


Tags: fieldnewopenoldprintenclightsfeat
1条回答
网友
1楼 · 发布于 2024-10-02 00:34:57

我应该继续阅读,发现这一点,似乎我是有点早张贴一个问题

此函数与C++方法OGReMe::SETField()相同。

此方法仅对内存中的要素对象有效。如果 此对象来自一个图层,必须进行修改 序列化回数据源时,必须使用OGR_L_SetFeature() 之后或者,如果这是一个新功能,则必须使用OGR_L_CreateFeature() 之后使用

相关问题 更多 >

    热门问题