¿Cómo agregar atributos de funciones personalizados a Shapefile usando Python?

15

Estoy buscando una manera de tomar un Shapefile existente que tenga un conjunto de características de 200 países. La característica de cada país tiene un atributo de "NOMBRE". Mi objetivo es crear un script Python que agregue un atributo adicional arbitrario (por ahora), por ejemplo, "POBLACIÓN".

Por supuesto que tengo los módulos OSGeo y GeoDjango instalados. Estoy tan lejos como:

 from osgeo import ogr

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

¿Falta una función OGR que me permita insertar campos de atributo de Característica en un Shapefile existente?

    
pregunta mattdeboard 18.11.2010 - 16:00

2 respuestas

12

Creo que la muestra Assemble TIGER Polygons tiene lo que ' buscando:

# 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 )
    
respondido por el Derek Swingley 18.11.2010 - 19:12
10

¿Es posible agregar un campo a un shapefile existente con Python OGR ..

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)
    
respondido por el Dave 02.12.2012 - 00:10

Lea otras preguntas en las etiquetas