我有一个Python脚本,可以将属性字段添加到Shapefile(如果不存在)。使用ArcGIS可以很容易地做到这一点(通过图形方式或通过Python),但是我正在寻找不依赖于ArcGIS的东西。

由于我的Shapefile包含功能,因此我尝试使用OGR失败。

我看过pyshp,但是类似地,在创建架构后也无法修改它。我还没有尝试使用shapefile(对于Python),但是我没有看到此功能的广告。我也看不到如何通过dbfpy修补DBF文件来实现。

有人有什么想法吗?

评论

克隆现有的shapefile结构,添加一个新列,然后根据原始shapefile填充它是否可以接受?

使用Python将自定义要素属性添加到ESRI Shapefile的可能重复项

该问题应作为gis.stackexchange.com/q/3623/664的副本关闭。

是的,基本相同。我看了看,但没看到。

#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)。非常感谢您的帮助,对于未能彻底检查其他类似问题,我们深表歉意。