由于我的Shapefile包含功能,因此我尝试使用OGR失败。
我看过pyshp,但是类似地,在创建架构后也无法修改它。我还没有尝试使用shapefile(对于Python),但是我没有看到此功能的广告。我也看不到如何通过dbfpy修补DBF文件来实现。
有人有什么想法吗?
#1 楼
您应该先看看这些问题,因为它已经被回答了:如何使用Python向Shapefile添加自定义要素属性?
https://stackoverflow.com/questions/4215658/将自定义功能特征添加到带有python的esri形文件中
如果结果是仅一个shapefile,只需在脚本末尾删除输入文件即可。 >
评论
这也类似于gis.stackexchange.com/questions/3623/…感谢您的研究
– Mike T
2011-3-18在22:13
#2 楼
多亏了一种让人脑筋急转弯的格式,称为DBF,如果不重写DBF或向DBF添加填充,则无法将具有现有属性数据的字段添加到shapefile中。我不知道现成的解决方案,但是我要做的是编写一个脚本,根据现有脚本创建一个新的shapefile,并将额外的字段添加到新的shapefile中。然后将几何图形/属性数据从旧的复制到新的shapefile。最后,删除旧的shapefile,然后重命名新的shapefile。使用OGR python绑定可以很容易地完成所有这些操作。或者,您可以使用dbfpy对DBF文件执行上述操作。步骤顺序保持不变:创建与原始结构相同的新DBF
在新DBF中创建新属性字段
将数据从原始DBF复制到新的DBF
删除旧的DBF,将新的DBF重命名为旧的DBF
您不需要对shapefile(.shp)本身或任何其他文件进行任何更改,因为它们不要引用DBF中包含的属性信息。但是,您确实需要在新旧DBF中保持记录顺序完全相同。
#3 楼
这是一个解决方案。迟到总比不到好:
http://geospatialpython.com/2013/04/add-field-to-existing-shapefile.html?m=1
#4 楼
DBFpy应该为此工作。您是否看到过此页面上的示例:http://dbfpy.sourceforge.net/
确保shapefile未被包括ArcGIS在内的任何其他应用程序编辑当时可能会导致锁定问题。
评论
如果您在DBF文件中已经有数据,我认为这行不通。我之前看过它,但是收到一个错误:“至少添加了一条记录,无法更改结构”。您有什么具体的例子吗?
– Mike T
2011年3月18日在11:18
啊,我现在记得是的,因为Sasa表示需要创建一个新的DBF。复制架构(如在字段等中),然后进行添加,然后复制记录。 “伟大的” DBF ... :(
–罗布·克拉克(Rob Clark)
2011年3月18日在13:46
@Mike当您只想添加一个字段时,如何添加记录?添加记录是一个错误,因为它破坏了属性和形状之间的连接。添加字段完全没有害处。任何可以编辑dbf文件的库都可以正常工作。
– hu
2011-3-18在15:23
@whuber:那是他们的错误信息。打开一个具有数据的现有dbf,然后查看:from dbfpy import dbf; db = dbf.Dbf('my.dbf'); db.addField((“ FOO”,“ C”,15))
– Mike T
2011-3-18在21:52
@Mike感谢您澄清情况。这听起来像是dbfpy中不必要的限制的结果:-(。我可以猜出原因:在非空数据库中添加字段要求对所有记录进行物理读取,扩展和重新写回。一个好的解决方案是查找其他dBase库或使用其他软件;-)。
– hu
2011年3月18日在22:08
#5 楼
我找到了使用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)
。非常感谢您的帮助,对于未能彻底检查其他类似问题,我们深表歉意。
评论
克隆现有的shapefile结构,添加一个新列,然后根据原始shapefile填充它是否可以接受?使用Python将自定义要素属性添加到ESRI Shapefile的可能重复项
该问题应作为gis.stackexchange.com/q/3623/664的副本关闭。
是的,基本相同。我看了看,但没看到。