我正在使用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(),但似乎没有帮助。有人能帮我解释一下我在这里遗漏了什么吗?我不知道为什么这些值没有被写入这个字段,但我可以看到这个字段现在确实存在
我应该继续阅读,发现这一点,似乎我是有点早张贴一个问题
此函数与C++方法OGReMe::SETField()相同。
此方法仅对内存中的要素对象有效。如果 此对象来自一个图层,必须进行修改 序列化回数据源时,必须使用OGR_L_SetFeature() 之后或者,如果这是一个新功能,则必须使用OGR_L_CreateFeature() 之后使用
相关问题 更多 >
编程相关推荐