Comment ajouter des attributs de fonctionnalité personnalisés au fichier de formes à l'aide de Python?

16

Je cherche un moyen de prendre un Shapefile existant qui a un ensemble de fonctionnalités de 200 pays. Chaque fonctionnalité de pays a un attribut "NAME". Mon objectif est de créer un script Python qui ajoute un attribut supplémentaire arbitraire (pour l'instant), disons, "POPULATION".

Bien sûr, j'ai installé les modules OSGeo et GeoDjango. Je suis pour autant:

 from osgeo import ogr

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

Est-ce que je manque une fonction OGR qui me permettra d'insérer des champs d'attribut d'entité dans un fichier de formes existant?

mattdeboard
la source

Réponses:

13

Je crois que l' échantillon Assemble TIGER Polygons a ce que vous cherchez:

# 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
la source
Merci, est-ce juste quelque chose que vous connaissiez auparavant ou l'avez-vous trouvé après la recherche?
mattdeboard
1
NP, je connaissais les échantillons mais j'ai regardé à travers quelques-uns pour trouver cette pièce spécifique.
Derek Swingley
Ah ok, super. Je vais attendre jusqu'à ce que je sois chez moi et je peux essayer de l'implémenter avant de marquer cela comme répondu, mais ça a l'air bien.
mattdeboard
L'exemple ci-dessus crée un nouveau fichier de formes. Ensuite, vous devez transférer tous les autres champs et la géométrie d'un fichier existant vers un nouveau. Avez-vous besoin d'un exemple qui ajoute un champ à un fichier de formes existant?
klewis
@ klewis- vous voudrez peut-être poser cette question comme une question sur la question d'origine. J'ai été informé de votre réponse, mais je ne pense pas que le PO le sera.
Derek Swingley,
10

Est-il possible d'ajouter un champ à un fichier de formes existant en utilisant 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
la source
3
Merci. Pour remplir et écrire les données, j'ai ajouté celles-ci: pour l'exploit dans la couche: feat.SetField ('Name', 'myname') layer.SetFeature (feat) dataSource = None
Dave X