Wie füge ich mit Python benutzerdefinierte Feature-Attribute zu Shapefile hinzu?

16

Ich suche nach einer Möglichkeit, ein vorhandenes Shapefile mit einem Feature-Set von 200 Ländern zu übernehmen. Jedes Länder-Feature hat das Attribut "NAME". Mein Ziel ist es, ein Python-Skript zu erstellen, das ein (vorerst) beliebiges zusätzliches Attribut hinzufügt, beispielsweise "POPULATION".

Natürlich habe ich die Module OSGeo und GeoDjango installiert. Ich bin so weit wie:

 from osgeo import ogr

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

Fehlt mir eine OGR-Funktion, mit der ich Feature-Attributfelder in ein vorhandenes Shapefile einfügen kann?

Mattscheibe
quelle

Antworten:

13

Ich glaube, die Assemble TIGER Polygons- Probe hat das, wonach Sie suchen:

# 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
quelle
Danke, war das nur etwas, mit dem Sie vorher vertraut waren, oder haben Sie es nach der Suche gefunden?
Mattdeboard
1
NP, ich wusste von den Samples, habe aber ein paar durchgesehen, um dieses spezielle Stück zu finden.
Derek Swingley
Ah ok, großartig. Ich werde warten, bis ich zu Hause bin, und kann versuchen, dies umzusetzen, bevor ich dies als beantwortet markiere, aber es sieht gut aus.
Mattdeboard
Das obige Beispiel erstellt ein neues Shapefile. Anschließend müssen Sie alle anderen Felder und Geometrien von der vorhandenen in die neue Datei übertragen. Benötigen Sie ein Beispiel, das einem vorhandenen Shapefile ein Feld hinzufügt?
Klewis
@klewis- Vielleicht möchten Sie dies als Frage zur ursprünglichen Frage stellen. Ich wurde über Ihre Antwort informiert, glaube aber nicht, dass dies der Fall sein wird.
Derek Swingley
10

Ist es möglich, mit Python OGR ein Feld zu einem vorhandenen Shapefile hinzuzufügen?

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
quelle
3
Vielen Dank. Um die Daten zu füllen und zu schreiben, habe ich diese hinzugefügt: für feat in layer: feat.SetField ('Name', 'myname') layer.SetFeature (feat) dataSource = Keine
Dave X