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

16

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

Por supuesto que tengo instalados los módulos OSGeo y GeoDjango. 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)

¿Me estoy perdiendo una función OGR que me permitirá insertar campos de atributo Feature en un Shapefile existente?

Mattdeboard
fuente

Respuestas:

13

Creo que la muestra Assemble TIGER Polygons tiene lo que estás 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 )
Derek Swingley
fuente
Gracias, ¿es esto algo con lo que estaba familiarizado de antemano o lo encontró después de buscar?
mattdeboard
1
NP, conocía las muestras pero busqué algunas para encontrar esta pieza específica.
Derek Swingley
Ah ok, genial. Voy a esperar hasta que esté en casa y puedo intentar implementar esto antes de marcarlo como respondido, pero se ve bien.
mattdeboard
El ejemplo anterior crea un nuevo archivo de forma. Luego debe transferir todos los demás campos y geometría del archivo existente al nuevo. ¿Necesita un ejemplo que agregue un campo a un archivo de forma existente?
klewis
@ klewis- es posible que desee hacer esto como una pregunta sobre la pregunta original. Me notificaron su respuesta, pero no creo que el OP lo sea.
Derek Swingley
10

¿Es posible agregar un campo a un archivo de forma existente usando 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)
Dave
fuente
3
Gracias. Para completar y escribir los datos, agregué estos: for feat en layer: feat.SetField ('Name', 'myname') layer.SetFeature (feat) dataSource = None
Dave X