Como adicionar atributos de recurso personalizados ao Shapefile usando Python?

16

Estou procurando uma maneira de usar um Shapefile existente que possua um conjunto de recursos de 200 países. Cada recurso do país tem um atributo "NAME". Meu objetivo é criar um script Python que adicione um atributo adicional arbitrário (por enquanto), como "POPULAÇÃO".

Claro que tenho os módulos OSGeo e GeoDjango instalados. Estou tão longe quanto:

 from osgeo import ogr

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

Estou faltando uma função OGR que permita inserir campos de atributo de Recurso em um Shapefile existente?

mattdeboard
fonte

Respostas:

13

Acredito que a amostra Assemble TIGER Polygons tem o que você está procurando:

# 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
fonte
Obrigado, isso é algo que você já conhecia anteriormente ou o encontrou após pesquisar?
mattdeboard
1
NP, eu conhecia as amostras, mas procurei algumas para encontrar essa peça específica.
Derek Swingley
Ah ok, ótimo. Vou esperar até que eu esteja em casa e tentar implementar isso antes de marcar isso como respondido, mas parece bom.
mattdeboard
O exemplo acima cria um novo shapefile. Em seguida, você deve transferir todos os outros campos e geometria do arquivo existente para o novo. Você precisa de um exemplo que adicione um campo a um shapefile existente?
21411 klewis
@ klewis- você pode fazer isso como uma pergunta sobre a pergunta original. Fui notificado da sua resposta, mas não acho que o OP será.
Derek Swingley
10

É possível adicionar um campo a um shapefile existente usando o 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
fonte
3
Obrigado. Para preencher e gravar os dados, eu os adicionei: para feat na camada: feat.SetField ('Name', 'myname') layer.SetFeature (feat) dataSource = None
Dave X