如何在没有ArcGIS的情况下通过Python将属性字段添加到现有Shapefile?


24

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

我用OGR 尝试失败,因为我的Shapefile 包含features

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

有人有什么想法吗?


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


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

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

Answers:




4

由于一种相当麻烦的格式,称为DBF,如果不重写DBF或向DBF添加填充,则无法将具有现有属性数据的字段添加到shapefile中。我不知道现成的解决方案,但是我要做的是编写一个脚本,根据现有脚本创建一个新的shapefile,并将额外的字段添加到新的shapefile中。然后将几何图形/属性数据从旧的复制到新的shapefile。最后,删除旧的shapefile,然后重命名新的shapefile。使用OGR python绑定可以轻松完成所有这些操作。

或者,您可以使用dbfpy仅对DBF文件执行上述操作。步骤顺序保持不变:

  1. 创建具有与原始结构相同的新DBF
  2. 在新的DBF中创建新的属性字段
  3. 将数据从原始DBF复制到新DBF
  4. 删除旧的DBF,将新的DBF重命名为旧的DBF

您不需要对shapefile(.shp)本身或任何其他文件进行任何更改,因为它们不引用DBF中包含的属性信息。但是,您确实需要使新旧DBF中的记录顺序完全相同。


3

DBFpy应该为此工作。您是否看到过此页面上的示例:

http://dbfpy.sourceforge.net/

确保shapefile当时未被其他任何应用程序(包括ArcGIS)编辑,因为这可能会导致锁定问题。


如果您在DBF文件中已经有数据,我认为这行不通。我以前看过它,但是收到一个错误:“至少添加了一条记录,无法更改结构”。您有什么具体的例子吗?
Mike T

嗯,我现在记得是的,因为Sasa表示需要创建一个新的DBF。复制架构(如在字段等中),然后进行添加,然后复制记录。“伟大的” DBF ... :(
罗布·克拉克

@Mike当您只想添加一个字段时,如何添加记录?添加记录是一个错误,因为它破坏了属性和形状之间的连接。添加字段完全没有害处。 任何可以编辑dbf文件的库都可以正常工作。
ub

@whuber:那是他们的错误信息。打开具有数据的现有dbf,然后查看:from dbfpy import dbf; db = dbf.Dbf('my.dbf'); db.addField(("FOO", "C", 15))
Mike T

@Mike感谢您澄清情况。这听起来像是dbfpy中不必要的限制的结果:-(。查找其他dBase库或使用其他软件;-)。
ub

1

我找到了使用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)。非常感谢您的帮助,对于无法彻底检查其他类似问题,我们深表歉意。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.