我有一个Python脚本,可以将属性字段添加到Shapefile(如果不存在)。使用ArcGIS可以很容易地做到这一点(通过图形方式或通过Python),但是我正在寻找不依赖于ArcGIS的东西。
我用OGR 尝试失败,因为我的Shapefile 包含features。
我看过pyshp,但是类似地,创建架构后也无法修改架构。我还没有尝试使用shapefile(对于Python),但是我没有看到此功能的广告。我也看不到如何通过dbfpy修补DBF文件来完成此操作。
有人有什么想法吗?
我有一个Python脚本,可以将属性字段添加到Shapefile(如果不存在)。使用ArcGIS可以很容易地做到这一点(通过图形方式或通过Python),但是我正在寻找不依赖于ArcGIS的东西。
我用OGR 尝试失败,因为我的Shapefile 包含features。
我看过pyshp,但是类似地,创建架构后也无法修改架构。我还没有尝试使用shapefile(对于Python),但是我没有看到此功能的广告。我也看不到如何通过dbfpy修补DBF文件来完成此操作。
有人有什么想法吗?
Answers:
您应该对这些问题有所了解,因为已经回答了: 如何使用Python向Shapefile添加自定义Feature属性?
/programming/4215658/adding-custom-feature-attributes-to-esri-shapefile-with-python
如果只需要一个shapefile,只需在脚本末尾删除输入文件即可。
由于一种相当麻烦的格式,称为DBF,如果不重写DBF或向DBF添加填充,则无法将具有现有属性数据的字段添加到shapefile中。我不知道现成的解决方案,但是我要做的是编写一个脚本,根据现有脚本创建一个新的shapefile,并将额外的字段添加到新的shapefile中。然后将几何图形/属性数据从旧的复制到新的shapefile。最后,删除旧的shapefile,然后重命名新的shapefile。使用OGR python绑定可以轻松完成所有这些操作。
或者,您可以使用dbfpy仅对DBF文件执行上述操作。步骤顺序保持不变:
您不需要对shapefile(.shp)本身或任何其他文件进行任何更改,因为它们不引用DBF中包含的属性信息。但是,您确实需要使新旧DBF中的记录顺序完全相同。
DBFpy应该为此工作。您是否看到过此页面上的示例:
确保shapefile当时未被其他任何应用程序(包括ArcGIS)编辑,因为这可能会导致锁定问题。
from dbfpy import dbf; db = dbf.Dbf('my.dbf'); db.addField(("FOO", "C", 15))
我找到了使用OGR的解决方案,并感谢上一个问题的帮助。这是一个完整的示例:
from osgeo import ogr
# Open a Shapefile, and get field names
source = ogr.Open('my.shp', update=True)
layer = source.GetLayer()
layer_defn = layer.GetLayerDefn()
field_names = [layer_defn.GetFieldDefn(i).GetName() for i in range(layer_defn.GetFieldCount())]
print len(field_names), 'MYFLD' in field_names
# Add a new field
new_field = ogr.FieldDefn('MYFLD', ogr.OFTInteger)
layer.CreateField(new_field)
# Close the Shapefile
source = None
我的问题是我使用了layer_defn.AddFieldDefn(new_field)
而不是layer.CreateField(new_field)
。非常感谢您的帮助,对于无法彻底检查其他类似问题,我们深表歉意。