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?

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 )

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)

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.