如何使用Python将自定义特征属性添加到Shapefile?


16

我正在寻找采用具有200个国家/地区功能集的现有Shapefile的方法。每个国家/地区要素的属性均为“ NAME”。我的目标是创建一个Python脚本,该脚本添加一个任意(现在)的附加属性,例如“ POPULATION”。

当然,我已经安装了OSGeo和GeoDjango模块。我到:

 from osgeo import ogr

    infile = ogr.Open('sample.shp', 1) #'sample.shp' is a pre-existing ESRI shapefile described above
    inlyr = ogr.GetLayerByIndex(0)

我是否缺少OGR函数,该函数无法将Feature属性字段插入到现有的Shapefile中?

Answers:


13

我相信“ 组装老虎”多边形示例具有您所需要的:

# Open the datasource to operate on.

ds = ogr.Open( infile, update = 0 )

poly_layer = ds.GetLayerByName( 'Polygon' )

#############################################################################
#   Create output file for the composed polygons.

nad83 = osr.SpatialReference()
nad83.SetFromUserInput('NAD83')

shp_driver = ogr.GetDriverByName( 'ESRI Shapefile' )
shp_driver.DeleteDataSource( outfile )

shp_ds = shp_driver.CreateDataSource( outfile )

shp_layer = shp_ds.CreateLayer( 'out', geom_type = ogr.wkbPolygon,
                                srs = nad83 )

src_defn = poly_layer.GetLayerDefn()
poly_field_count = src_defn.GetFieldCount()

for fld_index in range(poly_field_count):
    src_fd = src_defn.GetFieldDefn( fld_index )

    fd = ogr.FieldDefn( src_fd.GetName(), src_fd.GetType() )
    fd.SetWidth( src_fd.GetWidth() )
    fd.SetPrecision( src_fd.GetPrecision() )
    shp_layer.CreateField( fd )

谢谢,这只是您之前熟悉的东西,还是在搜索后找到的?
mattdeboard

1
NP,我知道这些样本,但仔细检查了几个样本,找到了这个特定的样本。
Derek Swingley,2010年

好的,很好。我要等到我在家时才能尝试实现此目的,然后再将其标记为已回答,但是看起来不错。
mattdeboard

上面的示例创建一个新的shapefile。然后,您必须将所有其他字段和几何图形从现有文件传输到新文件。您是否需要一个将字段添加到现有shapefile的示例?
klewis 2011年

@ klewis-您可能想问这个问题作为原始问题。我们已收到您的回复,但我认为OP不会。
Derek Swingley,2011年

10

是否可以使用Python OGR将字段添加到现有shapefile中。

from osgeo import ogr
driver = ogr.GetDriverByName('ESRI Shapefile')
dataSource = driver.Open(“c:/test/Test2.shp”, 1) #1 is read/write

#define floating point field named DistFld and 16-character string field named Name:
fldDef = ogr.FieldDefn('DistFld', ogr.OFTReal)
fldDef2 = ogr.FieldDefn('Name', ogr.OFTString)
fldDef2.SetWidth(16) #16 char string width

#get layer and add the 2 fields:
layer = dataSource.GetLayer()
layer.CreateField(fldDef)
layer.CreateField(fldDef2)

3
谢谢。为了填充和写入数据,我添加了以下内容:对于feat层:feat.SetField('Name','myname')layer.SetFeature(feat)dataSource = None
Dave X
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.