Come aggiungere attributi di funzionalità personalizzati a Shapefile usando Python?


16

Sto cercando un modo per prendere un Shapefile esistente con un set di funzionalità di 200 paesi. Ogni caratteristica del Paese ha un attributo di "NOME". Il mio obiettivo è creare uno script Python che aggiunge un attributo arbitrario (per ora) aggiuntivo, ad esempio "POPOLAZIONE".

Ovviamente ho installato i moduli OSGeo e GeoDjango. Sono arrivato a:

 from osgeo import ogr

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

Mi manca una funzione OGR che mi permetterà di inserire i campi degli attributi Feature in un Shapefile esistente?

Risposte:


13

Credo che l' esempio dei poligoni di Assemble TIGER abbia quello che stai cercando:

# 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 )

Grazie, è solo qualcosa che conoscevi in ​​anticipo o l'hai trovato dopo aver cercato?
mattdeboard,

1
NP, conoscevo i campioni ma ne ho esaminati alcuni per trovare questo pezzo specifico.
Derek Swingley,

Ah ok, fantastico. Aspetterò fino a quando non sarò a casa e potrò provare ad implementarlo prima di contrassegnarlo come risposta, ma sembra buono.
Mattdeboard,

L'esempio sopra crea un nuovo shapefile. Quindi è necessario trasferire tutti gli altri campi e la geometria dall'esistente al nuovo file. Hai bisogno di un esempio che aggiunge un campo a uno shapefile esistente?
Klewis,

@ klewis- potresti volerlo fare come una domanda sulla domanda originale. Sono stato informato della tua risposta, ma non credo che lo sarà.
Derek Swingley,

10

È possibile aggiungere un campo a uno shapefile esistente 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)

3
Grazie. Per popolare e scrivere i dati, ho aggiunto questi: for feat in layer: feat.SetField ('Name', 'myname') layer.SetFeature (feat) dataSource = None
Dave X
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.