Bagaimana cara menambahkan atribut Fitur khusus ke Shapefile menggunakan Python?

16

Saya mencari cara untuk mengambil Shapefile yang ada yang memiliki serangkaian Fitur dari 200 negara. Setiap Fitur negara memiliki atribut "NAME." Tujuan saya adalah membuat skrip Python yang menambahkan atribut tambahan sembarang (untuk saat ini), katakan, "POPULASI".

Tentu saja saya sudah menginstal modul OSGeo dan GeoDjango. Saya sejauh:

 from osgeo import ogr

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

Apakah saya kehilangan fungsi OGR yang akan memungkinkan saya untuk memasukkan bidang atribut Fitur ke dalam Shapefile yang ada?

papan tulis
sumber

Jawaban:

13

Saya yakin sampel Assemble TIGER Polygons memiliki apa yang Anda cari:

# 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
sumber
Terima kasih, apakah ini hanya sesuatu yang Anda ketahui sebelumnya atau apakah Anda menemukannya setelah mencari?
mattdeboard
1
NP, saya tahu sampel tetapi melihat beberapa untuk menemukan bagian tertentu.
Derek Swingley
Ah baiklah, bagus. Saya akan menunggu sampai saya di rumah dan dapat mencoba menerapkan ini sebelum saya menandai ini sebagai jawaban, tetapi itu terlihat bagus.
mattdeboard
Contoh di atas membuat shapefile baru. Maka Anda harus mentransfer semua bidang dan geometri lainnya dari yang ada ke file baru. Apakah Anda memerlukan contoh yang menambahkan bidang ke shapefile yang ada?
klewis
@ klewis- Anda mungkin ingin menanyakan ini sebagai pertanyaan pada pertanyaan awal. Saya telah diberitahu tanggapan Anda tetapi saya tidak berpikir OP akan.
Derek Swingley
10

Apakah mungkin untuk menambahkan bidang ke shapefile yang ada menggunakan 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
sumber
3
Terima kasih. Untuk mengisi dan menulis data, saya menambahkan ini: untuk feat di layer: feat.SetField ('Name', 'myname') layer.SetFeature (feat) dataSource = Tidak Ada
Dave X