GDAL CreateFeature无法向图层添加要素问题咨询
解决osgeo ogr.CreateFeature()抛异常但代码继续运行的问题
嘿,我之前在老版本GDAL上也踩过类似的坑,结合你用的Ubuntu 17.10 + Python 2.7 + osgeo v2.2.1的环境,大概率是这几个细节没处理好,给你捋捋:
可能的原因&解决办法
1. Feature对象未正确初始化字段或几何
GDAL 2.x版本对未完全初始化的Feature容忍度很低,哪怕你已经生成了多边形几何,要是没给字段赋值(哪怕是空值),或者没把几何绑定到Feature上,调用CreateFeature()就会偷偷抛异常但不终止程序。
你得确保做了这两步:
# 给字段赋值(比如你的字段叫"name",哪怕设为空字符串也行) feature.SetField("你的字段名", "") # 把多边形几何绑定到Feature feature.SetGeometry(your_polygon_geom)
2. 图层和几何的空间参考不匹配
如果创建shapefile图层时指定了空间参考(SRS),那你的多边形几何必须和图层用同一个SRS,否则OGR会报错但不中断进程。
比如创建图层时是这么写的:
srs = ogr.osr.SpatialReference() srs.ImportFromEPSG(4326) layer = ds.CreateLayer("your_layer", srs, ogr.wkbPolygon)
那生成多边形后必须给几何也指定同样的SRS:
your_polygon_geom.AssignSpatialReference(srs)
3. Feature创建时未关联图层定义
一定要基于图层的定义来创建Feature,不能直接新建空的Feature对象,不然会和图层的字段不兼容。正确的写法是:
# 基于图层定义创建Feature feature_def = layer.GetLayerDefn() feature = ogr.Feature(feature_def)
4. 老版本GDAL的bug + 捕获异常看详情
GDAL 2.2.x确实存在一些CreateFeature()的小bug,比如内存管理相关的问题。如果上面的方法都没用,建议你把调用包在try-except里,打印出具体的异常信息,这样能精准定位问题:
try: layer.CreateFeature(feature) except Exception as e: print("CreateFeature异常详情:", str(e))
比如可能会提示“字段未赋值”或者“空间参考不匹配”之类的具体错误。
额外提醒
操作完记得及时释放资源,比如feature.Destroy()和ds.Destroy(),老版本GDAL的资源回收机制不太完善,可能会引发一些隐性问题。
内容的提问来源于stack exchange,提问作者Tehem
相关产品推荐
相关产品推荐

